/*
* Copyright 2016-2024 Soren Stoutner <soren@stoutner.com>.
*
- * This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
+ * This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android/>.
*
* Privacy Browser Android is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
import java.util.function.Consumer
// Define the public constants.
-const val CURRENT_FAVORITE_ICON_BYTE_ARRAY = "A"
-const val CURRENT_FOLDER_ID = "B"
-const val CURRENT_TITLE = "C"
+const val CURRENT_FAVORITE_ICON_BYTE_ARRAY = "current_favorite_icon_byte_array"
+const val CURRENT_FOLDER_ID = "current_folder_id"
+const val CURRENT_TITLE = "current_title"
// Define the private constants.
-private const val CHECKED_BOOKMARKS_ARRAY_LIST = "D"
+private const val CHECKED_BOOKMARKS_ARRAY_LIST = "checked_bookmarks_array_list"
class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookmarkListener, CreateBookmarkFolderDialog.CreateBookmarkFolderListener, EditBookmarkDialog.EditBookmarkListener,
EditBookmarkFolderDialog.EditBookmarkFolderListener, MoveToFolderDialog.MoveToFolderListener {
private var checkingManyBookmarks = false
private var closeActivityAfterDismissingSnackbar = false
private var contextualActionMode: ActionMode? = null
+ private var sortBookmarksAlphabetically = false
// Declare the class variables.
private lateinit var appBar: ActionBar
// Get the preferences.
val allowScreenshots = sharedPreferences.getBoolean(getString(R.string.allow_screenshots_key), false)
val bottomAppBar = sharedPreferences.getBoolean(getString(R.string.bottom_app_bar_key), false)
+ sortBookmarksAlphabetically = sharedPreferences.getBoolean(getString(R.string.sort_bookmarks_alphabetically_key), false)
// Disable screenshots if not allowed.
if (!allowScreenshots) {
deleteBookmarksMenuItem = menu.findItem(R.id.delete_bookmark)
selectAllBookmarksMenuItem = menu.findItem(R.id.context_menu_select_all_bookmarks)
+ // Hide the move up and down menu items if bookmarks are sorted alphabetically.
+ if (sortBookmarksAlphabetically) {
+ moveBookmarkUpMenuItem.isVisible = false
+ moveBookmarkDownMenuItem.isVisible = false
+ }
+
// Disable the delete bookmarks menu item if a delete is pending.
deleteBookmarksMenuItem.isEnabled = !deletingBookmarks
if (numberOfSelectedBookmarks > 0) {
// Adjust the action mode and the menu according to the number of selected bookmarks.
if (numberOfSelectedBookmarks == 1) { // One bookmark is selected.
- // Show the applicable menu items.
- moveBookmarkUpMenuItem.isVisible = true
- moveBookmarkDownMenuItem.isVisible = true
+ // Update the move menu items if the bookmarks are not sorted alphabetically.
+ if (!sortBookmarksAlphabetically) {
+ moveBookmarkUpMenuItem.isVisible = true
+ moveBookmarkDownMenuItem.isVisible = true
+ }
+
+ // Show the edit bookmark menu item.
editBookmarkMenuItem.isVisible = true
- // Update the enabled status of the move icons.
- updateMoveIcons()
+ // Update the enabled status of the move icons if the bookmarks are not sorted alphabetically.
+ if (!sortBookmarksAlphabetically)
+ updateMoveIcons()
} else { // More than one bookmark is selected.
- // Hide non-applicable `MenuItems`.
- moveBookmarkUpMenuItem.isVisible = false
- moveBookmarkDownMenuItem.isVisible = false
+ // Update the move menu items if the bookmarks are not sorted alphabetically.
+ if (!sortBookmarksAlphabetically) {
+ moveBookmarkUpMenuItem.isVisible = false
+ moveBookmarkDownMenuItem.isVisible = false
+ }
+
+ // Hide the edit bookmark menu item.
editBookmarkMenuItem.isVisible = false
}
checkedBookmarksPositionsSparseBooleanArray = bookmarksListView.checkedItemPositions.clone()
// Update the bookmarks cursor with the current contents of the bookmarks database except for the specified database IDs.
- bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrderExcept(checkedBookmarksIdsLongArray, currentFolderId)
+ bookmarksCursor = if (sortBookmarksAlphabetically)
+ bookmarksDatabaseHelper.getBookmarksSortedAlphabeticallyExcept(checkedBookmarksIdsLongArray, currentFolderId)
+ else
+ bookmarksDatabaseHelper.getBookmarksByDisplayOrderExcept(checkedBookmarksIdsLongArray, currentFolderId)
// Update the list view.
bookmarksCursorAdapter.changeCursor(bookmarksCursor)
override fun onDismissed(snackbar: Snackbar, event: Int) {
if (event == 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(currentFolderId)
+ bookmarksCursor = if (sortBookmarksAlphabetically)
+ bookmarksDatabaseHelper.getBookmarksSortedAlphabetically(currentFolderId)
+ else
+ bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
// Update the list view.
bookmarksCursorAdapter.changeCursor(bookmarksCursor)
bookmarksDatabaseHelper.deleteBookmark(databaseIdInt)
}
- // Update the display order.
- for (i in 0 until bookmarksListView.count) {
- // Get the database ID for the current bookmark.
- val currentBookmarkDatabaseId = bookmarksListView.getItemIdAtPosition(i).toInt()
-
- // Move bookmarks cursor 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.getColumnIndexOrThrow(DISPLAY_ORDER)) != i)
- bookmarksDatabaseHelper.updateDisplayOrder(currentBookmarkDatabaseId, i)
- }
+ // Recalculate the display order of the current folder.
+ bookmarksDatabaseHelper.recalculateFolderContentsDisplayOrder(currentFolderId)
}
// Reset the deleting bookmarks flag.
}
}
- public override fun onSaveInstanceState(savedInstanceState: Bundle) {
+ public override fun onSaveInstanceState(outState: Bundle) {
// Run the default commands.
- super.onSaveInstanceState(savedInstanceState)
+ super.onSaveInstanceState(outState)
// Get the sparse boolean array of the checked items.
val checkedBookmarksSparseBooleanArray = bookmarksListView.checkedItemPositions
}
}
- // Store the variables in the saved instance state.
- savedInstanceState.putLong(CURRENT_FOLDER_ID, currentFolderId)
- savedInstanceState.putIntegerArrayList(CHECKED_BOOKMARKS_ARRAY_LIST, checkedBookmarksArrayList)
+ // Store the variables in the out state.
+ outState.putLong(CURRENT_FOLDER_ID, currentFolderId)
+ outState.putIntegerArrayList(CHECKED_BOOKMARKS_ARRAY_LIST, checkedBookmarksArrayList)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
bookmarksDatabaseHelper.createBookmark(bookmarkNameString, bookmarkUrlString, currentFolderId, newBookmarkDisplayOrder, favoriteIconByteArray)
// Update the bookmarks cursor with the current contents of this folder.
- bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
+ bookmarksCursor = if (sortBookmarksAlphabetically)
+ bookmarksDatabaseHelper.getBookmarksSortedAlphabetically(currentFolderId)
+ else
+ bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
// Update the list view.
bookmarksCursorAdapter.changeCursor(bookmarksCursor)
bookmarksDatabaseHelper.createFolder(folderNameString, currentFolderId, displayOrder = 0, folderIconByteArray)
// Update the bookmarks cursor with the contents of the current folder.
- bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
+ bookmarksCursor = if (sortBookmarksAlphabetically)
+ bookmarksDatabaseHelper.getBookmarksSortedAlphabetically(currentFolderId)
+ else
+ bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
// Update the list view.
bookmarksCursorAdapter.changeCursor(bookmarksCursor)
contextualActionMode?.finish()
// Update the bookmarks cursor with the contents of the current folder.
- bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
+ bookmarksCursor = if (sortBookmarksAlphabetically)
+ bookmarksDatabaseHelper.getBookmarksSortedAlphabetically(currentFolderId)
+ else
+ bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
// Update the list view.
bookmarksCursorAdapter.changeCursor(bookmarksCursor)
}
// Update the bookmarks cursor with the current contents of this folder.
- bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
+ bookmarksCursor = if (sortBookmarksAlphabetically)
+ bookmarksDatabaseHelper.getBookmarksSortedAlphabetically(currentFolderId)
+ else
+ bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
// Update the list view.
bookmarksCursorAdapter.changeCursor(bookmarksCursor)
bookmarksDatabaseHelper.moveToFolder(databaseIdInt, newFolderId)
}
+ // Recalculate the display order of the current folder.
+ bookmarksDatabaseHelper.recalculateFolderContentsDisplayOrder(currentFolderId)
+
// Update the bookmarks cursor with the current contents of this folder.
- bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
+ bookmarksCursor = if (sortBookmarksAlphabetically)
+ bookmarksDatabaseHelper.getBookmarksSortedAlphabetically(currentFolderId)
+ else
+ bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
// Update the list view.
bookmarksCursorAdapter.changeCursor(bookmarksCursor)
private fun loadFolder() {
// Update the bookmarks cursor with the contents of the bookmarks database for the current folder.
- bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
+ bookmarksCursor = if (sortBookmarksAlphabetically)
+ bookmarksDatabaseHelper.getBookmarksSortedAlphabetically(currentFolderId)
+ else
+ bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId)
// Setup a cursor adapter.
bookmarksCursorAdapter = object : CursorAdapter(this, bookmarksCursor, false) {