diff --git a/build.gradle b/build.gradle index 991efa12a..aa649f673 100644 --- a/build.gradle +++ b/build.gradle @@ -132,6 +132,11 @@ android { jniLibs.srcDirs = ['libs'] } } + + androidResources { + generateLocaleConfig true + } + lint { abortOnError false } diff --git a/scripts/add-language.sh b/scripts/add-language.sh index 57fe38791..7e2afa573 100755 --- a/scripts/add-language.sh +++ b/scripts/add-language.sh @@ -19,7 +19,6 @@ cp $RES/values/strings.xml $RES/values-$LANG/strings.xml touch -t 201901010000 $RES/values-$LANG/strings.xml echo "$RES/values-$LANG/strings.xml added:" -echo "- add the name to $RES/values/arrays.xml" echo "- if needed, language mappings can be added to .tx/config" echo "- pull translations using ./scripts/tx-pull-translations.sh" echo " (on problems, 'tx -d pull' gives verbose output)" diff --git a/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index 632db8b69..2a0d9c562 100644 --- a/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -44,14 +44,13 @@ import org.thoughtcrime.securesms.notifications.InChatSounds; import org.thoughtcrime.securesms.notifications.NotificationCenter; import org.thoughtcrime.securesms.util.AndroidSignalProtocolLogger; -import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.Prefs; import org.thoughtcrime.securesms.util.SignalProtocolLoggerProvider; +import org.thoughtcrime.securesms.util.Util; import java.io.File; import java.util.concurrent.TimeUnit; -//import com.squareup.leakcanary.LeakCanary; public class ApplicationContext extends MultiDexApplication { private static final String TAG = ApplicationContext.class.getSimpleName(); @@ -191,19 +190,13 @@ public void onLinkPropertiesChanged(@NonNull android.net.Network network, LinkPr InChatSounds.getInstance(this); dcLocationManager = new DcLocationManager(this); - try { - DynamicLanguage.setContextLocale(this, DynamicLanguage.getSelectedLocale(this)); - } - catch (Exception e) { - e.printStackTrace(); - } - DynamicTheme.setDefaultDayNightMode(this); IntentFilter filter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED); registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + Util.localeChanged(); DcHelper.setStockTranslations(context); } }, filter); diff --git a/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java b/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java index 3898bb68e..6812b87b2 100644 --- a/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java @@ -117,8 +117,6 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin if (key.equals(Prefs.THEME_PREF)) { DynamicTheme.setDefaultDayNightMode(this); recreate(); - } else if (key.equals(Prefs.LANGUAGE_PREF)) { - finish(); } } diff --git a/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java b/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java index 487be89bb..25923e23c 100644 --- a/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java @@ -15,24 +15,19 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; -import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.Prefs; import java.lang.reflect.Field; -import java.util.Locale; public abstract class BaseActionBarActivity extends AppCompatActivity { private static final String TAG = BaseActionBarActivity.class.getSimpleName(); - public static final String LOCALE_EXTRA = "locale_extra"; - protected final DynamicLanguage dynamicLanguage = new DynamicLanguage(); protected DynamicTheme dynamicTheme = new DynamicTheme(); protected void onPreCreate() { dynamicTheme.onCreate(this); - dynamicLanguage.onCreate(this); } @Override @@ -49,14 +44,6 @@ protected void onResume() { super.onResume(); initializeScreenshotSecurity(); dynamicTheme.onResume(this); - dynamicLanguage.onResume(this); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - // on orientation changes locale is reset in the context/activity so set locale as onCreate() - dynamicLanguage.onCreate(this); } @Override @@ -121,18 +108,9 @@ protected T initFragment(@IdRes int target, protected T initFragment(@IdRes int target, @NonNull T fragment, - @Nullable Locale locale) - { - return initFragment(target, fragment, locale, null); - } - - protected T initFragment(@IdRes int target, - @NonNull T fragment, - @Nullable Locale locale, @Nullable Bundle extras) { Bundle args = new Bundle(); - args.putSerializable(LOCALE_EXTRA, locale); if (extras != null) { args.putAll(extras); diff --git a/src/main/java/org/thoughtcrime/securesms/BaseConversationListFragment.java b/src/main/java/org/thoughtcrime/securesms/BaseConversationListFragment.java index 71247d3c0..795d1e8b2 100644 --- a/src/main/java/org/thoughtcrime/securesms/BaseConversationListFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/BaseConversationListFragment.java @@ -41,7 +41,6 @@ import java.util.ArrayList; import java.util.HashSet; -import java.util.Locale; import java.util.Set; public abstract class BaseConversationListFragment extends Fragment implements ActionMode.Callback { @@ -92,11 +91,11 @@ protected void initializeFabClickListener(boolean isActionMode) { ArrayList uris = getSharedUris(getActivity()); String message; if (isForwarding(getActivity())) { - message = String.format(Locale.getDefault(), getString(R.string.ask_forward_multiple), selectedChats.size()); + message = String.format(Util.getLocale(), getString(R.string.ask_forward_multiple), selectedChats.size()); } else if (!uris.isEmpty()) { - message = String.format(Locale.getDefault(), getString(R.string.share_multiple_attachments_multiple_chats), uris.size(), selectedChats.size()); + message = String.format(Util.getLocale(), getString(R.string.share_multiple_attachments_multiple_chats), uris.size(), selectedChats.size()); } else { - message = String.format(Locale.getDefault(), getString(R.string.share_text_multiple_chats), selectedChats.size(), getSharedText(getActivity())); + message = String.format(Util.getLocale(), getString(R.string.share_text_multiple_chats), selectedChats.size(), getSharedText(getActivity())); } Context context = getContext(); if (context != null) { diff --git a/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java b/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java index c59d9a73e..c3341b380 100644 --- a/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java +++ b/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java @@ -9,14 +9,12 @@ import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; -import java.util.Locale; import java.util.Set; public interface BindableConversationItem extends Unbindable { void bind(@NonNull DcMsg messageRecord, @NonNull DcChat dcChat, @NonNull GlideRequests glideRequests, - @NonNull Locale locale, @NonNull Set batchSelected, @NonNull Recipient recipients, boolean pulseHighlight); diff --git a/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java b/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java index 6f391a0a4..188a38797 100644 --- a/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java +++ b/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java @@ -7,7 +7,6 @@ import org.thoughtcrime.securesms.database.model.ThreadRecord; import org.thoughtcrime.securesms.mms.GlideRequests; -import java.util.Locale; import java.util.Set; public interface BindableConversationListItem extends Unbindable { @@ -15,6 +14,6 @@ public interface BindableConversationListItem extends Unbindable { public void bind(@NonNull ThreadRecord thread, int msgId, @NonNull DcLot dcSummary, - @NonNull GlideRequests glideRequests, @NonNull Locale locale, + @NonNull GlideRequests glideRequests, @NonNull Set selectedThreads, boolean batchMode); } diff --git a/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java b/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java index 6b2fdf505..37a0e0e06 100644 --- a/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java @@ -32,7 +32,7 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity public void onCreate(Bundle bundle, boolean ready) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(R.string.pref_blocked_contacts); - initFragment(android.R.id.content, new BlockedAndShareContactsFragment(), null, getIntent().getExtras()); + initFragment(android.R.id.content, new BlockedAndShareContactsFragment(), getIntent().getExtras()); } @Override diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index a4cc20c5e..10acc7e6b 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -210,7 +210,7 @@ protected void onCreate(Bundle state, boolean ready) { getWindow().getDecorView().setBackgroundColor(color); - fragment = initFragment(R.id.fragment_content, new ConversationFragment(), dynamicLanguage.getCurrentLocale()); + fragment = initFragment(R.id.fragment_content, new ConversationFragment()); initializeActionBar(); initializeViews(); diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationAdapter.java b/src/main/java/org/thoughtcrime/securesms/ConversationAdapter.java index 384cea49d..98decb3cf 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationAdapter.java @@ -46,7 +46,6 @@ import java.util.Collections; import java.util.Date; import java.util.HashSet; -import java.util.Locale; import java.util.Map; import java.util.Set; @@ -66,7 +65,6 @@ public class ConversationAdapter { private static final int MAX_CACHE_SIZE = 40; - private static final String TAG = ConversationAdapter.class.getSimpleName(); private final Map> recordCache = Collections.synchronizedMap(new LRUCache>(MAX_CACHE_SIZE)); @@ -87,7 +85,6 @@ public class ConversationAdapter private final @Nullable ItemClickListener clickListener; private final @NonNull GlideRequests glideRequests; - private final @NonNull Locale locale; private final @NonNull Recipient recipient; private final @NonNull LayoutInflater inflater; private final @NonNull Context context; @@ -213,12 +210,10 @@ interface ItemClickListener extends BindableConversationItem.EventListener { public ConversationAdapter(@NonNull Context context, @NonNull DcChat dcChat, @NonNull GlideRequests glideRequests, - @NonNull Locale locale, @Nullable ItemClickListener clickListener, @NonNull Recipient recipient) { this.dcChat = dcChat; this.glideRequests = glideRequests; - this.locale = locale; this.clickListener = clickListener; this.recipient = recipient; this.context = context; @@ -243,7 +238,7 @@ public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { long elapsed = now - pulseHighlightingSince; boolean pulseHighlight = (positionCurrentlyPulseHighlighting == position && elapsed < PULSE_HIGHLIGHT_MILLIS); - holder.getItem().bind(getMsg(position), dcChat, glideRequests, locale, batchSelected, recipient, pulseHighlight); + holder.getItem().bind(getMsg(position), dcChat, glideRequests, batchSelected, recipient, pulseHighlight); } @Override @@ -374,7 +369,7 @@ public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent) { */ @Override public void onBindHeaderViewHolder(HeaderViewHolder viewHolder, int position) { - viewHolder.setText(DateUtils.getRelativeDate(getContext(), locale, getSortTimestamp(position))); + viewHolder.setText(DateUtils.getRelativeDate(getContext(), getSortTimestamp(position))); } diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index cb3793564..87fd5359e 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -76,7 +76,6 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.Locale; import java.util.Set; import java.util.Timer; import java.util.TimerTask; @@ -85,7 +84,6 @@ public class ConversationFragment extends MessageSelectorFragment { private static final String TAG = ConversationFragment.class.getSimpleName(); - private static final String KEY_LIMIT = "limit"; private static final int SCROLL_ANIMATION_THRESHOLD = 50; private static final int CODE_ADD_EDIT_CONTACT = 77; @@ -99,7 +97,6 @@ public class ConversationFragment extends MessageSelectorFragment private long chatId; private int startingPosition; private boolean firstLoad; - private Locale locale; private RecyclerView list; private RecyclerView.ItemDecoration lastSeenDecoration; private StickyHeaderDecoration dateDecoration; @@ -115,7 +112,6 @@ public class ConversationFragment extends MessageSelectorFragment @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - this.locale = (Locale) getArguments().getSerializable(PassphraseRequiredActionBarActivity.LOCALE_EXTRA); this.dcContext = DcHelper.getContext(getContext()); DcEventCenter eventCenter = DcHelper.getEventCenter(getContext()); @@ -285,7 +281,7 @@ private void initializeResources() { private void initializeListAdapter() { if (this.recipient != null && this.chatId != -1) { - ConversationAdapter adapter = new ConversationAdapter(getActivity(), this.recipient.getChat(), GlideApp.with(this), locale, selectionClickListener, this.recipient); + ConversationAdapter adapter = new ConversationAdapter(getActivity(), this.recipient.getChat(), GlideApp.with(this), selectionClickListener, this.recipient); list.setAdapter(adapter); if (dateDecoration != null) { diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java index 34d6ab91e..ff908166b 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java @@ -77,7 +77,6 @@ import org.thoughtcrime.securesms.util.views.Stub; import java.util.List; -import java.util.Locale; import java.util.Set; /** @@ -97,7 +96,6 @@ public class ConversationItem extends BaseConversationItem private static final int MAX_MEASURE_CALLS = 3; private DcContact dcContact; - private Locale locale; // Whether the sender's avatar and name should be shown (usually the case in group threads): private boolean showSender; private GlideRequests glideRequests; @@ -172,13 +170,11 @@ protected void onFinishInflate() { public void bind(@NonNull DcMsg messageRecord, @NonNull DcChat dcChat, @NonNull GlideRequests glideRequests, - @NonNull Locale locale, @NonNull Set batchSelected, @NonNull Recipient recipients, boolean pulseHighlight) { bind(messageRecord, dcChat, batchSelected, pulseHighlight, recipients); - this.locale = locale; this.glideRequests = glideRequests; this.showSender = (dcChat.isMultiUser() && !messageRecord.isOutgoing()) || messageRecord.getOverrideSenderName() != null; @@ -196,7 +192,7 @@ public void bind(@NonNull DcMsg messageRecord, setAuthor(messageRecord, showSender); setMessageSpacing(context); setReactions(messageRecord); - setFooter(messageRecord, locale); + setFooter(messageRecord); setQuote(messageRecord); if (Util.isTouchExplorationEnabled(context)) { setContentDescription(); @@ -748,7 +744,7 @@ private void setGutterSizes(@NonNull DcMsg current, boolean showSender) { } } - private void setFooter(@NonNull DcMsg current, @NonNull Locale locale) { + private void setFooter(@NonNull DcMsg current) { ViewUtil.updateLayoutParams(footer, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); footer.setVisibility(GONE); @@ -756,7 +752,7 @@ private void setFooter(@NonNull DcMsg current, @NonNull Locale locale) { ConversationItemFooter activeFooter = getActiveFooter(current); activeFooter.setVisibility(VISIBLE); - activeFooter.setMessageRecord(current, locale); + activeFooter.setMessageRecord(current); } private void setReactions(@NonNull DcMsg current) { diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java index 1e1e7aaa8..3c3d19d7c 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java @@ -175,7 +175,7 @@ protected void onCreate(Bundle icicle, boolean ready) { fragmentContainer = findViewById(R.id.fragment_container); Bundle bundle = new Bundle(); - conversationListFragment = initFragment(R.id.fragment_container, new ConversationListFragment(), dynamicLanguage.getCurrentLocale(), bundle); + conversationListFragment = initFragment(R.id.fragment_container, new ConversationListFragment(), bundle); initializeSearchListener(); @@ -384,7 +384,7 @@ public void onSearchTextChange(String text) { if (trimmed.length() > 0) { if (searchFragment == null) { - searchFragment = SearchFragment.newInstance(dynamicLanguage.getCurrentLocale()); + searchFragment = SearchFragment.newInstance(); getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, searchFragment, null) .commit(); diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListAdapter.java b/src/main/java/org/thoughtcrime/securesms/ConversationListAdapter.java index 176cdb0b9..3cfe66cce 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListAdapter.java @@ -35,7 +35,6 @@ import org.thoughtcrime.securesms.util.ViewUtil; import java.lang.ref.WeakReference; -import java.util.Locale; /** * A CursorAdapter for building a list of conversation threads. @@ -52,7 +51,6 @@ class ConversationListAdapter extends BaseConversationListAdapter selectedThreads, boolean batchMode) { - bind(thread, msgId, dcSummary, glideRequests, locale, selectedThreads, batchMode, null); + bind(thread, msgId, dcSummary, glideRequests, selectedThreads, batchMode, null); } public void bind(@NonNull ThreadRecord thread, int msgId, @NonNull DcLot dcSummary, @NonNull GlideRequests glideRequests, - @NonNull Locale locale, @NonNull Set selectedThreads, boolean batchMode, @Nullable String highlightSubstring) @@ -135,7 +133,7 @@ public void bind(@NonNull ThreadRecord thread, int unreadCount = thread.getUnreadCount(); if (highlightSubstring != null) { - this.fromView.setText(getHighlightedSpan(locale, recipient.getName(), highlightSubstring)); + this.fromView.setText(getHighlightedSpan(recipient.getName(), highlightSubstring)); } else { this.fromView.setText(recipient, state!=DcMsg.DC_STATE_IN_FRESH); } @@ -146,7 +144,7 @@ public void bind(@NonNull ThreadRecord thread, : ThemeUtil.getThemedColor(getContext(), R.attr.conversation_list_item_subject_color)); if (thread.getDate() > 0) { - CharSequence date = DateUtils.getBriefRelativeTimeSpanString(getContext(), locale, thread.getDate()); + CharSequence date = DateUtils.getBriefRelativeTimeSpanString(getContext(), thread.getDate()); dateView.setText(date); } else { @@ -176,16 +174,15 @@ public void bind(@NonNull ThreadRecord thread, public void bind(@NonNull DcContact contact, @NonNull GlideRequests glideRequests, - @NonNull Locale locale, @Nullable String highlightSubstring) { this.selectedThreads = Collections.emptySet(); Recipient recipient = new Recipient(getContext(), contact); this.glideRequests = glideRequests; - fromView.setText(getHighlightedSpan(locale, contact.getDisplayName(), highlightSubstring)); + fromView.setText(getHighlightedSpan(contact.getDisplayName(), highlightSubstring)); fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - subjectView.setText(getHighlightedSpan(locale, contact.getAddr(), highlightSubstring)); + subjectView.setText(getHighlightedSpan(contact.getAddr(), highlightSubstring)); dateView.setText(""); dateView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); archivedBadgeView.setVisibility(GONE); @@ -200,7 +197,6 @@ public void bind(@NonNull DcContact contact, public void bind(@NonNull DcMsg messageResult, @NonNull GlideRequests glideRequests, - @NonNull Locale locale, @Nullable String highlightSubstring) { DcContext dcContext = DcHelper.getContext(getContext()); @@ -211,11 +207,11 @@ public void bind(@NonNull DcMsg messageResult, fromView.setText(recipient, true); fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - subjectView.setText(getHighlightedSpan(locale, messageResult.getSummarytext(512), highlightSubstring)); + subjectView.setText(getHighlightedSpan(messageResult.getSummarytext(512), highlightSubstring)); long timestamp = messageResult.getTimestamp(); if(timestamp>0) { - dateView.setText(DateUtils.getBriefRelativeTimeSpanString(getContext(), locale, messageResult.getTimestamp())); + dateView.setText(DateUtils.getBriefRelativeTimeSpanString(getContext(), messageResult.getTimestamp())); } else { dateView.setText(""); @@ -311,8 +307,7 @@ private void setBgColor(ThreadRecord thread) { ta.recycle(); } - private Spanned getHighlightedSpan(@NonNull Locale locale, - @Nullable String value, + private Spanned getHighlightedSpan(@Nullable String value, @Nullable String highlight) { if (TextUtils.isEmpty(value)) { @@ -325,8 +320,8 @@ private Spanned getHighlightedSpan(@NonNull Locale locale, return new SpannableString(value); } - String normalizedValue = value.toLowerCase(locale); - String normalizedTest = highlight.toLowerCase(locale); + String normalizedValue = value.toLowerCase(Util.getLocale()); + String normalizedTest = highlight.toLowerCase(Util.getLocale()); List testTokens = Stream.of(normalizedTest.split(" ")).filter(s -> s.trim().length() > 0).toList(); Spannable spanned = new SpannableString(value); diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListItemInboxZero.java b/src/main/java/org/thoughtcrime/securesms/ConversationListItemInboxZero.java index f4c93b694..9d6bd3b2b 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListItemInboxZero.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListItemInboxZero.java @@ -14,7 +14,6 @@ import org.thoughtcrime.securesms.database.model.ThreadRecord; import org.thoughtcrime.securesms.mms.GlideRequests; -import java.util.Locale; import java.util.Set; public class ConversationListItemInboxZero extends LinearLayout implements BindableConversationListItem{ @@ -41,7 +40,7 @@ public void unbind() { } @Override - public void bind(@NonNull ThreadRecord thread, int msgId, @NonNull DcLot dcSummary, @NonNull GlideRequests glideRequests, @NonNull Locale locale, @NonNull Set selectedThreads, boolean batchMode) { + public void bind(@NonNull ThreadRecord thread, int msgId, @NonNull DcLot dcSummary, @NonNull GlideRequests glideRequests, @NonNull Set selectedThreads, boolean batchMode) { } } diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationUpdateItem.java b/src/main/java/org/thoughtcrime/securesms/ConversationUpdateItem.java index 55997db08..89629b97e 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationUpdateItem.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationUpdateItem.java @@ -20,7 +20,6 @@ import org.thoughtcrime.securesms.util.JsonUtils; import java.io.ByteArrayInputStream; -import java.util.Locale; import java.util.Set; public class ConversationUpdateItem extends BaseConversationItem @@ -62,7 +61,6 @@ public void onFinishInflate() { public void bind(@NonNull DcMsg messageRecord, @NonNull DcChat dcChat, @NonNull GlideRequests glideRequests, - @NonNull Locale locale, @NonNull Set batchSelected, @NonNull Recipient conversationRecipient, boolean pulseUpdate) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationVideochatItem.java b/src/main/java/org/thoughtcrime/securesms/ConversationVideochatItem.java index 324780cd8..fdd86ac30 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationVideochatItem.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationVideochatItem.java @@ -24,7 +24,6 @@ import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; -import java.util.Locale; import java.util.Set; public class ConversationVideochatItem extends LinearLayout @@ -57,7 +56,6 @@ public void onFinishInflate() { public void bind(@NonNull DcMsg dcMsg, @NonNull DcChat dcChat, @NonNull GlideRequests glideRequests, - @NonNull Locale locale, @NonNull Set batchSelected, @NonNull Recipient conversationRecipient, boolean pulseUpdate) @@ -76,14 +74,14 @@ public void bind(@NonNull DcMsg dcMsg, contactPhoto.setAvatar(glideRequests, new Recipient(getContext(), dcContact), true); setSelected(batchSelected.contains(dcMsg)); - setFooter(dcMsg, locale); + setFooter(dcMsg); } - private void setFooter(@NonNull DcMsg dcMsg, @NonNull Locale locale) { + private void setFooter(@NonNull DcMsg dcMsg) { ViewUtil.updateLayoutParams(footer, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); footer.setVisibility(VISIBLE); - footer.setMessageRecord(dcMsg, locale); + footer.setMessageRecord(dcMsg); } @Override diff --git a/src/main/java/org/thoughtcrime/securesms/LocalHelpActivity.java b/src/main/java/org/thoughtcrime/securesms/LocalHelpActivity.java index 346b74195..7d0e8ed7d 100644 --- a/src/main/java/org/thoughtcrime/securesms/LocalHelpActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/LocalHelpActivity.java @@ -5,6 +5,8 @@ import android.view.Menu; import android.view.MenuItem; +import org.thoughtcrime.securesms.util.Util; + import java.io.InputStream; import java.util.Locale; @@ -25,7 +27,7 @@ protected void onCreate(Bundle state, boolean ready) { String helpPath = "help/LANG/help.html"; String helpLang = "en"; try { - Locale locale = dynamicLanguage.getCurrentLocale(); + Locale locale = Util.getLocale(); String appLang = locale.getLanguage(); String appCountry = locale.getCountry(); if (assetExists(helpPath.replace("LANG", appLang))) { diff --git a/src/main/java/org/thoughtcrime/securesms/LogViewActivity.java b/src/main/java/org/thoughtcrime/securesms/LogViewActivity.java index 4b6da2d17..93211a0d0 100644 --- a/src/main/java/org/thoughtcrime/securesms/LogViewActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/LogViewActivity.java @@ -30,7 +30,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.log_view_activity); - logViewFragment = new LogViewFragment(dynamicLanguage); + logViewFragment = new LogViewFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, logViewFragment); transaction.commit(); diff --git a/src/main/java/org/thoughtcrime/securesms/LogViewFragment.java b/src/main/java/org/thoughtcrime/securesms/LogViewFragment.java index 1143c4728..89b3b6117 100644 --- a/src/main/java/org/thoughtcrime/securesms/LogViewFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/LogViewFragment.java @@ -41,8 +41,8 @@ import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.notifications.FcmReceiveService; -import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.Prefs; +import org.thoughtcrime.securesms.util.Util; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -56,13 +56,9 @@ import java.util.Locale; public class LogViewFragment extends Fragment { - private static final String TAG = LogViewFragment.class.getSimpleName(); - private EditText logPreview; - private final @NonNull DynamicLanguage dynamicLanguage; - public LogViewFragment(DynamicLanguage dynamicLanguage) { - this.dynamicLanguage = dynamicLanguage; + public LogViewFragment() { } @Override @@ -252,10 +248,10 @@ private static String buildDescription(LogViewFragment fragment) { builder.append("reliableService=").append( Prefs.reliableService(context)).append("\n"); - Locale locale = fragment.dynamicLanguage.getCurrentLocale(); + Locale locale = Util.getLocale(); builder.append("lang=").append(locale.toString()).append("\n"); if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) { - boolean isRtl = DynamicLanguage.getLayoutDirection(context) == View.LAYOUT_DIRECTION_RTL; + boolean isRtl = Util.getLayoutDirection(context) == View.LAYOUT_DIRECTION_RTL; builder.append("rtl=").append(isRtl).append("\n"); } diff --git a/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java b/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java index acebb4995..21e879b2a 100644 --- a/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java @@ -156,7 +156,7 @@ private void initializeActionBar() { CharSequence relativeTimeSpan; if (mediaItem.date > 0) { - relativeTimeSpan = DateUtils.getExtendedRelativeTimeSpanString(this,dynamicLanguage.getCurrentLocale(), mediaItem.date); + relativeTimeSpan = DateUtils.getExtendedRelativeTimeSpanString(this, mediaItem.date); } else { relativeTimeSpan = getString(R.string.draft); } diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java b/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java index e238dbde8..4f32442bf 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java @@ -326,33 +326,28 @@ public Fragment getItem(int position) { fragment = new ProfileSettingsFragment(); args.putInt(ProfileSettingsFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId); args.putInt(ProfileSettingsFragment.CONTACT_ID_EXTRA, (contactId==0&&!isGlobalProfile())? -1 : contactId); - args.putSerializable(ProfileSettingsFragment.LOCALE_EXTRA, dynamicLanguage.getCurrentLocale()); break; case TAB_GALLERY: fragment = new ProfileGalleryFragment(); args.putInt(ProfileGalleryFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId); - args.putSerializable(ProfileGalleryFragment.LOCALE_EXTRA, dynamicLanguage.getCurrentLocale()); break; case TAB_AUDIO: fragment = new ProfileDocumentsFragment(); args.putInt(ProfileDocumentsFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId); args.putBoolean(ProfileDocumentsFragment.SHOW_AUDIO_EXTRA, true); - args.putSerializable(ProfileDocumentsFragment.LOCALE_EXTRA, dynamicLanguage.getCurrentLocale()); break; case TAB_WEBXDC: fragment = new ProfileDocumentsFragment(); args.putInt(ProfileDocumentsFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId); args.putBoolean(ProfileDocumentsFragment.SHOW_WEBXDC_EXTRA, true); - args.putSerializable(ProfileDocumentsFragment.LOCALE_EXTRA, dynamicLanguage.getCurrentLocale()); break; default: fragment = new ProfileDocumentsFragment(); args.putInt(ProfileGalleryFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId); - args.putSerializable(ProfileDocumentsFragment.LOCALE_EXTRA, dynamicLanguage.getCurrentLocale()); break; } diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileDocumentsAdapter.java b/src/main/java/org/thoughtcrime/securesms/ProfileDocumentsAdapter.java index 5aecf166f..46c20c6ec 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileDocumentsAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileDocumentsAdapter.java @@ -22,13 +22,11 @@ import java.util.Collections; import java.util.HashSet; -import java.util.Locale; import java.util.Set; class ProfileDocumentsAdapter extends StickyHeaderGridAdapter { private final Context context; - private final Locale locale; private final ItemClickListener itemClickListener; private final Set selected; @@ -60,11 +58,9 @@ private static class HeaderHolder extends StickyHeaderGridAdapter.HeaderViewHold ProfileDocumentsAdapter(@NonNull Context context, BucketedThreadMedia media, - Locale locale, ItemClickListener clickListener) { this.context = context; - this.locale = locale; this.media = media; this.itemClickListener = clickListener; this.selected = new HashSet<>(); @@ -86,7 +82,7 @@ public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int itemType) { @Override public void onBindHeaderViewHolder(StickyHeaderGridAdapter.HeaderViewHolder viewHolder, int section) { - ((HeaderHolder)viewHolder).textView.setText(media.getName(section, locale)); + ((HeaderHolder)viewHolder).textView.setText(media.getName(section)); } @Override @@ -135,7 +131,7 @@ else if (slide != null && slide.hasDocument()) { viewHolder.itemView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; }); viewHolder.itemView.setSelected(selected.contains(dcMsg)); - viewHolder.date.setText(DateUtils.getBriefRelativeTimeSpanString(context, locale, dcMsg.getTimestamp())); + viewHolder.date.setText(DateUtils.getBriefRelativeTimeSpanString(context, dcMsg.getTimestamp())); } @Override diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileDocumentsFragment.java b/src/main/java/org/thoughtcrime/securesms/ProfileDocumentsFragment.java index 054cf958d..9538a2362 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileDocumentsFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileDocumentsFragment.java @@ -31,7 +31,6 @@ import org.thoughtcrime.securesms.database.loaders.BucketedThreadMediaLoader; import org.thoughtcrime.securesms.util.ViewUtil; -import java.util.Locale; import java.util.Set; public class ProfileDocumentsFragment @@ -39,7 +38,6 @@ public class ProfileDocumentsFragment implements LoaderManager.LoaderCallbacks, ProfileDocumentsAdapter.ItemClickListener { - public static final String LOCALE_EXTRA = "locale_extra"; public static final String CHAT_ID_EXTRA = "chat_id"; public static final String SHOW_AUDIO_EXTRA = "show_audio"; public static final String SHOW_WEBXDC_EXTRA = "show_webxdc"; @@ -52,7 +50,6 @@ public class ProfileDocumentsFragment private boolean showWebxdc; protected int chatId; - protected Locale locale; @Override public void onCreate(Bundle bundle) { @@ -62,8 +59,6 @@ public void onCreate(Bundle bundle) { chatId = getArguments().getInt(CHAT_ID_EXTRA, -1); showAudio = getArguments().getBoolean(SHOW_AUDIO_EXTRA, false); showWebxdc = getArguments().getBoolean(SHOW_WEBXDC_EXTRA, false); - locale = (Locale)getArguments().getSerializable(LOCALE_EXTRA); - if (locale == null) throw new AssertionError(); getLoaderManager().initLoader(0, null, this); } @@ -78,7 +73,6 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, this.recyclerView.setAdapter(new ProfileDocumentsAdapter(getContext(), new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()), - locale, this)); this.recyclerView.setLayoutManager(gridManager); this.recyclerView.setHasFixedSize(true); diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileGalleryAdapter.java b/src/main/java/org/thoughtcrime/securesms/ProfileGalleryAdapter.java index 5bd775337..da6aab40e 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileGalleryAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileGalleryAdapter.java @@ -18,14 +18,12 @@ import java.util.Collections; import java.util.HashSet; -import java.util.Locale; import java.util.Set; class ProfileGalleryAdapter extends StickyHeaderGridAdapter { private final Context context; private final GlideRequests glideRequests; - private final Locale locale; private final ItemClickListener itemClickListener; private final Set selected; @@ -54,12 +52,10 @@ private static class HeaderHolder extends StickyHeaderGridAdapter.HeaderViewHold ProfileGalleryAdapter(@NonNull Context context, @NonNull GlideRequests glideRequests, BucketedThreadMedia media, - Locale locale, ItemClickListener clickListener) { this.context = context; this.glideRequests = glideRequests; - this.locale = locale; this.media = media; this.itemClickListener = clickListener; this.selected = new HashSet<>(); @@ -81,7 +77,7 @@ public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int itemType) { @Override public void onBindHeaderViewHolder(StickyHeaderGridAdapter.HeaderViewHolder viewHolder, int section) { - ((HeaderHolder)viewHolder).textView.setText(media.getName(section, locale)); + ((HeaderHolder)viewHolder).textView.setText(media.getName(section)); } @Override diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileGalleryFragment.java b/src/main/java/org/thoughtcrime/securesms/ProfileGalleryFragment.java index 6fa61d3da..cb1ad71a8 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileGalleryFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileGalleryFragment.java @@ -33,7 +33,6 @@ import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.util.ViewUtil; -import java.util.Locale; import java.util.Set; public class ProfileGalleryFragment @@ -41,7 +40,6 @@ public class ProfileGalleryFragment implements LoaderManager.LoaderCallbacks, ProfileGalleryAdapter.ItemClickListener { - public static final String LOCALE_EXTRA = "locale_extra"; public static final String CHAT_ID_EXTRA = "chat_id"; protected TextView noMedia; @@ -50,7 +48,6 @@ public class ProfileGalleryFragment private final ActionModeCallback actionModeCallback = new ActionModeCallback(); private int chatId; - private Locale locale; @Override public void onCreate(Bundle bundle) { @@ -58,8 +55,6 @@ public void onCreate(Bundle bundle) { dcContext = DcHelper.getContext(getContext()); chatId = getArguments().getInt(CHAT_ID_EXTRA, -1); - locale = (Locale)getArguments().getSerializable(LOCALE_EXTRA); - if (locale == null) throw new AssertionError(); getLoaderManager().initLoader(0, null, this); } @@ -75,7 +70,6 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, this.recyclerView.setAdapter(new ProfileGalleryAdapter(getContext(), GlideApp.with(this), new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()), - locale, this)); this.recyclerView.setLayoutManager(gridManager); this.recyclerView.setHasFixedSize(true); diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileSettingsAdapter.java b/src/main/java/org/thoughtcrime/securesms/ProfileSettingsAdapter.java index 09b8e9492..8e4396654 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileSettingsAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileSettingsAdapter.java @@ -26,7 +26,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; -import java.util.Locale; import java.util.Set; public class ProfileSettingsAdapter extends RecyclerView.Adapter @@ -37,7 +36,6 @@ public class ProfileSettingsAdapter extends RecyclerView.Adapter public static final int INFO_SEND_MESSAGE_BUTTON = 120; private final @NonNull Context context; - private final @NonNull Locale locale; private final @NonNull DcContext dcContext; private final @NonNull ArrayList itemData = new ArrayList<>(); @@ -87,13 +85,11 @@ static class ItemData { public ProfileSettingsAdapter(@NonNull Context context, @NonNull GlideRequests glideRequests, - @NonNull Locale locale, @Nullable ItemClickListener clickListener) { super(); this.context = context; this.glideRequests = glideRequests; - this.locale = locale; this.clickListener = clickListener; this.dcContext = DcHelper.getContext(context); this.layoutInflater = LayoutInflater.from(context); @@ -185,7 +181,7 @@ else if (holder.itemView instanceof ConversationListItem) { conversationListItem.bind(DcHelper.getThreadRecord(context, summary, chat), itemDataSharedChats.getMsgId(chatlistIndex), summary, glideRequests, - locale, Collections.emptySet(), false); + Collections.emptySet(), false); conversationListItem.setOnClickListener(view -> clickListener.onSharedChatClicked(chatId)); } else if(holder.itemView instanceof ProfileStatusItem) { @@ -329,7 +325,7 @@ else if (sharedChats!=null && dcContact!=null) { lastSeenTxt = context.getString(R.string.last_seen_unknown); } else { - lastSeenTxt = context.getString(R.string.last_seen_at, DateUtils.getExtendedTimeSpanString(context, locale, lastSeenTimestamp)); + lastSeenTxt = context.getString(R.string.last_seen_at, DateUtils.getExtendedTimeSpanString(context, lastSeenTimestamp)); } itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_LAST_SEEN, lastSeenTxt, 0, 0)); diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileSettingsFragment.java b/src/main/java/org/thoughtcrime/securesms/ProfileSettingsFragment.java index 8d9857438..e5e6649e4 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileSettingsFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileSettingsFragment.java @@ -39,12 +39,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Locale; public class ProfileSettingsFragment extends Fragment implements ProfileSettingsAdapter.ItemClickListener, DcEventCenter.DcEventDelegate { - public static final String LOCALE_EXTRA = "locale_extra"; public static final String CHAT_ID_EXTRA = "chat_id"; public static final String CONTACT_ID_EXTRA = "contact_id"; @@ -57,7 +55,6 @@ public class ProfileSettingsFragment extends Fragment private final ActionModeCallback actionModeCallback = new ActionModeCallback(); - private Locale locale; private DcContext dcContext; protected int chatId; private int contactId; @@ -70,8 +67,6 @@ protected ActionMode getActionMode() { public void onCreate(Bundle bundle) { super.onCreate(bundle); - locale = (Locale)getArguments().getSerializable(LOCALE_EXTRA); - if (locale == null) throw new AssertionError(); chatId = getArguments().getInt(CHAT_ID_EXTRA, -1); contactId = getArguments().getInt(CONTACT_ID_EXTRA, -1); dcContext = DcHelper.getContext(getContext()); @@ -80,7 +75,7 @@ public void onCreate(Bundle bundle) { @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.profile_settings_fragment, container, false); - adapter = new ProfileSettingsAdapter(getContext(), GlideApp.with(this), locale,this); + adapter = new ProfileSettingsAdapter(getContext(), GlideApp.with(this), this); list = ViewUtil.findById(view, R.id.recycler_view); list.setAdapter(adapter); diff --git a/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java b/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java index 2c8761f94..624ddbd6f 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java +++ b/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java @@ -17,8 +17,6 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.util.DateUtils; -import java.util.Locale; - public class ConversationItemFooter extends LinearLayout { private TextView dateView; @@ -58,8 +56,8 @@ private void init(@Nullable AttributeSet attrs) { } } - public void setMessageRecord(@NonNull DcMsg messageRecord, @NonNull Locale locale) { - presentDate(messageRecord, locale); + public void setMessageRecord(@NonNull DcMsg messageRecord) { + presentDate(messageRecord); secureIndicatorView.setVisibility(messageRecord.isSecure() ? View.VISIBLE : View.GONE); locationIndicatorView.setVisibility(messageRecord.hasLocation() ? View.VISIBLE : View.GONE); presentDeliveryStatus(messageRecord); @@ -72,14 +70,9 @@ private void setTextColor(int color) { deliveryStatusView.setTint(color); } - private void presentDate(@NonNull DcMsg messageRecord, @NonNull Locale locale) { + private void presentDate(@NonNull DcMsg messageRecord) { dateView.forceLayout(); -// if(messageRecord.hasDeviatingTimestamp()) { - dateView.setText(DateUtils.getExtendedRelativeTimeSpanString(getContext(), locale, messageRecord.getTimestamp())); -// } -// else { -// dateView.setText(DateUtils.getTimeOfDayTimeSpanString(getContext(), locale, messageRecord.getTimestamp())); -// } + dateView.setText(DateUtils.getExtendedRelativeTimeSpanString(getContext(), messageRecord.getTimestamp())); } private void presentDeliveryStatus(@NonNull DcMsg messageRecord) { diff --git a/src/main/java/org/thoughtcrime/securesms/database/loaders/BucketedThreadMediaLoader.java b/src/main/java/org/thoughtcrime/securesms/database/loaders/BucketedThreadMediaLoader.java index 91b58ba9a..2d9fd4eb4 100644 --- a/src/main/java/org/thoughtcrime/securesms/database/loaders/BucketedThreadMediaLoader.java +++ b/src/main/java/org/thoughtcrime/securesms/database/loaders/BucketedThreadMediaLoader.java @@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.connect.DcHelper; +import org.thoughtcrime.securesms.util.Util; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -20,7 +21,6 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.Locale; import java.util.Map; public class BucketedThreadMediaLoader extends AsyncTaskLoader { @@ -147,11 +147,11 @@ public DcMsg get(int section, int item) { else return OLDER.getItem(section - activeTimeBuckets.size(), item); } - public String getName(int section, Locale locale) { + public String getName(int section) { List activeTimeBuckets = Stream.of(TIME_SECTIONS).filter(timeBucket -> !timeBucket.isEmpty()).toList(); if (section < activeTimeBuckets.size()) return activeTimeBuckets.get(section).getName(); - else return OLDER.getName(section - activeTimeBuckets.size(), locale); + else return OLDER.getName(section - activeTimeBuckets.size()); } // tests should override this function to deliver a preset calendar. @@ -266,10 +266,10 @@ Date getSection(int section) { return keys.get(section); } - String getName(int section, Locale locale) { + String getName(int section) { Date sectionDate = getSection(section); - return new SimpleDateFormat("MMMM yyyy", locale).format(sectionDate); + return new SimpleDateFormat("MMMM yyyy", Util.getLocale()).format(sectionDate); } } } diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java index 5372c10e3..c3514cf26 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java @@ -10,11 +10,9 @@ import org.thoughtcrime.securesms.ApplicationPreferencesActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.connect.DcHelper; -import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.Prefs; import java.util.Arrays; -import java.util.Locale; public class AppearancePreferenceFragment extends ListSummaryPreferenceFragment { @@ -23,9 +21,7 @@ public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); this.findPreference(Prefs.THEME_PREF).setOnPreferenceChangeListener(new ListSummaryListener()); - this.findPreference(Prefs.LANGUAGE_PREF).setOnPreferenceChangeListener(new ListSummaryListener()); initializeListSummary((ListPreference)findPreference(Prefs.THEME_PREF)); - initializeListSummary((ListPreference)findPreference(Prefs.LANGUAGE_PREF)); this.findPreference(Prefs.BACKGROUND_PREF).setOnPreferenceClickListener(new BackgroundClickListener()); this.findPreference(Prefs.MESSAGE_BODY_TEXT_SIZE_PREF).setOnPreferenceChangeListener(new ListSummaryListener()); initializeListSummary((ListPreference) findPreference(Prefs.MESSAGE_BODY_TEXT_SIZE_PREF)); @@ -61,12 +57,6 @@ public void onResume() { public void onStop() { super.onStop(); getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener((ApplicationPreferencesActivity) getActivity()); - - // update the locale of the applicationContext so that the core gets the correct strings - // (for pending activities, the locale is updated by calling DynamicLanguage.onResume) - Context applicationContext = this.getActivity().getApplicationContext(); - DynamicLanguage.setContextLocale(applicationContext, DynamicLanguage.getSelectedLocale(applicationContext)); - DcHelper.setStockTranslations(applicationContext); } public static CharSequence getSummary(Context context) { @@ -84,25 +74,11 @@ public static CharSequence getSummary(Context context) { backgroundString = context.getString(R.string.custom); } - String[] languageEntries = context.getResources().getStringArray(R.array.language_entries); - String[] languageEntryValues = context.getResources().getStringArray(R.array.language_values); - int langIndex = Arrays.asList(languageEntryValues).indexOf(Prefs.getLanguage(context)); - if(langIndex==0) { - Locale locale = DynamicLanguage.getSelectedLocale(context); - String localeAbbr = locale.getLanguage(); - langIndex = Arrays.asList(languageEntryValues).indexOf(localeAbbr); - if(langIndex==-1 && localeAbbr.length()>2) { - langIndex = Arrays.asList(languageEntryValues).indexOf(localeAbbr.substring(0,2)); - } - } - if (langIndex == -1) langIndex = 0; - // adding combined strings as "Read receipt: %1$s, Screen lock: %1$s, " // makes things inflexible on changes and/or adds lot of additional works to programmers. // however, if needed, we can refine this later. return themeEntries[themeIndex] + ", " - + context.getString(R.string.pref_background) + " " + backgroundString + ", " - + languageEntries[langIndex]; + + context.getString(R.string.pref_background) + " " + backgroundString; } private class BackgroundClickListener implements Preference.OnPreferenceClickListener { diff --git a/src/main/java/org/thoughtcrime/securesms/qr/BackupReceiverFragment.java b/src/main/java/org/thoughtcrime/securesms/qr/BackupReceiverFragment.java index cbe05f27e..b965ed132 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/BackupReceiverFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/BackupReceiverFragment.java @@ -18,8 +18,8 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.connect.DcEventCenter; import org.thoughtcrime.securesms.connect.DcHelper; +import org.thoughtcrime.securesms.util.Util; -import java.util.Locale; public class BackupReceiverFragment extends Fragment implements DcEventCenter.DcEventDelegate { @@ -87,7 +87,7 @@ public void handleEvent(@NonNull DcEvent event) { } else if (permille <= 950 ) { percent = ((permille-100)*100)/850; percentMax = 100; - statusLineText = getString(R.string.transferring) + String.format(Locale.getDefault(), " %d%%", percent); + statusLineText = getString(R.string.transferring) + String.format(Util.getLocale(), " %d%%", percent); hideSameNetworkHint = true; } else if (permille < 1000) { statusLineText = "Finishing..."; // range not used, should not happen diff --git a/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java b/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java index 9244e3a2f..1b203b358 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java @@ -73,11 +73,11 @@ protected void onCreate(Bundle icicle) { switch(transferMode) { case SENDER_SHOW_QR: - initFragment(android.R.id.content, new BackupProviderFragment(), dynamicLanguage.getCurrentLocale(), icicle); + initFragment(android.R.id.content, new BackupProviderFragment(), icicle); break; case RECEIVER_SCAN_QR: - initFragment(android.R.id.content, new BackupReceiverFragment(), dynamicLanguage.getCurrentLocale(), icicle); + initFragment(android.R.id.content, new BackupReceiverFragment(), icicle); break; } diff --git a/src/main/java/org/thoughtcrime/securesms/qr/QrShowActivity.java b/src/main/java/org/thoughtcrime/securesms/qr/QrShowActivity.java index f3237d03e..bc0fa35a8 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/QrShowActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/QrShowActivity.java @@ -12,13 +12,11 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.connect.DcEventCenter; import org.thoughtcrime.securesms.connect.DcHelper; -import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; public class QrShowActivity extends AppCompatActivity { private final DynamicTheme dynamicTheme = new DynamicTheme(); - private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); public final static String CHAT_ID = "chat_id"; @@ -31,7 +29,6 @@ public class QrShowActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); dynamicTheme.onCreate(this); - dynamicLanguage.onCreate(this); setContentView(R.layout.activity_qr_show); fragment = (QrShowFragment)getSupportFragmentManager().findFragmentById(R.id.qrScannerFragment); @@ -78,7 +75,6 @@ public boolean onCreateOptionsMenu(Menu menu) { protected void onResume() { super.onResume(); dynamicTheme.onResume(this); - dynamicLanguage.onResume(this); } @Override diff --git a/src/main/java/org/thoughtcrime/securesms/search/SearchFragment.java b/src/main/java/org/thoughtcrime/securesms/search/SearchFragment.java index a292f69fd..7fa35f418 100644 --- a/src/main/java/org/thoughtcrime/securesms/search/SearchFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/search/SearchFragment.java @@ -36,7 +36,6 @@ import org.thoughtcrime.securesms.search.model.SearchResult; import org.thoughtcrime.securesms.util.StickyHeaderDecoration; -import java.util.Locale; import java.util.Set; /** @@ -46,7 +45,6 @@ public class SearchFragment extends BaseConversationListFragment implements SearchListAdapter.EventListener, DcEventCenter.DcEventDelegate { public static final String TAG = "SearchFragment"; - public static final String EXTRA_LOCALE = "locale"; private TextView noResultsView; private RecyclerView listView; @@ -55,11 +53,9 @@ public class SearchFragment extends BaseConversationListFragment private SearchViewModel viewModel; private SearchListAdapter listAdapter; private String pendingQuery; - private Locale locale; - public static SearchFragment newInstance(@NonNull Locale locale) { + public static SearchFragment newInstance() { Bundle args = new Bundle(); - args.putSerializable(EXTRA_LOCALE, locale); SearchFragment fragment = new SearchFragment(); fragment.setArguments(args); @@ -71,8 +67,6 @@ public static SearchFragment newInstance(@NonNull Locale locale) { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - this.locale = (Locale) getArguments().getSerializable(EXTRA_LOCALE); - viewModel = ViewModelProviders.of(this, (ViewModelProvider.Factory) new SearchViewModel.Factory(requireContext())).get(SearchViewModel.class); DcEventCenter eventCenter = DcHelper.getEventCenter(requireContext()); eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this); @@ -102,7 +96,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat listView = view.findViewById(R.id.search_list); fab = view.findViewById(R.id.fab); - listAdapter = new SearchListAdapter(getContext(), GlideApp.with(this), this, locale); + listAdapter = new SearchListAdapter(getContext(), GlideApp.with(this), this); listDecoration = new StickyHeaderDecoration(listAdapter, false, true); fab.setVisibility(View.GONE); diff --git a/src/main/java/org/thoughtcrime/securesms/search/SearchListAdapter.java b/src/main/java/org/thoughtcrime/securesms/search/SearchListAdapter.java index b29c66797..db334b7cc 100644 --- a/src/main/java/org/thoughtcrime/securesms/search/SearchListAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/search/SearchListAdapter.java @@ -24,7 +24,6 @@ import org.thoughtcrime.securesms.search.model.SearchResult; import org.thoughtcrime.securesms.util.StickyHeaderDecoration; -import java.util.Locale; import java.util.Set; class SearchListAdapter extends BaseConversationListAdapter @@ -36,7 +35,6 @@ class SearchListAdapter extends BaseConversationListAdapter selectedThreads, boolean batchMode, @Nullable String query) { DcContext dcContext = DcHelper.getContext(context); ThreadRecord threadRecord = DcHelper.getThreadRecord(context, chatlistItem.summary, dcContext.getChat(chatlistItem.chatId)); - root.bind(threadRecord, chatlistItem.msgId, chatlistItem.summary, glideRequests, locale, selectedThreads, batchMode, query); + root.bind(threadRecord, chatlistItem.msgId, chatlistItem.summary, glideRequests, selectedThreads, batchMode, query); root.setOnClickListener(view -> eventListener.onConversationClicked(chatlistItem)); root.setOnLongClickListener(view -> { eventListener.onConversationLongClicked(chatlistItem); @@ -226,20 +221,18 @@ void bind(Context context, void bind(@NonNull DcContact contactResult, @NonNull GlideRequests glideRequests, @NonNull EventListener eventListener, - @NonNull Locale locale, @Nullable String query) { - root.bind(contactResult, glideRequests, locale, query); + root.bind(contactResult, glideRequests, query); root.setOnClickListener(view -> eventListener.onContactClicked(contactResult)); } void bind(@NonNull DcMsg messageResult, @NonNull GlideRequests glideRequests, @NonNull EventListener eventListener, - @NonNull Locale locale, @Nullable String query) { - root.bind(messageResult, glideRequests, locale, query); + root.bind(messageResult, glideRequests, query); root.setOnClickListener(view -> eventListener.onMessageClicked(messageResult)); } diff --git a/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java b/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java index 530a6226d..60b5b912c 100644 --- a/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java +++ b/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java @@ -93,7 +93,7 @@ private synchronized void updateNotification() { private synchronized void handleStart(@NonNull Intent intent) { Entry entry = Entry.fromIntent(intent); - Log.i(TAG, String.format(Locale.US, "handleStart() %s", entry)); + Log.i(TAG, String.format(Locale.ENGLISH, "handleStart() %s", entry)); allActiveMessages.put(entry.id, entry); } @@ -240,7 +240,7 @@ private static Entry fromIntent(@NonNull Intent intent) { @Override public @NonNull String toString() { - return String.format(Locale.US, "ChannelId: %s Id: %d Progress: %d/%d %s", channelId, id, progress, progressMax, indeterminate ? "indeterminate" : "determinate"); + return String.format(Locale.ENGLISH, "ChannelId: %s Id: %d Progress: %d/%d %s", channelId, id, progress, progressMax, indeterminate ? "indeterminate" : "determinate"); } @Override diff --git a/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java b/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java index b1fb26e33..340eedfa3 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java +++ b/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java @@ -25,7 +25,6 @@ import java.text.SimpleDateFormat; import java.util.Date; -import java.util.Locale; import java.util.concurrent.TimeUnit; /** @@ -45,9 +44,9 @@ private static int convertDelta(final long millis, TimeUnit to) { return (int) to.convert(System.currentTimeMillis() - millis, TimeUnit.MILLISECONDS); } - private static String getFormattedDateTime(long time, String template, Locale locale) { - final String localizedPattern = getLocalizedPattern(template, locale); - String ret = new SimpleDateFormat(localizedPattern, locale).format(new Date(time)); + private static String getFormattedDateTime(long time, String template) { + final String localizedPattern = getLocalizedPattern(template); + String ret = new SimpleDateFormat(localizedPattern).format(new Date(time)); // having ".," in very common and known abbreviates as weekdays or month names is not needed, // looks ugly and makes the string longer than needed @@ -56,7 +55,7 @@ private static String getFormattedDateTime(long time, String template, Locale lo return ret; } - public static String getBriefRelativeTimeSpanString(final Context c, final Locale locale, final long timestamp) { + public static String getBriefRelativeTimeSpanString(final Context c, final long timestamp) { if (isWithin(timestamp, 1, TimeUnit.MINUTES)) { return c.getString(R.string.now); } else if (isWithin(timestamp, 1, TimeUnit.HOURS)) { @@ -66,15 +65,15 @@ public static String getBriefRelativeTimeSpanString(final Context c, final Local int hours = convertDelta(timestamp, TimeUnit.HOURS); return c.getResources().getQuantityString(R.plurals.n_hours, hours, hours); } else if (isWithin(timestamp, 6, TimeUnit.DAYS)) { - return getFormattedDateTime(timestamp, "EEE", locale); + return getFormattedDateTime(timestamp, "EEE"); } else if (isWithin(timestamp, 365, TimeUnit.DAYS)) { - return getFormattedDateTime(timestamp, "MMM d", locale); + return getFormattedDateTime(timestamp, "MMM d"); } else { - return getFormattedDateTime(timestamp, "MMM d, yyyy", locale); + return getFormattedDateTime(timestamp, "MMM d, yyyy"); } } - public static String getExtendedTimeSpanString(final Context c, final Locale locale, final long timestamp) { + public static String getExtendedTimeSpanString(final Context c, final long timestamp) { StringBuilder format = new StringBuilder(); if (DateUtils.isToday(timestamp)) {} else if (isWithin(timestamp, 6, TimeUnit.DAYS)) format.append("EEE "); @@ -84,22 +83,21 @@ public static String getExtendedTimeSpanString(final Context c, final Locale loc if (DateFormat.is24HourFormat(c)) format.append("HH:mm"); else format.append("hh:mm a"); - return getFormattedDateTime(timestamp, format.toString(), locale); + return getFormattedDateTime(timestamp, format.toString()); } - public static String getExtendedRelativeTimeSpanString(final Context c, final Locale locale, final long timestamp) { + public static String getExtendedRelativeTimeSpanString(final Context c, final long timestamp) { if (isWithin(timestamp, 1, TimeUnit.MINUTES)) { return c.getString(R.string.now); } else if (isWithin(timestamp, 1, TimeUnit.HOURS)) { int mins = (int)TimeUnit.MINUTES.convert(System.currentTimeMillis() - timestamp, TimeUnit.MILLISECONDS); return c.getResources().getQuantityString(R.plurals.n_minutes, mins, mins); } else { - return getExtendedTimeSpanString(c, locale, timestamp); + return getExtendedTimeSpanString(c, timestamp); } } public static String getRelativeDate(@NonNull Context context, - @NonNull Locale locale, long timestamp) { if (isToday(timestamp)) { @@ -107,15 +105,15 @@ public static String getRelativeDate(@NonNull Context context, } else if (isYesterday(timestamp)) { return context.getString(R.string.yesterday); } else { - return getFormattedDateTime(timestamp, "EEEE, MMMM d, yyyy", locale); + return getFormattedDateTime(timestamp, "EEEE, MMMM d, yyyy"); } } - private static String getLocalizedPattern(String template, Locale locale) { + private static String getLocalizedPattern(String template) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - return DateFormat.getBestDateTimePattern(locale, template); + return DateFormat.getBestDateTimePattern(Util.getLocale(), template); } else { - return new SimpleDateFormat(template, locale).toLocalizedPattern(); + return new SimpleDateFormat(template, Util.getLocale()).toLocalizedPattern(); } } diff --git a/src/main/java/org/thoughtcrime/securesms/util/DynamicLanguage.java b/src/main/java/org/thoughtcrime/securesms/util/DynamicLanguage.java deleted file mode 100644 index b3b017508..000000000 --- a/src/main/java/org/thoughtcrime/securesms/util/DynamicLanguage.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.thoughtcrime.securesms.util; - -import android.app.Activity; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; - -import androidx.core.os.ConfigurationCompat; -import androidx.core.view.ViewCompat; - -import android.text.TextUtils; -import android.util.Log; - -import java.util.Locale; - -public class DynamicLanguage { - - private static final String TAG = DynamicLanguage.class.getSimpleName(); - - private static final String DEFAULT = "zz"; - - private Locale currentLocale; - - public void onCreate(Activity activity) { - currentLocale = getSelectedLocale(activity); - setContextLocale(activity, currentLocale); - } - - public void onResume(Activity activity) { - if (!getSelectedLocale(activity).equals(currentLocale)) { - Intent intent = activity.getIntent(); - activity.finish(); - OverridePendingTransition.invoke(activity); - activity.startActivity(intent); - OverridePendingTransition.invoke(activity); - } - } - - public void updateServiceLocale(Service service) { - currentLocale = getSelectedLocale(service); - setContextLocale(service, currentLocale); - } - - public Locale getCurrentLocale() { - return currentLocale; - } - - public static int getLayoutDirection(Context context) { - if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) { - Configuration configuration = context.getResources().getConfiguration(); - return configuration.getLayoutDirection(); - } - return ViewCompat.LAYOUT_DIRECTION_LTR; - } - - public static void setContextLocale(Context context, Locale selectedLocale) { - Configuration configuration = context.getResources().getConfiguration(); - - if (!configuration.locale.equals(selectedLocale)) { - configuration.locale = selectedLocale; - if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) { - configuration.setLayoutDirection(selectedLocale); - } - context.getResources().updateConfiguration(configuration, - context.getResources().getDisplayMetrics()); - } - } - - private static Locale getActivityLocale(Activity activity) { - return activity.getResources().getConfiguration().locale; - } - - // Beware that Locale.getDefault() returns the locale the App was STARTED in, not the locale of the system. - // It just happens to be the same for the majority of use cases. - private static Locale getDefaultLocale() { - Locale locale = null; - try { - locale = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0); - } catch(Exception e) { - Log.e(TAG, "could not determine the system locale.", e); - } - return locale != null ? locale : Locale.getDefault(); - } - - public static Locale getSelectedLocale(Context context) { - String language[] = TextUtils.split(Prefs.getLanguage(context), "_"); - - if (language[0].equals(DEFAULT)) { - return getDefaultLocale(); - } else if (language.length == 2) { - return new Locale(language[0], language[1]); - } else { - return new Locale(language[0]); - } - } - - private static final class OverridePendingTransition { - static void invoke(Activity activity) { - activity.overridePendingTransition(0, 0); - } - } -} diff --git a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java index a32d0ccd4..8c7007a51 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java +++ b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java @@ -31,7 +31,6 @@ public class Prefs { public static final String DISABLE_PASSPHRASE_PREF = "pref_disable_passphrase"; public static final String THEME_PREF = "pref_theme"; - public static final String LANGUAGE_PREF = "pref_language"; public static final String BACKGROUND_PREF = "pref_chat_background"; private static final String DATABASE_ENCRYPTED_SECRET = "pref_database_encrypted_secret_"; // followed by account-id @@ -151,14 +150,6 @@ public static String getTheme(Context context) { return getStringPreference(context, THEME_PREF, DynamicTheme.systemThemeAvailable() ? DynamicTheme.SYSTEM : DynamicTheme.LIGHT); } - public static String getLanguage(Context context) { - return getStringPreference(context, LANGUAGE_PREF, "zz"); - } - - public static void setLanguage(Context context, String language) { - setStringPreference(context, LANGUAGE_PREF, language); - } - public static void setPromptedDozeMsgId(Context context, int msg_id) { setIntegerPreference(context, PROMPTED_DOZE_MSG_ID_PREF, msg_id); } diff --git a/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java b/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java index 26b758d58..e7e50d5fd 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java +++ b/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java @@ -261,7 +261,7 @@ private String sanitizeOutputFileName(@NonNull String fileName) { } else { String dir = getExternalPathForType(contentType); if (dir == null) { - throw new IOException(String.format(Locale.US, "Path for type: %s was not available", contentType)); + throw new IOException(String.format(Locale.ENGLISH, "Path for type: %s was not available", contentType)); } String outputFileName = fileName; diff --git a/src/main/java/org/thoughtcrime/securesms/util/Util.java b/src/main/java/org/thoughtcrime/securesms/util/Util.java index f13153ebe..8f742232b 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/Util.java +++ b/src/main/java/org/thoughtcrime/securesms/util/Util.java @@ -21,6 +21,8 @@ import android.content.ClipData; import android.content.ClipDescription; import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Color; import android.graphics.Typeface; import android.net.Uri; @@ -42,6 +44,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import androidx.core.os.ConfigurationCompat; +import androidx.core.view.ViewCompat; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.ComposeText; @@ -54,6 +58,7 @@ import java.io.OutputStream; import java.text.DecimalFormat; import java.util.Arrays; +import java.util.Locale; import java.util.Objects; import java.util.concurrent.CountDownLatch; @@ -357,4 +362,34 @@ public static boolean isTouchExplorationEnabled(Context context) { return false; } } + + private static Locale lastLocale = null; + + public synchronized static Locale getLocale() { + if (lastLocale == null) { + try { + lastLocale = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0); + } catch (Exception e) { + e.printStackTrace(); + } + if (lastLocale == null) { + // Locale.getDefault() returns the locale the App was STARTED in, not the locale of the system. + // It just happens to be the same for the majority of use cases. + lastLocale = Locale.getDefault(); + } + } + return lastLocale; + } + + public synchronized static void localeChanged() { + lastLocale = null; + } + + public static int getLayoutDirection(Context context) { + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) { + Configuration configuration = context.getResources().getConfiguration(); + return configuration.getLayoutDirection(); + } + return ViewCompat.LAYOUT_DIRECTION_LTR; + } } diff --git a/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java b/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java index ff6ffd3c8..9934cbaf3 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java +++ b/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java @@ -162,7 +162,7 @@ public static T inflate(@NonNull LayoutInflater inflater, @SuppressLint("RtlHardcoded") public static void setTextViewGravityStart(final @NonNull TextView textView, @NonNull Context context) { if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) { - if (DynamicLanguage.getLayoutDirection(context) == View.LAYOUT_DIRECTION_RTL) { + if (Util.getLayoutDirection(context) == View.LAYOUT_DIRECTION_RTL) { textView.setGravity(Gravity.RIGHT); } else { textView.setGravity(Gravity.LEFT); @@ -172,7 +172,7 @@ public static void setTextViewGravityStart(final @NonNull TextView textView, @No public static void mirrorIfRtl(View view, Context context) { if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1 && - DynamicLanguage.getLayoutDirection(context) == View.LAYOUT_DIRECTION_RTL) { + Util.getLayoutDirection(context) == View.LAYOUT_DIRECTION_RTL) { view.setScaleX(-1.0f); } } @@ -182,7 +182,7 @@ public static boolean isLtr(@NonNull View view) { } public static boolean isLtr(@NonNull Context context) { - return DynamicLanguage.getLayoutDirection(context) == ViewCompat.LAYOUT_DIRECTION_LTR; + return Util.getLayoutDirection(context) == ViewCompat.LAYOUT_DIRECTION_LTR; } public static boolean isRtl(@NonNull View view) { @@ -190,7 +190,7 @@ public static boolean isRtl(@NonNull View view) { } public static boolean isRtl(@NonNull Context context) { - return DynamicLanguage.getLayoutDirection(context) == ViewCompat.LAYOUT_DIRECTION_RTL; + return Util.getLayoutDirection(context) == ViewCompat.LAYOUT_DIRECTION_RTL; } public static int dpToPx(Context context, int dp) { diff --git a/src/main/res/resources.properties b/src/main/res/resources.properties new file mode 100644 index 000000000..35f1f9764 --- /dev/null +++ b/src/main/res/resources.properties @@ -0,0 +1,2 @@ +unqualifiedResLocale=en + diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml index ddede1752..645058fc7 100644 --- a/src/main/res/values/arrays.xml +++ b/src/main/res/values/arrays.xml @@ -1,108 +1,6 @@ - - - - - @string/def - Azeri - Bahasa Indonesia - Català - Čeština - Dansk - Deutsch - English - Español - Esperanto - Euskara - Français - Galego - Hrvatski - Italiano - Lietuvių kalba - Luri Bakhtiari - Magyar nyelv - Nederlands - Norsk Bokmål - Polski - Português - Português do Brasil - Română - Sardu - Shqip - Slovenčina - Suomi - Svenska - Tiếng Việt - Türkçe - Ελληνικά - Pусский - Српски - Українська - Български - العربیة - فارسی - کوردی - 日本語 - 한국어 - 简体中文 - 繁體中文 - ភាសាខ្មែរ - தமிழ் - తెలుగు - - - - zz - az - in - ca - cs - da - de - en - es - eo - eu - fr - gl - hr - it - lt - bqi - hu - nl - nb - pl - pt - pt_BR - ro - sc - sq - sk - fi - sv - vi - tr - el - ru - sr - uk - bg - ar - fa - ckb - ja - ko - zh_CN - zh_TW - km - ta - te - - @string/pref_light_theme diff --git a/src/main/res/xml-v29/preferences_appearance.xml b/src/main/res/xml-v29/preferences_appearance.xml index ecabb6f42..20d6fe80e 100644 --- a/src/main/res/xml-v29/preferences_appearance.xml +++ b/src/main/res/xml-v29/preferences_appearance.xml @@ -28,11 +28,4 @@ android:title="@string/pref_use_system_emoji" android:summary="@string/pref_use_system_emoji_explain" /> - - diff --git a/src/main/res/xml/preferences_appearance.xml b/src/main/res/xml/preferences_appearance.xml index 961b22922..a0f88a239 100644 --- a/src/main/res/xml/preferences_appearance.xml +++ b/src/main/res/xml/preferences_appearance.xml @@ -28,11 +28,4 @@ android:title="@string/pref_use_system_emoji" android:summary="@string/pref_use_system_emoji_explain" /> - -