]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java
Fix bug that sometimes caused editing and moving of bookmarks to operate on the wrong...
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / activities / BookmarksActivity.java
index 67cff69d917672d1a2c2fe360341fb6240b9b8be..e4d960a04aaf102bbdcff856725c5ac951e045e4 100644 (file)
@@ -25,6 +25,7 @@ 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;
@@ -51,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;
 
@@ -67,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 {
@@ -84,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;
@@ -108,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;
 
@@ -128,8 +131,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         // Get a handle for the shared preferences.
         SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
 
-        // Get the theme and screenshot preferences.
-        boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
+        // Get the screenshot preference.
         boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
 
         // Disable screenshots if not allowed.
@@ -137,12 +139,8 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
             getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
         }
 
-        // Set the activity theme.
-        if (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);
@@ -321,18 +319,26 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
             @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;
@@ -377,8 +383,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;
@@ -432,8 +444,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);
@@ -587,6 +605,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
@@ -604,6 +638,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.
@@ -778,7 +836,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();
 
@@ -991,12 +1049,6 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
     }
 
     private void updateMoveIcons() {
-        // Get a handle for the shared preferences.
-        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
-
-        // Get the theme and screenshot preferences.
-        boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
-
         // Get a long array of the selected bookmarks.
         long[] selectedBookmarksLongArray = bookmarksListView.getCheckedItemIds();
 
@@ -1006,6 +1058,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`.
@@ -1014,14 +1069,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 (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);
             }
         }
 
@@ -1037,10 +1092,10 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
             moveBookmarkDownMenuItem.setEnabled(true);
 
             // Set the icon according to the theme.
-            if (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);
             }
         }
     }