]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java
Make a single tap in the bookmarks activity edit the bookmark. https://redmine.stout...
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / activities / BookmarksActivity.java
index 232e3be73b3376ecc62d4e793dc938ba2926e7d9..3cf6e6929d13610310389b7de3a54cae8d71d9b2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
 package com.stoutner.privacybrowser.activities;
 
 import android.annotation.SuppressLint;
-import android.app.Activity;
+import android.app.Dialog;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -30,6 +32,7 @@ import android.graphics.Typeface;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.preference.PreferenceManager;
 import android.util.SparseBooleanArray;
 import android.view.ActionMode;
 import android.view.Menu;
@@ -45,10 +48,10 @@ import android.widget.ListView;
 import android.widget.RadioButton;
 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.core.app.NavUtils;
+import androidx.appcompat.widget.Toolbar;
 import androidx.fragment.app.DialogFragment;
 
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
@@ -63,6 +66,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 {
@@ -80,6 +84,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;
@@ -104,12 +115,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;
 
@@ -121,17 +126,19 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
+        // Get a handle for the shared preferences.
+        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+
+        // Get the screenshot preference.
+        boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
+
         // Disable screenshots if not allowed.
-        if (!MainWebViewActivity.allowScreenshots) {
+        if (!allowScreenshots) {
             getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
         }
 
-        // Set the activity theme.
-        if (MainWebViewActivity.darkTheme) {
-            setTheme(R.style.PrivacyBrowserDark_SecondaryActivity);
-        } else {
-            setTheme(R.style.PrivacyBrowserLight_SecondaryActivity);
-        }
+        // Set the theme.
+        setTheme(R.style.PrivacyBrowser);
 
         // Run the default commands.
         super.onCreate(savedInstanceState);
@@ -153,6 +160,9 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         // Get the favorite icon byte array.
         favoriteIconByteArray = launchingIntent.getByteArrayExtra("favorite_icon_byte_array");
 
+        // Remove the incorrect lint warning that the favorite icon byte array might be null.
+        assert favoriteIconByteArray != null;
+
         // Convert the favorite icon byte array to a bitmap.
         Bitmap favoriteIconBitmap = BitmapFactory.decodeByteArray(favoriteIconByteArray, 0, favoriteIconByteArray.length);
 
@@ -163,8 +173,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         final Toolbar toolbar = findViewById(R.id.bookmarks_toolbar);
         setSupportActionBar(toolbar);
 
-        // Get a handle for the activity, the app bar, and the ListView.
-        final Activity bookmarksActivity = this;
+        // Get handles for the views.
         appBar = getSupportActionBar();
         bookmarksListView = findViewById(R.id.bookmarks_listview);
 
@@ -184,10 +193,12 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         // Set a listener so that tapping a list item loads the URL or folder.
         bookmarksListView.setOnItemClickListener((parent, view, position, id) -> {
             // Convert the id from long to int to match the format of the bookmarks database.
-            int databaseID = (int) id;
+            int databaseId = (int) id;
+
+            // Get the bookmark cursor for this ID.
+            Cursor bookmarkCursor = bookmarksDatabaseHelper.getBookmark(databaseId);
 
-            // Get the bookmark cursor for this ID and move it to the first row.
-            Cursor bookmarkCursor = bookmarksDatabaseHelper.getBookmark(databaseID);
+            // Move the cursor to the first entry.
             bookmarkCursor.moveToFirst();
 
             // Act upon the bookmark according to the type.
@@ -198,23 +209,14 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                 // Load the new folder.
                 loadFolder();
             } else {  // The selected bookmark is not a folder.
-                // Get the bookmark URL and assign it to `formattedUrlString`.
-                MainWebViewActivity.urlToLoadOnRestart = bookmarkCursor.getString(bookmarkCursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_URL));
-
-                // Set `MainWebViewActivity` to load the new URL on restart.
-                MainWebViewActivity.loadUrlOnRestart = true;
+                // Instantiate the edit bookmark dialog.
+                DialogFragment editBookmarkDialog = EditBookmarkDialog.bookmarkDatabaseId(databaseId, favoriteIconBitmap);
 
-                // Update the bookmarks folder for the bookmarks drawer in `MainWebViewActivity`.
-                MainWebViewActivity.currentBookmarksFolder = currentFolder;
-
-                // Close the bookmarks drawer and reload the bookmarks `ListView` when returning to `MainWebViewActivity`.
-                MainWebViewActivity.restartFromBookmarksActivity = true;
-
-                // Return to `MainWebViewActivity`.
-                NavUtils.navigateUpFromSameTask(bookmarksActivity);
+                // Make it so.
+                editBookmarkDialog.show(getSupportFragmentManager(), getResources().getString(R.string.edit_bookmark));
             }
 
-            // Close the `Cursor`.
+            // Close the cursor.
             bookmarkCursor.close();
         });
 
