X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FBookmarksActivity.java;h=e4d960a04aaf102bbdcff856725c5ac951e045e4;hp=3a96929f897263bf1590279083faf4314a5b409a;hb=e423f29fb953f8c77e16ea84d58ebd9693172c8b;hpb=74655c0cd0ba72c80ac6c48df55bc3d2f5280ad2 diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java index 3a96929f..e4d960a0 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java @@ -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; @@ -317,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; @@ -373,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; @@ -428,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); @@ -583,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 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 +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 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 +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();