From abfb83d55d61adc9ecd62c3e77dde6d5c781751e Mon Sep 17 00:00:00 2001 From: Muntashir Al-Islam Date: Sat, 8 Jul 2023 22:18:23 +0600 Subject: [PATCH] [Refactor] Fix updating MultiSelectionView when visibility of an option changes Signed-off-by: Muntashir Al-Islam --- .../AppManager/debloat/DebloaterActivity.java | 3 ++- .../muntashirakon/AppManager/fm/FmFragment.java | 3 ++- .../logcat/LiveLogViewerFragment.java | 1 + .../AppManager/main/MainActivity.java | 2 +- .../AppManager/main/MainBatchOpsHandler.java | 3 ++- .../runningapps/RunningAppsActivity.java | 7 +++++-- .../reflow/SelectionActionsView.java | 4 ++++ .../widget/MultiSelectionView.java | 17 ++++++++++++----- 8 files changed, 29 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/debloat/DebloaterActivity.java b/app/src/main/java/io/github/muntashirakon/AppManager/debloat/DebloaterActivity.java index 2aed854b56b..eac0fd3e2e5 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/debloat/DebloaterActivity.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/debloat/DebloaterActivity.java @@ -126,8 +126,9 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { } @Override - public void onSelectionChange(int selectionCount) { + public boolean onSelectionChange(int selectionCount) { // TODO: 7/8/22 + return false; } @Override diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/fm/FmFragment.java b/app/src/main/java/io/github/muntashirakon/AppManager/fm/FmFragment.java index 810e235c451..40b35a945a2 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/fm/FmFragment.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/fm/FmFragment.java @@ -873,7 +873,7 @@ public BatchOpsHandler(@NonNull MultiSelectionView multiSelectionView) { } @Override - public void onSelectionChange(int selectionCount) { + public boolean onSelectionChange(int selectionCount) { boolean nonZeroSelection = selectionCount > 0; boolean canRead = mFolderShortInfo != null && mFolderShortInfo.canRead; boolean canWrite = mFolderShortInfo != null && mFolderShortInfo.canWrite; @@ -883,6 +883,7 @@ public void onSelectionChange(int selectionCount) { mCutMenu.setEnabled(nonZeroSelection && canWrite); mCopyMenu.setEnabled(nonZeroSelection && canRead); mCopyPathsMenu.setEnabled(nonZeroSelection); + return false; } } } diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/logcat/LiveLogViewerFragment.java b/app/src/main/java/io/github/muntashirakon/AppManager/logcat/LiveLogViewerFragment.java index 2a461a2d256..87ac1fead79 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/logcat/LiveLogViewerFragment.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/logcat/LiveLogViewerFragment.java @@ -41,6 +41,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat } else if (selectionCount == 0) { mViewModel.resumeLogcat(); } + return false; }); mViewModel.startLogcat(new WeakReference<>(this)); } diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/main/MainActivity.java b/app/src/main/java/io/github/muntashirakon/AppManager/main/MainActivity.java index 987015f7348..b54826573c0 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/main/MainActivity.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/main/MainActivity.java @@ -499,7 +499,7 @@ protected void onResume() { if (viewModel != null) viewModel.onResume(); if (mAdapter != null && mBatchOpsHandler != null && mAdapter.isInSelectionMode()) { mBatchOpsHandler.updateConstraints(); - mBatchOpsHandler.onSelectionChange(0); // count is irrelevant + mMultiSelectionView.updateCounter(false); } registerReceiver(mBatchOpsBroadCastReceiver, new IntentFilter(BatchOpsService.ACTION_BATCH_OPS_COMPLETED)); } diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/main/MainBatchOpsHandler.java b/app/src/main/java/io/github/muntashirakon/AppManager/main/MainBatchOpsHandler.java index c8c6d801731..41f43db87b5 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/main/MainBatchOpsHandler.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/main/MainBatchOpsHandler.java @@ -66,7 +66,7 @@ public void updateConstraints() { } @Override - public void onSelectionChange(int selectionCount) { + public boolean onSelectionChange(int selectionCount) { Collection selectedItems = mViewModel.getSelectedApplicationItems(); boolean nonZeroSelection = selectedItems.size() > 0; // It was ensured that the algorithm is greedy @@ -108,5 +108,6 @@ public void onSelectionChange(int selectionCount) { mPreventBackgroundMenu.setVisible(mCanModifyAppOpMode && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N); mNetPolicyMenu.setVisible(mCanModifyNetPolicy); mBlockUnblockTrackersMenu.setVisible(mCanModifyComponentState); + return true; } } diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/runningapps/RunningAppsActivity.java b/app/src/main/java/io/github/muntashirakon/AppManager/runningapps/RunningAppsActivity.java index 63e1bdfa522..c36f3be9a5e 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/runningapps/RunningAppsActivity.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/runningapps/RunningAppsActivity.java @@ -351,8 +351,10 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { } @Override - public void onSelectionChange(int selectionCount) { - if (mSelectionMenu == null || mAdapter == null) return; + public boolean onSelectionChange(int selectionCount) { + if (mSelectionMenu == null || mAdapter == null) { + return false; + } ArrayList selectedItems = mAdapter.getSelectedItems(); MenuItem kill = mSelectionMenu.findItem(R.id.action_kill); MenuItem forceStop = mSelectionMenu.findItem(R.id.action_force_stop); @@ -378,6 +380,7 @@ public void onSelectionChange(int selectionCount) { } } kill.setEnabled(selectedItems.size() != 0 && killEnabled); + return true; } private void handleBatchOp(@BatchOpsManager.OpType int op) { diff --git a/libcore/ui/src/main/java/io/github/muntashirakon/reflow/SelectionActionsView.java b/libcore/ui/src/main/java/io/github/muntashirakon/reflow/SelectionActionsView.java index 9e19b441589..662bf080b30 100644 --- a/libcore/ui/src/main/java/io/github/muntashirakon/reflow/SelectionActionsView.java +++ b/libcore/ui/src/main/java/io/github/muntashirakon/reflow/SelectionActionsView.java @@ -242,6 +242,10 @@ public MenuView getMenuView() { return mMenuAdapter; } + public void updateMenuView() { + mMenuAdapter.updateMenuView(); + } + /** * Inflate a menu resource into this navigation view. * diff --git a/libcore/ui/src/main/java/io/github/muntashirakon/widget/MultiSelectionView.java b/libcore/ui/src/main/java/io/github/muntashirakon/widget/MultiSelectionView.java index 80f526de654..b6f62d0ca16 100644 --- a/libcore/ui/src/main/java/io/github/muntashirakon/widget/MultiSelectionView.java +++ b/libcore/ui/src/main/java/io/github/muntashirakon/widget/MultiSelectionView.java @@ -47,8 +47,15 @@ @SuppressLint("RestrictedApi") public class MultiSelectionView extends MaterialCardView implements OnApplyWindowInsetsListener { public interface OnSelectionChangeListener { + /** + * Called when the number of selections has changed or an update is required internally or via + * {@link #updateCounter(boolean)}. + * + * @param selectionCount Present selection count + * @return {@code true} if it's necessary to update the visibility of menu items, or {@code false} otherwise. + */ @UiThread - void onSelectionChange(int selectionCount); + boolean onSelectionChange(int selectionCount); } private final SelectionActionsView mSelectionActionsView; @@ -356,8 +363,8 @@ public void updateCounter(boolean hideOnEmpty) { int selectionCount = mAdapter.getSelectedItemCount(); if (selectionCount <= 0 && hideOnEmpty) { if (getVisibility() != GONE) hide(); - if (mSelectionChangeListener != null) { - mSelectionChangeListener.onSelectionChange(0); + if (mSelectionChangeListener != null && mSelectionChangeListener.onSelectionChange(0)) { + mSelectionActionsView.updateMenuView(); } return; } @@ -366,8 +373,8 @@ public void updateCounter(boolean hideOnEmpty) { } mSelectionCounter.setText(String.format(Locale.getDefault(), "%d/%d", selectionCount, mAdapter.getTotalItemCount())); mSelectAllView.setChecked(mAdapter.areAllSelected(), false); - if (mSelectionChangeListener != null) { - mSelectionChangeListener.onSelectionChange(selectionCount); + if (mSelectionChangeListener != null && mSelectionChangeListener.onSelectionChange(selectionCount)) { + mSelectionActionsView.updateMenuView(); } if (!mAdapter.isInSelectionMode()) { // Special check to avoid displaying the selection panel on resizing the view