diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8b07688641..e2b673f83b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -506,6 +506,14 @@
List view
Selected
+
+ - %1$d item %2$s
+ - %1$d items %2$s
+
+
+ - %1$d item
+ - %1$d items
+
File
Audio
Video
diff --git a/src/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java b/src/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java
index 45fdd431cc..1a395e3d29 100644
--- a/src/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java
+++ b/src/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java
@@ -27,6 +27,8 @@ import androidx.annotation.NonNull;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.RecyclerView;
+import com.annimon.stream.Collectors;
+import com.annimon.stream.Stream;
import com.codewaves.stickyheadergrid.StickyHeaderGridAdapter;
import org.thoughtcrime.securesms.R;
@@ -187,6 +189,12 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
return selected.size();
}
+ public long getSelectedMediaTotalFileSize() {
+ //noinspection ConstantConditions attacment cannot be null if selected
+ return Stream.of(selected.values())
+ .collect(Collectors.summingLong(a -> a.getAttachment().getSize()));
+ }
+
@NonNull
public Collection getSelectedMedia() {
return new HashSet<>(selected.values());
diff --git a/src/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java b/src/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java
index 0e669d48f1..03dd4350d3 100644
--- a/src/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java
+++ b/src/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java
@@ -37,6 +37,7 @@ import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.util.MediaUtil;
+import org.thoughtcrime.securesms.util.Util;
public final class MediaOverviewPageFragment extends Fragment
implements MediaGalleryAllAdapter.ItemClickListener,
@@ -117,6 +118,7 @@ public final class MediaOverviewPageFragment extends Fragment
this.sorting = sorting;
adapter.setShowFileSizes(sorting.isRelatedToFileSize());
LoaderManager.getInstance(this).restartLoader(0, null, this);
+ refreshActionModeTitle();
}
});
@@ -134,6 +136,7 @@ public final class MediaOverviewPageFragment extends Fragment
this.detail = detail;
adapter.setDetailView(detail);
refreshLayoutManager();
+ refreshActionModeTitle();
}
@Override
@@ -202,7 +205,7 @@ public final class MediaOverviewPageFragment extends Fragment
if (adapter.getSelectedMediaCount() == 0) {
actionMode.finish();
} else {
- actionMode.setTitle(String.valueOf(adapter.getSelectedMediaCount()));
+ refreshActionModeTitle();
}
}
@@ -263,7 +266,33 @@ public final class MediaOverviewPageFragment extends Fragment
private void handleSelectAllMedia() {
getListAdapter().selectAllMedia();
- actionMode.setTitle(String.valueOf(getListAdapter().getSelectedMediaCount()));
+ refreshActionModeTitle();
+ }
+
+ private void refreshActionModeTitle() {
+ if (actionMode != null) {
+ actionMode.setTitle(getActionModeTitle());
+ }
+ }
+
+ private String getActionModeTitle() {
+ MediaGalleryAllAdapter adapter = getListAdapter();
+ int mediaCount = adapter.getSelectedMediaCount();
+ boolean showTotalFileSize = detail ||
+ mediaType != MediaLoader.MediaType.GALLERY ||
+ sorting == MediaDatabase.Sorting.Largest;
+
+ if (showTotalFileSize) {
+ long totalFileSize = adapter.getSelectedMediaTotalFileSize();
+ return getResources().getQuantityString(R.plurals.MediaOverviewActivity_d_items_s,
+ mediaCount,
+ mediaCount,
+ Util.getPrettyFileSize(totalFileSize));
+ } else {
+ return getResources().getQuantityString(R.plurals.MediaOverviewActivity_d_items,
+ mediaCount,
+ mediaCount);
+ }
}
private MediaGalleryAllAdapter getListAdapter() {
@@ -283,7 +312,7 @@ public final class MediaOverviewPageFragment extends Fragment
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.media_overview_context, menu);
- mode.setTitle("1");
+ refreshActionModeTitle();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = requireActivity().getWindow();