From acebf5964c8d045beb417c70a67c9f9b4595e849 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 22 Oct 2021 11:49:14 -0400 Subject: [PATCH] Update actionbar strings to allow for pluralization. --- .../securesms/components/menu/ActionItem.kt | 2 +- .../components/menu/SignalBottomActionBar.kt | 4 +- .../components/menu/SignalContextMenu.kt | 2 +- .../ConversationListFragment.java | 41 +++++++------- .../MediaOverviewPageFragment.java | 29 +++++----- app/src/main/res/values/strings.xml | 54 +++++++++++++++---- 6 files changed, 84 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/menu/ActionItem.kt b/app/src/main/java/org/thoughtcrime/securesms/components/menu/ActionItem.kt index e71e752955..6cea68d872 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/menu/ActionItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/menu/ActionItem.kt @@ -8,6 +8,6 @@ import androidx.annotation.StringRes */ data class ActionItem( @DrawableRes val iconRes: Int, - @StringRes val titleRes: Int, + val title: CharSequence, val action: Runnable ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalBottomActionBar.kt b/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalBottomActionBar.kt index 9552246398..317565bc24 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalBottomActionBar.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalBottomActionBar.kt @@ -69,7 +69,7 @@ class SignalBottomActionBar(context: Context, attributeSet: AttributeSet) : Line view, ActionItem( iconRes = R.drawable.ic_more_horiz_24, - titleRes = R.string.SignalBottomActionBar_more, + title = context.getString(R.string.SignalBottomActionBar_more), action = { SignalContextMenu.Builder(view, parent as ViewGroup) .preferredHorizontalPosition(SignalContextMenu.HorizontalPosition.END) @@ -86,7 +86,7 @@ class SignalBottomActionBar(context: Context, attributeSet: AttributeSet) : Line val title: TextView = view.findViewById(R.id.signal_bottom_action_bar_item_title) icon.setImageResource(item.iconRes) - title.setText(item.titleRes) + title.text = item.title view.setOnClickListener { item.action.run() } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalContextMenu.kt b/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalContextMenu.kt index 62d53a8e6f..f3c6c6ce42 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalContextMenu.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalContextMenu.kt @@ -157,7 +157,7 @@ class SignalContextMenu private constructor( override fun bind(model: DisplayItem) { icon.setImageResource(model.item.iconRes) - title.setText(model.item.titleRes) + title.text = model.item.title itemView.setOnClickListener { model.item.action.run() dismiss() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index e0bd25d8b6..e85c9a3540 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -150,7 +150,6 @@ import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -1079,37 +1078,37 @@ public class ConversationListFragment extends MainFragment implements ActionMode if (!conversation.getThreadRecord().isArchived()) { if (conversation.getThreadRecord().isRead()) { - items.add(new ActionItem(R.drawable.ic_unread_24, R.string.ConversationListFragment_unread, () -> handleMarkAsUnread(id))); + items.add(new ActionItem(R.drawable.ic_unread_24, getResources().getQuantityString(R.plurals.ConversationListFragment_unread, 1), () -> handleMarkAsUnread(id))); } else { - items.add(new ActionItem(R.drawable.ic_read_24, R.string.ConversationListFragment_read, () -> handleMarkAsRead(id))); + items.add(new ActionItem(R.drawable.ic_read_24, getResources().getQuantityString(R.plurals.ConversationListFragment_read, 1), () -> handleMarkAsRead(id))); } if (conversation.getThreadRecord().isPinned()) { - items.add(new ActionItem(R.drawable.ic_unpin_24, R.string.ConversationListFragment_unpin, () -> handleUnpin(id))); + items.add(new ActionItem(R.drawable.ic_unpin_24, getResources().getQuantityString(R.plurals.ConversationListFragment_unpin, 1), () -> handleUnpin(id))); } else { - items.add(new ActionItem(R.drawable.ic_pin_24, R.string.ConversationListFragment_pin, () -> handlePin(Collections.singleton(conversation)))); + items.add(new ActionItem(R.drawable.ic_pin_24, getResources().getQuantityString(R.plurals.ConversationListFragment_pin, 1), () -> handlePin(Collections.singleton(conversation)))); } if (conversation.getThreadRecord().getRecipient().live().get().isMuted()) { - items.add(new ActionItem(R.drawable.ic_unmute_24, R.string.ConversationListFragment_unmute, () -> handleUnmute(Collections.singleton(conversation)))); + items.add(new ActionItem(R.drawable.ic_unmute_24, getResources().getQuantityString(R.plurals.ConversationListFragment_unmute, 1), () -> handleUnmute(Collections.singleton(conversation)))); } else { - items.add(new ActionItem(R.drawable.ic_mute_24, R.string.ConversationListFragment_mute, () -> handleMute(Collections.singleton(conversation)))); + items.add(new ActionItem(R.drawable.ic_mute_24, getResources().getQuantityString(R.plurals.ConversationListFragment_mute, 1), () -> handleMute(Collections.singleton(conversation)))); } } - items.add(new ActionItem(R.drawable.ic_select_24, R.string.ConversationListFragment_select, () -> { + items.add(new ActionItem(R.drawable.ic_select_24, getString(R.string.ConversationListFragment_select), () -> { defaultAdapter.initializeBatchMode(true); defaultAdapter.toggleConversationInBatchSet(conversation); startActionMode(); })); if (conversation.getThreadRecord().isArchived()) { - items.add(new ActionItem(R.drawable.ic_unarchive_24, R.string.ConversationListFragment_unarchive, () -> handleArchive(id, false))); + items.add(new ActionItem(R.drawable.ic_unarchive_24, getResources().getQuantityString(R.plurals.ConversationListFragment_unarchive, 1), () -> handleArchive(id, false))); } else { - items.add(new ActionItem(R.drawable.ic_archive_24, R.string.ConversationListFragment_archive, () -> handleArchive(id, false))); + items.add(new ActionItem(R.drawable.ic_archive_24, getResources().getQuantityString(R.plurals.ConversationListFragment_archive, 1), () -> handleArchive(id, false))); } - items.add(new ActionItem(R.drawable.ic_delete_24, R.string.ConversationListFragment_delete, () -> handleDelete(id))); + items.add(new ActionItem(R.drawable.ic_delete_24, getResources().getQuantityString(R.plurals.ConversationListFragment_delete, 1), () -> handleDelete(id))); new SignalContextMenu.Builder(view, list) .offsetX(ViewUtil.dpToPx(12)) @@ -1186,33 +1185,33 @@ public class ConversationListFragment extends MainFragment implements ActionMode List items = new ArrayList<>(); if (hasUnread) { - items.add(new ActionItem(R.drawable.ic_read_24, R.string.ConversationListFragment_read, () -> handleMarkAsRead(defaultAdapter.getBatchSelectionIds()))); + items.add(new ActionItem(R.drawable.ic_read_24, getResources().getQuantityString(R.plurals.ConversationListFragment_read, count), () -> handleMarkAsRead(defaultAdapter.getBatchSelectionIds()))); } else { - items.add(new ActionItem(R.drawable.ic_unread_24, R.string.ConversationListFragment_unread, () -> handleMarkAsUnread(defaultAdapter.getBatchSelectionIds()))); + items.add(new ActionItem(R.drawable.ic_unread_24, getResources().getQuantityString(R.plurals.ConversationListFragment_unread, count), () -> handleMarkAsUnread(defaultAdapter.getBatchSelectionIds()))); } if (!isArchived() && hasUnpinned && canPin) { - items.add(new ActionItem(R.drawable.ic_pin_24, R.string.ConversationListFragment_pin, () -> handlePin(defaultAdapter.getBatchSelection()))); + items.add(new ActionItem(R.drawable.ic_pin_24, getResources().getQuantityString(R.plurals.ConversationListFragment_pin, count), () -> handlePin(defaultAdapter.getBatchSelection()))); } else if (!isArchived() && !hasUnpinned) { - items.add(new ActionItem(R.drawable.ic_unpin_24, R.string.ConversationListFragment_unpin, () -> handleUnpin(defaultAdapter.getBatchSelectionIds()))); + items.add(new ActionItem(R.drawable.ic_unpin_24, getResources().getQuantityString(R.plurals.ConversationListFragment_unpin, count), () -> handleUnpin(defaultAdapter.getBatchSelectionIds()))); } if (isArchived()) { - items.add(new ActionItem(R.drawable.ic_unarchive_24, R.string.ConversationListFragment_unarchive, () -> handleArchive(defaultAdapter.getBatchSelectionIds(), true))); + items.add(new ActionItem(R.drawable.ic_unarchive_24, getResources().getQuantityString(R.plurals.ConversationListFragment_unarchive, count), () -> handleArchive(defaultAdapter.getBatchSelectionIds(), true))); } else { - items.add(new ActionItem(R.drawable.ic_archive_24, R.string.ConversationListFragment_archive, () -> handleArchive(defaultAdapter.getBatchSelectionIds(), true))); + items.add(new ActionItem(R.drawable.ic_archive_24, getResources().getQuantityString(R.plurals.ConversationListFragment_archive, count), () -> handleArchive(defaultAdapter.getBatchSelectionIds(), true))); } - items.add(new ActionItem(R.drawable.ic_delete_24, R.string.ConversationListFragment_delete, () -> handleDelete(defaultAdapter.getBatchSelectionIds()))); + items.add(new ActionItem(R.drawable.ic_delete_24, getResources().getQuantityString(R.plurals.ConversationListFragment_delete, count), () -> handleDelete(defaultAdapter.getBatchSelectionIds()))); if (hasUnmuted) { - items.add(new ActionItem(R.drawable.ic_mute_24, R.string.ConversationListFragment_mute, () -> handleMute(defaultAdapter.getBatchSelection()))); + items.add(new ActionItem(R.drawable.ic_mute_24, getResources().getQuantityString(R.plurals.ConversationListFragment_mute, count), () -> handleMute(defaultAdapter.getBatchSelection()))); } else { - items.add(new ActionItem(R.drawable.ic_unmute_24, R.string.ConversationListFragment_unmute, () -> handleUnmute(defaultAdapter.getBatchSelection()))); + items.add(new ActionItem(R.drawable.ic_unmute_24, getResources().getQuantityString(R.plurals.ConversationListFragment_unmute, count), () -> handleUnmute(defaultAdapter.getBatchSelection()))); } - items.add(new ActionItem(R.drawable.ic_select_24, R.string.ConversationListFragment_select_all, this::handleSelectAllThreads)); + items.add(new ActionItem(R.drawable.ic_select_24, getString(R.string.ConversationListFragment_select_all), this::handleSelectAllThreads)); bottomActionBar.setItems(items); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java index cfecef8a2d..07cab74e0b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java @@ -304,19 +304,7 @@ public final class MediaOverviewPageFragment extends Fragment actionMode = ((AppCompatActivity) activity).startSupportActionMode(actionModeCallback); ((MediaOverviewActivity) activity).onEnterMultiSelect(); ViewUtil.fadeIn(bottomActionBar, 250); - - bottomActionBar.setItems(Arrays.asList( - new ActionItem(R.drawable.ic_save_24, R.string.MediaOverviewActivity_save, () -> { - MediaActions.handleSaveMedia(MediaOverviewPageFragment.this, - getListAdapter().getSelectedMedia(), - this::exitMultiSelect); - }), - new ActionItem(R.drawable.ic_select_24, R.string.MediaOverviewActivity_select_all, this::handleSelectAllMedia), - new ActionItem(R.drawable.ic_delete_24, R.string.MediaOverviewActivity_delete, () -> { - MediaActions.handleDeleteMedia(requireContext(), getListAdapter().getSelectedMedia()); - exitMultiSelect(); - }) - )); + updateMultiSelect(); } private void exitMultiSelect() { @@ -328,6 +316,21 @@ public final class MediaOverviewPageFragment extends Fragment private void updateMultiSelect() { if (actionMode != null) { actionMode.setTitle(getActionModeTitle()); + + int selectionCount = getListAdapter().getSectionCount(); + + bottomActionBar.setItems(Arrays.asList( + new ActionItem(R.drawable.ic_save_24, getResources().getQuantityString(R.plurals.MediaOverviewActivity_save, selectionCount), () -> { + MediaActions.handleSaveMedia(MediaOverviewPageFragment.this, + getListAdapter().getSelectedMedia(), + this::exitMultiSelect); + }), + new ActionItem(R.drawable.ic_select_24, getString(R.string.MediaOverviewActivity_select_all), this::handleSelectAllMedia), + new ActionItem(R.drawable.ic_delete_24, getResources().getQuantityString(R.plurals.MediaOverviewActivity_delete, selectionCount), () -> { + MediaActions.handleDeleteMedia(requireContext(), getListAdapter().getSelectedMedia()); + exitMultiSelect(); + }) + )); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 10cd93ff6e..de59a37988 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -365,15 +365,43 @@ Moved %d conversations to inbox Read - Unread - Pin - Unpin - Mute - Unmute + + Read + Read + + + Unread + Unread + + + Pin + Pin + + + Unpin + Unpin + + + Mute + Mute + + + Unmute + Unmute + Select - Archive - Unarchive - Delete + + Archive + Archive + + + Unarchive + Unarchive + + + Delete + Delete + Select all %d selected @@ -944,9 +972,15 @@ Grid view List view Selected - Save Select all - Delete + + Save + Save + + + Delete + Delete + %1$d selected (%2$s)