]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java
Don't show a context menu when 0 bookmarks are selected. https://redmine.stoutner...
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / activities / BookmarksActivity.java
index 3a96929f897263bf1590279083faf4314a5b409a..e6a4cf48e3257d4f54e149e32dd9cc4c58005124 100644 (file)
@@ -52,7 +52,7 @@ import android.widget.TextView;
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;  // The AndroidX toolbar must be used until the minimum API is >= 21.
+import androidx.appcompat.widget.Toolbar;
 import androidx.core.app.NavUtils;
 import androidx.fragment.app.DialogFragment;
 
@@ -68,6 +68,7 @@ import com.stoutner.privacybrowser.R;
 import com.stoutner.privacybrowser.helpers.BookmarksDatabaseHelper;
 
 import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
 
 public class BookmarksActivity extends AppCompatActivity implements CreateBookmarkDialog.CreateBookmarkListener, CreateBookmarkFolderDialog.CreateBookmarkFolderListener, EditBookmarkDialog.EditBookmarkListener,
         EditBookmarkFolderDialog.EditBookmarkFolderListener, MoveToFolderDialog.MoveToFolderListener {
@@ -85,6 +86,13 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
     public static boolean restartFromBookmarksDatabaseViewActivity;
 
 
+    // Define the saved instance state constants.
+    private final String CHECKED_BOOKMARKS_ARRAY_LIST = "checked_bookmarks_array_list";
+
+    // Define the class menu items.
+    private MenuItem moveBookmarkUpMenuItem;
+    private MenuItem moveBookmarkDownMenuItem;
+
     // `bookmarksDatabaseHelper` is used in `onCreate()`, `onOptionsItemSelected()`, `onBackPressed()`, `onCreateBookmark()`, `onCreateBookmarkFolder()`, `onSaveBookmark()`, `onSaveBookmarkFolder()`,
     // `onMoveToFolder()`, `deleteBookmarkFolderContents()`, `loadFolder()`, and `onDestroy()`.
     private BookmarksDatabaseHelper bookmarksDatabaseHelper;
@@ -109,12 +117,6 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
     // `oldFolderName` is used in `onCreate()` and `onSaveBookmarkFolder()`.
     private String oldFolderNameString;
 
-    // `moveBookmarkUpMenuItem` is used in `onCreate()` and `updateMoveIcons()`.
-    private MenuItem moveBookmarkUpMenuItem;
-
-    // `moveBookmarkDownMenuItem` is used in `onCreate()` and `updateMoveIcons()`.
-    private MenuItem moveBookmarkDownMenuItem;
-
     // `bookmarksDeletedSnackbar` is used in `onCreate()`, `onOptionsItemSelected()`, and `onBackPressed()`.
     private Snackbar bookmarksDeletedSnackbar;
 
@@ -285,50 +287,61 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                 // Get the number of selected bookmarks.
                 int numberOfSelectedBookmarks = bookmarksListView.getCheckedItemCount();
 
-                // Adjust the ActionMode and the menu according to the number of selected bookmarks.
-                if (numberOfSelectedBookmarks == 1) {  // One bookmark is selected.
-                    // List the number of selected bookmarks in the subtitle.
-                    mode.setSubtitle(getString(R.string.selected) + "  1");
-
-                    // Show the `Move Up`, `Move Down`, and  `Edit` options.
-                    moveBookmarkUpMenuItem.setVisible(true);
-                    moveBookmarkDownMenuItem.setVisible(true);
-                    editBookmarkMenuItem.setVisible(true);
-
-                    // Update the enabled status of the move icons.
-                    updateMoveIcons();
-                } else {  // More than one bookmark is selected.
-                    // List the number of selected bookmarks in the subtitle.
-                    mode.setSubtitle(getString(R.string.selected) + "  " + numberOfSelectedBookmarks);
-
-                    // Hide non-applicable `MenuItems`.
-                    moveBookmarkUpMenuItem.setVisible(false);
-                    moveBookmarkDownMenuItem.setVisible(false);
-                    editBookmarkMenuItem.setVisible(false);
-                }
+                // Only process commands if at least one bookmark is selected.  Otherwise, a context menu with 0 selected bookmarks is briefly displayed.
+                if (numberOfSelectedBookmarks > 0) {
+                    // Adjust the ActionMode and the menu according to the number of selected bookmarks.
+                    if (numberOfSelectedBookmarks == 1) {  // One bookmark is selected.
+                        // List the number of selected bookmarks in the subtitle.
+                        mode.setSubtitle(getString(R.string.selected) + "  1");
+
+                        // Show the `Move Up`, `Move Down`, and  `Edit` options.
+                        moveBookmarkUpMenuItem.setVisible(true);
+                        moveBookmarkDownMenuItem.setVisible(true);
+                        editBookmarkMenuItem.setVisible(true);
 
-                // Do not show the select all menu item if all the bookmarks are already checked.
-                if (bookmarksListView.getCheckedItemCount() == bookmarksListView.getCount()) {
-                    selectAllBookmarksMenuItem.setVisible(false);
-                } else {
-                    selectAllBookmarksMenuItem.setVisible(true);
+                        // Update the enabled status of the move icons.
+                        updateMoveIcons();
+                    } else {  // More than one bookmark is selected.
+                        // List the number of selected bookmarks in the subtitle.
+                        mode.setSubtitle(getString(R.string.selected) + "  " + numberOfSelectedBookmarks);
+
+                        // Hide non-applicable `MenuItems`.
+                        moveBookmarkUpMenuItem.setVisible(false);
+                        moveBookmarkDownMenuItem.setVisible(false);
+                        editBookmarkMenuItem.setVisible(false);
+                    }
+
+                    // Do not show the select all menu item if all the bookmarks are already checked.
+                    if (bookmarksListView.getCheckedItemCount() == bookmarksListView.getCount()) {
+                        selectAllBookmarksMenuItem.setVisible(false);
+                    } else {
+                        selectAllBookmarksMenuItem.setVisible(true);
+                    }
                 }
             }
 
             @Override
             public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-                // Instantiate the common variables.
-                int selectedBookmarkPosition;
+                // Declare the common variables.
                 int selectedBookmarkNewPosition;
                 final SparseBooleanArray selectedBookmarksPositionsSparseBooleanArray;
 
+                // Initialize the selected bookmark position.
+                int selectedBookmarkPosition = 0;
+
                 switch (item.getItemId()) {
                     case R.id.move_bookmark_up:
                         // Get the array of checked bookmark positions.
                         selectedBookmarksPositionsSparseBooleanArray = bookmarksListView.getCheckedItemPositions();
 
-                        // Store the position of the selected bookmark.  Only one bookmark is selected when `move_bookmark_up` is enabled.
-                        selectedBookmarkPosition = selectedBookmarksPositionsSparseBooleanArray.keyAt(0);
+                        // Get the position of the bookmark that is selected.  If other bookmarks have previously been selected they will be included in the sparse boolean array with a value of `false`.
+                        for (int i = 0; i < selectedBookmarksPositionsSparseBooleanArray.size(); i++) {
+                            // Check to see if the value for the bookmark is true, meaning it is currently selected.
+                            if (selectedBookmarksPositionsSparseBooleanArray.valueAt(i)) {
+                                // Only one bookmark should have a value of `true` when move bookmark up is enabled.
+                                selectedBookmarkPosition = selectedBookmarksPositionsSparseBooleanArray.keyAt(i);
+                            }
+                        }
 
                         // Calculate the new position of the selected bookmark.
                         selectedBookmarkNewPosition = selectedBookmarkPosition - 1;
@@ -373,8 +386,14 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         // Get the array of checked bookmark positions.
                         selectedBookmarksPositionsSparseBooleanArray = bookmarksListView.getCheckedItemPositions();
 
-                        // Store the position of the selected bookmark.  Only one bookmark is selected when `move_bookmark_down` is enabled.
-                        selectedBookmarkPosition = selectedBookmarksPositionsSparseBooleanArray.keyAt(0);
+                        // Get the position of the bookmark that is selected.  If other bookmarks have previously been selected they will be included in the sparse boolean array with a value of `false`.
+                        for (int i = 0; i < selectedBookmarksPositionsSparseBooleanArray.size(); i++) {
+                            // Check to see if the value for the bookmark is true, meaning it is currently selected.
+                            if (selectedBookmarksPositionsSparseBooleanArray.valueAt(i)) {
+                                // Only one bookmark should have a value of `true` when move bookmark down is enabled.
+                                selectedBookmarkPosition = selectedBookmarksPositionsSparseBooleanArray.keyAt(i);
+                            }
+                        }
 
                         // Calculate the new position of the selected bookmark.
                         selectedBookmarkNewPosition = selectedBookmarkPosition + 1;
@@ -428,8 +447,14 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         // Get the array of checked bookmark positions.
                         selectedBookmarksPositionsSparseBooleanArray = bookmarksListView.getCheckedItemPositions();
 
-                        // Get the position of the selected bookmark.  Only one bookmark is selected when `edit_bookmark_down` is enabled.
-                        selectedBookmarkPosition = selectedBookmarksPositionsSparseBooleanArray.keyAt(0);
+                        // Get the position of the bookmark that is selected.  If other bookmarks have previously been selected they will be included in the sparse boolean array with a value of `false`.
+                        for (int i = 0; i < selectedBookmarksPositionsSparseBooleanArray.size(); i++) {
+                            // Check to see if the value for the bookmark is true, meaning it is currently selected.
+                            if (selectedBookmarksPositionsSparseBooleanArray.valueAt(i)) {
+                                // Only one bookmark should have a value of `true` when move edit bookmark is enabled.
+                                selectedBookmarkPosition = selectedBookmarksPositionsSparseBooleanArray.keyAt(i);
+                            }
+                        }
 
                         // Move the `Cursor` to the selected position and find out if it is a folder.
                         bookmarksCursor.moveToPosition(selectedBookmarkPosition);
@@ -583,6 +608,22 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
             // Display the create bookmark dialog.
             createBookmarkDialog.show(getSupportFragmentManager(), getResources().getString(R.string.create_bookmark));
         });
