Add new bottom actionbar to the media overview.

This commit is contained in:
Greyson Parrelli
2021-10-21 15:30:34 -04:00
parent 68655194a6
commit d88999d6d4
6 changed files with 83 additions and 93 deletions

View File

@@ -10,6 +10,8 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.database.MediaDatabase;
import org.thoughtcrime.securesms.permissions.Permissions;
@@ -59,11 +61,9 @@ final class MediaActions {
recordCount,
recordCount);
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setIcon(R.drawable.ic_warning)
.setTitle(confirmTitle)
.setMessage(confirmMessage)
.setCancelable(true);
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context).setTitle(confirmTitle)
.setMessage(confirmMessage)
.setCancelable(true);
builder.setPositiveButton(R.string.delete, (dialogInterface, i) ->
new ProgressDialogAsyncTask<MediaDatabase.MediaRecord, Void, Void>(context,

View File

@@ -33,6 +33,8 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.MediaPreviewActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.components.menu.ActionItem;
import org.thoughtcrime.securesms.components.menu.SignalBottomActionBar;
import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaController;
import org.thoughtcrime.securesms.components.voice.VoiceNotePlaybackState;
import org.thoughtcrime.securesms.database.MediaDatabase;
@@ -45,6 +47,8 @@ import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.WindowUtil;
import java.util.Arrays;
public final class MediaOverviewPageFragment extends Fragment
implements MediaGalleryAllAdapter.ItemClickListener,
MediaGalleryAllAdapter.AudioItemListener,
@@ -69,6 +73,7 @@ public final class MediaOverviewPageFragment extends Fragment
private MediaGalleryAllAdapter adapter;
private GridMode gridMode;
private VoiceNoteMediaController voiceNoteMediaController;
private SignalBottomActionBar bottomActionBar;
public static @NonNull Fragment newInstance(long threadId,
@NonNull MediaLoader.MediaType mediaType,
@@ -112,9 +117,10 @@ public final class MediaOverviewPageFragment extends Fragment
View view = inflater.inflate(R.layout.media_overview_page_fragment, container, false);
int spans = getResources().getInteger(R.integer.media_overview_cols);
this.recyclerView = view.findViewById(R.id.media_grid);
this.noMedia = view.findViewById(R.id.no_images);
this.gridManager = new StickyHeaderGridLayoutManager(spans);
this.recyclerView = view.findViewById(R.id.media_grid);
this.noMedia = view.findViewById(R.id.no_images);
this.bottomActionBar = view.findViewById(R.id.media_overview_bottom_action_bar);
this.gridManager = new StickyHeaderGridLayoutManager(spans);
this.adapter = new MediaGalleryAllAdapter(context,
GlideApp.with(this),
@@ -136,7 +142,7 @@ public final class MediaOverviewPageFragment extends Fragment
this.sorting = sorting;
adapter.setShowFileSizes(sorting.isRelatedToFileSize());
LoaderManager.getInstance(this).restartLoader(0, null, this);
refreshActionModeTitle();
updateMultiSelect();
}
});
@@ -154,7 +160,7 @@ public final class MediaOverviewPageFragment extends Fragment
this.detail = detail;
adapter.setDetailView(detail);
refreshLayoutManager();
refreshActionModeTitle();
updateMultiSelect();
}
@Override
@@ -214,7 +220,7 @@ public final class MediaOverviewPageFragment extends Fragment
if (adapter.getSelectedMediaCount() == 0) {
actionMode.finish();
} else {
refreshActionModeTitle();
updateMultiSelect();
}
}
@@ -275,33 +281,18 @@ public final class MediaOverviewPageFragment extends Fragment
private void handleSelectAllMedia() {
getListAdapter().selectAllMedia();
refreshActionModeTitle();
}
private void refreshActionModeTitle() {
if (actionMode != null) {
actionMode.setTitle(getActionModeTitle());
}
updateMultiSelect();
}
private String getActionModeTitle() {
MediaGalleryAllAdapter adapter = getListAdapter();
int mediaCount = adapter.getSelectedMediaCount();
boolean showTotalFileSize = detail ||
mediaType != MediaLoader.MediaType.GALLERY ||
sorting == MediaDatabase.Sorting.Largest;
MediaGalleryAllAdapter adapter = getListAdapter();
int mediaCount = adapter.getSelectedMediaCount();
long totalFileSize = adapter.getSelectedMediaTotalFileSize();
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);
}
return getResources().getQuantityString(R.plurals.MediaOverviewActivity_d_selected_s,
mediaCount,
mediaCount,
Util.getPrettyFileSize(totalFileSize));
}
private MediaGalleryAllAdapter getListAdapter() {
@@ -312,8 +303,35 @@ public final class MediaOverviewPageFragment extends Fragment
FragmentActivity activity = requireActivity();
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();
})
));
}
private void exitMultiSelect() {
actionMode.finish();
actionMode = null;
ViewUtil.fadeOut(bottomActionBar, 250);
}
private void updateMultiSelect() {
if (actionMode != null) {
actionMode.setTitle(getActionModeTitle());
}
}
@Override
public void onPlay(@NonNull Uri audioUri, double progress, long messageId) {
voiceNoteMediaController.startSinglePlayback(audioUri, messageId, progress);
@@ -346,18 +364,9 @@ public final class MediaOverviewPageFragment extends Fragment
private class ActionModeCallback implements ActionMode.Callback {
private int originalStatusBarColor;
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.media_overview_context, menu);
mode.setTitle(getActionModeTitle());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = requireActivity().getWindow();
originalStatusBarColor = window.getStatusBarColor();
WindowUtil.setStatusBarColor(requireActivity().getWindow(), getResources().getColor(R.color.action_mode_status_bar));
}
return true;
}
@@ -368,33 +377,17 @@ public final class MediaOverviewPageFragment extends Fragment
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.save:
MediaActions.handleSaveMedia(MediaOverviewPageFragment.this,
getListAdapter().getSelectedMedia(),
() -> actionMode.finish());
return true;
case R.id.delete:
MediaActions.handleDeleteMedia(requireContext(), getListAdapter().getSelectedMedia());
actionMode.finish();
return true;
case R.id.select_all:
handleSelectAllMedia();
return true;
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
actionMode = null;
getListAdapter().clearSelection();
FragmentActivity activity = requireActivity();
((MediaOverviewActivity) activity).onExitMultiSelect();
WindowUtil.setStatusBarColor(requireActivity().getWindow(), originalStatusBarColor);
exitMultiSelect();
}
}