Update actionbar strings to allow for pluralization.

This commit is contained in:
Greyson Parrelli
2021-10-22 11:49:14 -04:00
parent ec2e3e29c3
commit acebf5964c
6 changed files with 84 additions and 48 deletions

View File

@@ -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
)

View File

@@ -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() }
}
}

View File

@@ -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()

View File

@@ -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<ActionItem> 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);
}

View File

@@ -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();
})
));
}
}

View File

@@ -365,15 +365,43 @@
<item quantity="other">Moved %d conversations to inbox</item>
</plurals>
<string name="ConversationListFragment_read">Read</string>
<string name="ConversationListFragment_unread">Unread</string>
<string name="ConversationListFragment_pin">Pin</string>
<string name="ConversationListFragment_unpin">Unpin</string>
<string name="ConversationListFragment_mute">Mute</string>
<string name="ConversationListFragment_unmute">Unmute</string>
<plurals name="ConversationListFragment_read">
<item quantity="one">Read</item>
<item quantity="other">Read</item>
</plurals>
<plurals name="ConversationListFragment_unread">
<item quantity="one">Unread</item>
<item quantity="other">Unread</item>
</plurals>
<plurals name="ConversationListFragment_pin">
<item quantity="one">Pin</item>
<item quantity="other">Pin</item>
</plurals>
<plurals name="ConversationListFragment_unpin">
<item quantity="one">Unpin</item>
<item quantity="other">Unpin</item>
</plurals>
<plurals name="ConversationListFragment_mute">
<item quantity="one">Mute</item>
<item quantity="other">Mute</item>
</plurals>
<plurals name="ConversationListFragment_unmute">
<item quantity="one">Unmute</item>
<item quantity="other">Unmute</item>
</plurals>
<string name="ConversationListFragment_select">Select</string>
<string name="ConversationListFragment_archive">Archive</string>
<string name="ConversationListFragment_unarchive">Unarchive</string>
<string name="ConversationListFragment_delete">Delete</string>
<plurals name="ConversationListFragment_archive">
<item quantity="one">Archive</item>
<item quantity="other">Archive</item>
</plurals>
<plurals name="ConversationListFragment_unarchive">
<item quantity="one">Unarchive</item>
<item quantity="other">Unarchive</item>
</plurals>
<plurals name="ConversationListFragment_delete">
<item quantity="one">Delete</item>
<item quantity="other">Delete</item>
</plurals>
<string name="ConversationListFragment_select_all">Select all</string>
<plurals name="ConversationListFragment_s_selected">
<item quantity="one">%d selected</item>
@@ -944,9 +972,15 @@
<string name="MediaOverviewActivity_Grid_view_description">Grid view</string>
<string name="MediaOverviewActivity_List_view_description">List view</string>
<string name="MediaOverviewActivity_Selected_description">Selected</string>
<string name="MediaOverviewActivity_save">Save</string>
<string name="MediaOverviewActivity_select_all">Select all</string>
<string name="MediaOverviewActivity_delete">Delete</string>
<plurals name="MediaOverviewActivity_save">
<item quantity="one">Save</item>
<item quantity="other">Save</item>
</plurals>
<plurals name="MediaOverviewActivity_delete">
<item quantity="one">Delete</item>
<item quantity="other">Delete</item>
</plurals>
<plurals name="MediaOverviewActivity_d_selected_s">
<item quantity="one">%1$d selected (%2$s)</item>