+
+        // Restore the state if the app has been restarted.
+        if (savedInstanceState != null) {
+            // Update the bookmarks list view after it has loaded.
+            bookmarksListView.post(() -> {
+                // Get the checked bookmarks array list.
+                ArrayList<Integer> checkedBookmarksArrayList = savedInstanceState.getIntegerArrayList(CHECKED_BOOKMARKS_ARRAY_LIST);
+
+                // Check each previously checked bookmark in the list view.  When the minimum API >= 24 a `forEach()` command can be used instead.
+                if (checkedBookmarksArrayList != null) {
+                    for (int i = 0; i < checkedBookmarksArrayList.size(); i++) {
+                        bookmarksListView.setItemChecked(checkedBookmarksArrayList.get(i), true);
+                    }
+                }
+            });
+        }
     }
 
     @Override
@@ -600,6 +641,30 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         }
     }
 
+    @Override
+    public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
+        // Run the default commands.
+        super.onSaveInstanceState(savedInstanceState);
+
+        // Get the array of the checked items.
+        SparseBooleanArray checkedBookmarksSparseBooleanArray = bookmarksListView.getCheckedItemPositions();
+
+        // Create a checked items array list.
+        ArrayList<Integer> checkedBookmarksArrayList = new ArrayList<>();
+
+        // Add each checked bookmark position to the array list.
+        for (int i = 0; i < checkedBookmarksSparseBooleanArray.size(); i++) {
+            // Check to see if the bookmark is currently checked.  Bookmarks that have previously been checked but currently aren't will be populated in the sparse boolean array, but will return false.
+            if (checkedBookmarksSparseBooleanArray.valueAt(i)) {
+                // Add the bookmark position to the checked bookmarks array list.
+                checkedBookmarksArrayList.add(checkedBookmarksSparseBooleanArray.keyAt(i));
+            }
+        }
+
+        // Store the checked items array list in the saved instance state.
+        savedInstanceState.putIntegerArrayList(CHECKED_BOOKMARKS_ARRAY_LIST, checkedBookmarksArrayList);
+    }
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         // Inflate the menu.
@@ -774,7 +839,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
     }
 
     @Override
-    public void onSaveBookmark(DialogFragment dialogFragment, int selectedBookmarkDatabaseId, Bitmap favoriteIconBitmap) {
+    public void onSaveBookmark(DialogFragment dialogFragment, int selectedBookmarkDatabaseId, @NonNull Bitmap favoriteIconBitmap) {
         // Get the dialog from the dialog fragment.
         Dialog dialog = dialogFragment.getDialog();