@@ -275,50 +277,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");
 
-                // 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);
+                        // 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);
+                    }
+
+                    // 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;
@@ -363,8 +376,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;
@@ -418,11 +437,19 @@ 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.
+                        // Move the cursor to the selected position.
                         bookmarksCursor.moveToPosition(selectedBookmarkPosition);
+
+                        // Find out if this bookmark is a folder.
                         boolean isFolder = (bookmarksCursor.getInt(bookmarksCursor.getColumnIndex(BookmarksDatabaseHelper.IS_FOLDER)) == 1);
 
                         // Get the selected bookmark database ID.
@@ -433,12 +460,16 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                             // Save the current folder name, which is used in `onSaveBookmarkFolder()`.
                             oldFolderNameString = bookmarksCursor.getString(bookmarksCursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_NAME));
 
-                            // Show the edit bookmark folder dialog.
+                            // Instantiate the edit bookmark folder dialog.
                             DialogFragment editFolderDialog = EditBookmarkFolderDialog.folderDatabaseId(databaseId, favoriteIconBitmap);
+
+                            // Make it so.
                             editFolderDialog.show(getSupportFragmentManager(), getResources().getString(R.string.edit_folder));
                         } else {
-                            // Show the edit bookmark dialog.
+                            // Instantiate the edit bookmark dialog.
                             DialogFragment editBookmarkDialog = EditBookmarkDialog.bookmarkDatabaseId(databaseId, favoriteIconBitmap);
+
+                            // Make it so.
                             editBookmarkDialog.show(getSupportFragmentManager(), getResources().getString(R.string.edit_bookmark));
                         }
                         break;
@@ -459,7 +490,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         // Update the list view.
                         bookmarksCursorAdapter.changeCursor(bookmarksCursor);
 
