import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
+import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.CursorAdapter;
// Get a handle for the shared preferences.
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- // Get the screenshot preference.
- boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
+ // Get the preferences.
+ boolean allowScreenshots = sharedPreferences.getBoolean(getString(R.string.allow_screenshots_key), false);
+ boolean bottomAppBar = sharedPreferences.getBoolean(getString(R.string.bottom_app_bar_key), false);
// Disable screenshots if not allowed.
if (!allowScreenshots) {
// Convert the favorite icon byte array to a bitmap.
Bitmap favoriteIconBitmap = BitmapFactory.decodeByteArray(favoriteIconByteArray, 0, favoriteIconByteArray.length);
- // Set the content view.
- setContentView(R.layout.bookmarks_coordinatorlayout);
+ // Set the content according to the app bar position.
+ if (bottomAppBar) {
+ // Set the content view.
+ setContentView(R.layout.bookmarks_coordinatorlayout_bottom_appbar);
+ } else {
+ // `Window.FEATURE_ACTION_MODE_OVERLAY` makes the contextual action mode cover the support action bar. It must be requested before the content is set.
+ supportRequestWindowFeature(Window.FEATURE_ACTION_MODE_OVERLAY);
+
+ // Set the content view.
+ setContentView(R.layout.bookmarks_coordinatorlayout_top_appbar);
+ }
- // The AndroidX toolbar must be used until the minimum API is >= 21.
+ // Get a handle for the toolbar.
final Toolbar toolbar = findViewById(R.id.bookmarks_toolbar);
+
+ // Set the support action bar.
setSupportActionBar(toolbar);
// Get handles for the views.
// Initialize the selected bookmark position.
int selectedBookmarkPosition = 0;
- // Get a handle for the menu item ID.
+ // Get the menu item ID.
int menuItemId = menuItem.getItemId();
// Run the commands according to the selected action item.
// Get an array of the selected row IDs.
final long[] selectedBookmarksIdsLongArray = bookmarksListView.getCheckedItemIds();
+ // Initialize a variable to count the number of bookmarks to delete.
+ int numberOfBookmarksToDelete = 0;
+
+ // Count the number of bookmarks.
+ for (long databaseIdLong : selectedBookmarksIdsLongArray) {
+ // Convert the database ID long to an int.
+ int databaseIdInt = (int) databaseIdLong;
+
+ // Count the contents of the folder if the selected bookmark is a folder.
+ if (bookmarksDatabaseHelper.isFolder(databaseIdInt)) {
+ // Add the bookmarks from the folder to the running total.
+ numberOfBookmarksToDelete = numberOfBookmarksToDelete + countBookmarkFolderContents(databaseIdInt);
+ }
+
+ // Increment the count of the number of bookmarks to delete.
+ numberOfBookmarksToDelete++;
+ }
+
// Get an array of checked bookmarks. `.clone()` makes a copy that won't change if the list view is reloaded, which is needed for re-selecting the bookmarks on undelete.
selectedBookmarksPositionsSparseBooleanArray = bookmarksListView.getCheckedItemPositions().clone();
bookmarksCursorAdapter.changeCursor(bookmarksCursor);
// Create a Snackbar with the number of deleted bookmarks.
- bookmarksDeletedSnackbar = Snackbar.make(findViewById(R.id.bookmarks_coordinatorlayout), getString(R.string.bookmarks_deleted) + " " + selectedBookmarksIdsLongArray.length,
+ bookmarksDeletedSnackbar = Snackbar.make(findViewById(R.id.bookmarks_coordinatorlayout), getString(R.string.bookmarks_deleted) + " " + numberOfBookmarksToDelete,
Snackbar.LENGTH_LONG)
.setAction(R.string.undo, view -> {
// Do nothing because everything will be handled by `onDismissed()` below.
bookmarksListView.setItemChecked(i, true);
}
} else if (menuItemId == R.id.bookmarks_database_view) {
+ // Close the contextual action bar if it is displayed. This can happen if the bottom app bar is enabled.
+ if (contextualActionMode != null) {
+ contextualActionMode.finish();
+ }
+
// Create an intent to launch the bookmarks database view activity.
Intent bookmarksDatabaseViewIntent = new Intent(this, BookmarksDatabaseViewActivity.class);
assert dialog != null;
// Get handles for the views in the dialog fragment.
- 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);
+ EditText folderNameEditText = dialog.findViewById(R.id.folder_name_edittext);
+ RadioButton defaultIconRadioButton = dialog.findViewById(R.id.default_icon_radiobutton);
+ ImageView defaultIconImageView = dialog.findViewById(R.id.default_icon_imageview);
// Get new folder name string.
- String folderNameString = createFolderNameEditText.getText().toString();
+ String folderNameString = folderNameEditText.getText().toString();
// Create a folder icon bitmap.
Bitmap folderIconBitmap;
// Set the folder icon bitmap according to the dialog.
- if (defaultFolderIconRadioButton.isChecked()) { // Use the default folder icon.
+ if (defaultIconRadioButton.isChecked()) { // Use the default folder icon.
// Get the default folder icon drawable.
- Drawable folderIconDrawable = folderIconImageView.getDrawable();
+ Drawable folderIconDrawable = defaultIconImageView.getDrawable();
// Convert the folder icon drawable to a bitmap drawable.
BitmapDrawable folderIconBitmapDrawable = (BitmapDrawable) folderIconDrawable;
// Update the bookmarks cursor with the current contents of this folder.
bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolder);
- // Update the `ListView`.
+ // Update the list view.
bookmarksCursorAdapter.changeCursor(bookmarksCursor);
// Scroll to the new folder.
// Remove the incorrect lint warning below that the dialog might be null.
assert dialog != null;
- // Get handles for the views from `dialogFragment`.
- 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);
+ // Get handles for the views from the dialog fragment.
+ EditText bookmarkNameEditText = dialog.findViewById(R.id.bookmark_name_edittext);
+ EditText bookmarkUrlEditText = dialog.findViewById(R.id.bookmark_url_edittext);
+ RadioButton currentIconRadioButton = dialog.findViewById(R.id.current_icon_radiobutton);
// Store the bookmark strings.
- String bookmarkNameString = editBookmarkNameEditText.getText().toString();
- String bookmarkUrlString = editBookmarkUrlEditText.getText().toString();
+ String bookmarkNameString = bookmarkNameEditText.getText().toString();
+ String bookmarkUrlString = bookmarkUrlEditText.getText().toString();
// Update the bookmark.
- if (currentBookmarkIconRadioButton.isChecked()) { // Update the bookmark without changing the favorite icon.
+ if (currentIconRadioButton.isChecked()) { // Update the bookmark without changing the favorite icon.
bookmarksDatabaseHelper.updateBookmark(selectedBookmarkDatabaseId, bookmarkNameString, bookmarkUrlString);
} else { // Update the bookmark using the WebView favorite icon.
// Create a favorite icon byte array output stream.
// Remove the incorrect lint warning below that the dialog might be null.
assert dialog != null;
- // Get handles for the views from `dialogFragment`.
- 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 handles for the views from the dialog fragment.
+ RadioButton currentFolderIconRadioButton = dialog.findViewById(R.id.current_icon_radiobutton);
+ RadioButton defaultFolderIconRadioButton = dialog.findViewById(R.id.default_icon_radiobutton);
+ ImageView defaultFolderIconImageView = dialog.findViewById(R.id.default_icon_imageview);
+ EditText editFolderNameEditText = dialog.findViewById(R.id.folder_name_edittext);
// Get the new folder name.
String newFolderNameString = editFolderNameEditText.getText().toString();
contextualActionMode.finish();
}
+ private int countBookmarkFolderContents(int databaseId) {
+ // Initialize the bookmark counter.
+ int bookmarkCounter = 0;
+
+ // Get the name of the folder.
+ String folderName = bookmarksDatabaseHelper.getFolderName(databaseId);
+
+ // Get the contents of the folder.
+ Cursor folderCursor = bookmarksDatabaseHelper.getBookmarkIds(folderName);
+
+ // Count each of the bookmarks in the folder.
+ for (int i = 0; i < folderCursor.getCount(); i++) {
+ // Move the folder cursor to the current row.
+ folderCursor.moveToPosition(i);
+
+ // Get the database ID of the item.
+ int itemDatabaseId = folderCursor.getInt(folderCursor.getColumnIndex(BookmarksDatabaseHelper._ID));
+
+ // If this is a folder, recursively count the contents first.
+ if (bookmarksDatabaseHelper.isFolder(itemDatabaseId)) {
+ // Add the bookmarks from the folder to the running total.
+ bookmarkCounter = bookmarkCounter + countBookmarkFolderContents(itemDatabaseId);
+ }
+
+ // Add the bookmark to the running total.
+ bookmarkCounter++;
+ }
+
+ // Return the bookmark counter.
+ return bookmarkCounter;
+ }
+
private void deleteBookmarkFolderContents(int databaseId) {
// Get the name of the folder.
String folderName = bookmarksDatabaseHelper.getFolderName(databaseId);
// Get the contents of the folder.
- Cursor folderCursor = bookmarksDatabaseHelper.getBookmarkIDs(folderName);
+ Cursor folderCursor = bookmarksDatabaseHelper.getBookmarkIds(folderName);
// Delete each of the bookmarks in the folder.
for (int i = 0; i < folderCursor.getCount(); i++) {
- // Move `folderCursor` to the current row.
+ // Move the folder cursor to the current row.
folderCursor.moveToPosition(i);
// Get the database ID of the item.