-                        // Show a Snackbar with the number of deleted bookmarks.
+                        // Create a Snackbar with the number of deleted bookmarks.
                         bookmarksDeletedSnackbar = Snackbar.make(findViewById(R.id.bookmarks_coordinatorlayout), getString(R.string.bookmarks_deleted) + "  " + selectedBookmarksIdsLongArray.length,
                                 Snackbar.LENGTH_LONG)
                                 .setAction(R.string.undo, view -> {
@@ -469,50 +500,45 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                                     @SuppressLint("SwitchIntDef")  // Ignore the lint warning about not handling the other possible events as they are covered by `default:`.
                                     @Override
                                     public void onDismissed(Snackbar snackbar, int event) {
-                                        switch (event) {
-                                            // The user pushed the `Undo` button.
-                                            case Snackbar.Callback.DISMISS_EVENT_ACTION:
-                                                // Update the bookmarks cursor with the current contents of the bookmarks database, including the "deleted" bookmarks.
-                                                bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
-
-                                                // Update the list view.
-                                                bookmarksCursorAdapter.changeCursor(bookmarksCursor);
-
-                                                // Re-select the previously selected bookmarks.
-                                                for (int i = 0; i < selectedBookmarksPositionsSparseBooleanArray.size(); i++) {
-                                                    bookmarksListView.setItemChecked(selectedBookmarksPositionsSparseBooleanArray.keyAt(i), true);
-                                                }
-                                                break;
-
-                                            // The Snackbar was dismissed without the `Undo` button being pushed.
-                                            default:
-                                                // Delete each selected bookmark.
-                                                for (long databaseIdLong : selectedBookmarksIdsLongArray) {
-                                                    // Convert `databaseIdLong` to an int.
-                                                    int databaseIdInt = (int) databaseIdLong;
-
-                                                    // Delete the contents of the folder if the selected bookmark is a folder.
-                                                    if (bookmarksDatabaseHelper.isFolder(databaseIdInt)) {
-                                                        deleteBookmarkFolderContents(databaseIdInt);
-                                                    }
-
-                                                    // Delete the selected bookmark.
-                                                    bookmarksDatabaseHelper.deleteBookmark(databaseIdInt);
+                                        if (event == Snackbar.Callback.DISMISS_EVENT_ACTION) {  // The user pushed the undo button.
+                                            // Update the bookmarks cursor with the current contents of the bookmarks database, including the "deleted" bookmarks.
+                                            bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
+
+                                            // Update the list view.
+                                            bookmarksCursorAdapter.changeCursor(bookmarksCursor);
+
+                                            // Re-select the previously selected bookmarks.
+                                            for (int i = 0; i < selectedBookmarksPositionsSparseBooleanArray.size(); i++) {
+                                                bookmarksListView.setItemChecked(selectedBookmarksPositionsSparseBooleanArray.keyAt(i), true);
+                                            }
+                                        } else {  // The snackbar was dismissed without the undo button being pushed.
+                                            // Delete each selected bookmark.
+                                            for (long databaseIdLong : selectedBookmarksIdsLongArray) {
+                                                // Convert `databaseIdLong` to an int.
+                                                int databaseIdInt = (int) databaseIdLong;
+
+                                                // Delete the contents of the folder if the selected bookmark is a folder.
+                                                if (bookmarksDatabaseHelper.isFolder(databaseIdInt)) {
+                                                    deleteBookmarkFolderContents(databaseIdInt);
                                                 }
 
-                                                // Update the display order.
-                                                for (int i = 0; i < bookmarksListView.getCount(); i++) {
-                                                    // Get the database ID for the current bookmark.
-                                                    int currentBookmarkDatabaseId = (int) bookmarksListView.getItemIdAtPosition(i);
+                                                // Delete the selected bookmark.
+                                                bookmarksDatabaseHelper.deleteBookmark(databaseIdInt);
+                                            }
+
+                                            // Update the display order.
+                                            for (int i = 0; i < bookmarksListView.getCount(); i++) {
+                                                // Get the database ID for the current bookmark.
+                                                int currentBookmarkDatabaseId = (int) bookmarksListView.getItemIdAtPosition(i);
 
-                                                    // Move `bookmarksCursor` to the current bookmark position.
-                                                    bookmarksCursor.moveToPosition(i);
+                                                // Move `bookmarksCursor` to the current bookmark position.
+                                                bookmarksCursor.moveToPosition(i);
 
-                                                    // Update the display order only if it is not correct in the database.
-                                                    if (bookmarksCursor.getInt(bookmarksCursor.getColumnIndex(BookmarksDatabaseHelper.DISPLAY_ORDER)) != i) {
-                                                        bookmarksDatabaseHelper.updateDisplayOrder(currentBookmarkDatabaseId, i);
-                                                    }
+                                                // Update the display order only if it is not correct in the database.
+                                                if (bookmarksCursor.getInt(bookmarksCursor.getColumnIndex(BookmarksDatabaseHelper.DISPLAY_ORDER)) != i) {
+                                                    bookmarksDatabaseHelper.updateDisplayOrder(currentBookmarkDatabaseId, i);
                                                 }
+                                            }
                                         }
 
                                         // Reset the deleting bookmarks flag.
@@ -568,12 +594,32 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
         // Set the create new bookmark FAB to display the `AlertDialog`.
         createBookmarkFab.setOnClickListener(view -> {
+            // Remove the incorrect lint warning below.
+            assert currentUrl != null;
+            assert currentTitle != null;
+
             // Instantiate the create bookmark dialog.
             DialogFragment createBookmarkDialog = CreateBookmarkDialog.createBookmark(currentUrl, currentTitle, favoriteIconBitmap);
 
             // 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
@@ -591,6 +637,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.
@@ -663,9 +733,15 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
     @Override
     public void onCreateBookmark(DialogFragment dialogFragment, Bitmap favoriteIconBitmap) {
+        // Get the alert dialog from the fragment.
+        Dialog dialog = dialogFragment.getDialog();
+
+        // Remove the incorrect lint warning below that the dialog might be null.
+        assert dialog != null;
+
         // Get the views from the dialog fragment.
-        EditText createBookmarkNameEditText = dialogFragment.getDialog().findViewById(R.id.create_bookmark_name_edittext);
-        EditText createBookmarkUrlEditText = dialogFragment.getDialog().findViewById(R.id.create_bookmark_url_edittext);
+        EditText createBookmarkNameEditText = dialog.findViewById(R.id.create_bookmark_name_edittext);
+        EditText createBookmarkUrlEditText = dialog.findViewById(R.id.create_bookmark_url_edittext);
 
         // Extract the strings from the edit texts.
         String bookmarkNameString = createBookmarkNameEditText.getText().toString();
@@ -697,11 +773,17 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
     }
 
     @Override
-    public void onCreateBookmarkFolder(DialogFragment dialogFragment, Bitmap favoriteIconBitmap) {
+    public void onCreateBookmarkFolder(DialogFragment dialogFragment, @NonNull Bitmap favoriteIconBitmap) {
+        // Get the dialog from the dialog fragment.
+        Dialog dialog = dialogFragment.getDialog();
+
+        // Remove the incorrect lint warning below that the dialog might be null.
+        assert dialog != null;
+
         // Get handles for the views in the dialog fragment.
-        EditText createFolderNameEditText = dialogFragment.getDialog().findViewById(R.id.create_folder_name_edittext);
-        RadioButton defaultFolderIconRadioButton = dialogFragment.getDialog().findViewById(R.id.create_folder_default_icon_radiobutton);
-        ImageView folderIconImageView = dialogFragment.getDialog().findViewById(R.id.create_folder_default_icon);
+        EditText createFolderNameEditText = dialog.findViewById(R.id.create_folder_name_edittext);
+        RadioButton defaultFolderIconRadioButton = dialog.findViewById(R.id.create_folder_default_icon_radiobutton);
+        ImageView folderIconImageView = dialog.findViewById(R.id.create_folder_default_icon);
 
         // Get new folder name string.
         String folderNameString = createFolderNameEditText.getText().toString();
@@ -753,11 +835,17 @@ 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();
+
+        // Remove the incorrect lint warning below that the dialog might be null.
+        assert dialog != null;
+
         // Get handles for the views from `dialogFragment`.
-        EditText editBookmarkNameEditText = dialogFragment.getDialog().findViewById(R.id.edit_bookmark_name_edittext);
-        EditText editBookmarkUrlEditText = dialogFragment.getDialog().findViewById(R.id.edit_bookmark_url_edittext);
-        RadioButton currentBookmarkIconRadioButton = dialogFragment.getDialog().findViewById(R.id.edit_bookmark_current_icon_radiobutton);
+        EditText editBookmarkNameEditText = dialog.findViewById(R.id.edit_bookmark_name_edittext);
+        EditText editBookmarkUrlEditText = dialog.findViewById(R.id.edit_bookmark_url_edittext);
+        RadioButton currentBookmarkIconRadioButton = dialog.findViewById(R.id.edit_bookmark_current_icon_radiobutton);
 
         // Store the bookmark strings.
         String bookmarkNameString = editBookmarkNameEditText.getText().toString();
@@ -792,11 +880,17 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
     @Override
     public void onSaveBookmarkFolder(DialogFragment dialogFragment, int selectedFolderDatabaseId, Bitmap favoriteIconBitmap) {
+        // Get the dialog from the dialog fragment.
+        Dialog dialog = dialogFragment.getDialog();
+
+        // Remove the incorrect lint warning below that the dialog might be null.
+        assert dialog != null;
+
         // Get handles for the views from `dialogFragment`.
-        RadioButton currentFolderIconRadioButton = dialogFragment.getDialog().findViewById(R.id.edit_folder_current_icon_radiobutton);
-        RadioButton defaultFolderIconRadioButton = dialogFragment.getDialog().findViewById(R.id.edit_folder_default_icon_radiobutton);
-        ImageView defaultFolderIconImageView = dialogFragment.getDialog().findViewById(R.id.edit_folder_default_icon_imageview);
-        EditText editFolderNameEditText = dialogFragment.getDialog().findViewById(R.id.edit_folder_name_edittext);
+        RadioButton currentFolderIconRadioButton = dialog.findViewById(R.id.edit_folder_current_icon_radiobutton);
+        RadioButton defaultFolderIconRadioButton = dialog.findViewById(R.id.edit_folder_default_icon_radiobutton);
+        ImageView defaultFolderIconImageView = dialog.findViewById(R.id.edit_folder_default_icon_imageview);
+        EditText editFolderNameEditText = dialog.findViewById(R.id.edit_folder_name_edittext);
 
         // Get the new folder name.
         String newFolderNameString = editFolderNameEditText.getText().toString();
@@ -879,8 +973,14 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
     @Override
     public void onMoveToFolder(DialogFragment dialogFragment) {
-        // Get a handle for the `ListView` from `dialogFragment`.
-        ListView folderListView = dialogFragment.getDialog().findViewById(R.id.move_to_folder_listview);
+        // Get the dialog from the dialog fragment.
+        Dialog dialog = dialogFragment.getDialog();
+
+        // Remove the incorrect lint warning below that the dialog might be null.
+        assert dialog != null;
+
+        // Get a handle for the list view from the dialog.
+        ListView folderListView = dialog.findViewById(R.id.move_to_folder_listview);
 
         // Store a long array of the selected folders.
         long[] newFolderLongArray = folderListView.getCheckedItemIds();
@@ -957,6 +1057,9 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         // bookmarksListView is 0 indexed.
         int lastBookmarkDatabaseId = (int) bookmarksListView.getItemIdAtPosition(bookmarksListView.getCount() - 1);
 
+        // Get the current theme status.
+        int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
+
         // Update the move bookmark up `MenuItem`.
         if (selectedBookmarkDatabaseId == firstBookmarkDatabaseId) {  // The selected bookmark is in the first position.
             // Disable the move bookmark up `MenuItem`.
@@ -965,14 +1068,14 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
             //  Set the move bookmark up icon to be ghosted.
             moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_disabled);
         } else {  // The selected bookmark is not in the first position.
-            // Enable the move bookmark up `MenuItem`.
+            // Enable the move bookmark up menu item.
             moveBookmarkUpMenuItem.setEnabled(true);
 
             // Set the icon according to the theme.
-            if (MainWebViewActivity.darkTheme) {
-                moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_dark);
+            if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) {
+                moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_night);
             } else {
-                moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_light);
+                moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_day);
             }
         }
 
@@ -988,10 +1091,10 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
             moveBookmarkDownMenuItem.setEnabled(true);
 
             // Set the icon according to the theme.
-            if (MainWebViewActivity.darkTheme) {
-                moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_dark);
+            if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) {
+                moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_night);
             } else {
-                moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_light);
+                moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_day);
             }
         }
     }