X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FBookmarksActivity.java;h=985414faa1a6706b1dbc2dee966ddd0b8784fd32;hb=514e93baaa8389dc9c5abdb79e68c890c260b8d3;hp=9e33c0d22caecc15b2fc7e092c27a9591953551b;hpb=1d656c562831f535aa33903d44198dd890393f4f;p=PrivacyBrowserAndroid.git 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 9e33c0d2..985414fa 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java @@ -1,20 +1,20 @@ /* - * Copyright © 2016-2021 Soren Stoutner . + * Copyright 2016-2023 Soren Stoutner . * - * This file is part of Privacy Browser . + * This file is part of Privacy Browser Android . * - * Privacy Browser is free software: you can redistribute it and/or modify + * 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 * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * Privacy Browser is distributed in the hope that it will be useful, + * Privacy Browser Android is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Privacy Browser. If not, see . + * along with Privacy Browser Android. If not, see . */ package com.stoutner.privacybrowser.activities; @@ -24,7 +24,6 @@ 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; @@ -32,7 +31,6 @@ 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; @@ -49,21 +47,23 @@ import android.widget.ListView; import android.widget.RadioButton; import android.widget.TextView; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.DialogFragment; +import androidx.preference.PreferenceManager; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; +import com.stoutner.privacybrowser.R; import com.stoutner.privacybrowser.dialogs.CreateBookmarkDialog; import com.stoutner.privacybrowser.dialogs.CreateBookmarkFolderDialog; import com.stoutner.privacybrowser.dialogs.EditBookmarkDialog; import com.stoutner.privacybrowser.dialogs.EditBookmarkFolderDialog; import com.stoutner.privacybrowser.dialogs.MoveToFolderDialog; -import com.stoutner.privacybrowser.R; import com.stoutner.privacybrowser.helpers.BookmarksDatabaseHelper; import java.io.ByteArrayOutputStream; @@ -72,23 +72,22 @@ import java.util.ArrayList; public class BookmarksActivity extends AppCompatActivity implements CreateBookmarkDialog.CreateBookmarkListener, CreateBookmarkFolderDialog.CreateBookmarkFolderListener, EditBookmarkDialog.EditBookmarkListener, EditBookmarkFolderDialog.EditBookmarkFolderListener, MoveToFolderDialog.MoveToFolderListener { - // `currentFolder` is public static so it can be accessed from `BookmarksDatabaseViewActivity`. + // Declare the public static variables, which are accessed from the bookmarks database view activity. public static String currentFolder; - - // `restartFromBookmarksDatabaseViewActivity` is public static so it can be accessed from `BookmarksDatabaseViewActivity`. It is also used in `onRestart()`. public static boolean restartFromBookmarksDatabaseViewActivity; - // Define the saved instance state constants. private final String CHECKED_BOOKMARKS_ARRAY_LIST = "checked_bookmarks_array_list"; + private final String CURRENT_FOLDER = "current_folder"; // 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()`. + // Declare the class variables. private BookmarksDatabaseHelper bookmarksDatabaseHelper; + private Snackbar bookmarksDeletedSnackbar; + private boolean closeActivityAfterDismissingSnackbar; // `bookmarksListView` is used in `onCreate()`, `onOptionsItemSelected()`, `onCreateBookmark()`, `onCreateBookmarkFolder()`, `onSaveBookmark()`, `onSaveBookmarkFolder()`, `onMoveToFolder()`, // `updateMoveIcons()`, `scrollBookmarks()`, and `loadFolder()`. @@ -110,12 +109,6 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma // `oldFolderName` is used in `onCreate()` and `onSaveBookmarkFolder()`. private String oldFolderNameString; - // `bookmarksDeletedSnackbar` is used in `onCreate()`, `onOptionsItemSelected()`, and `onBackPressed()`. - private Snackbar bookmarksDeletedSnackbar; - - // `closeActivityAfterDismissingSnackbar` is used in `onCreate()`, `onOptionsItemSelected()`, and `onBackPressed()`. - private boolean closeActivityAfterDismissingSnackbar; - // The favorite icon byte array is populated in `onCreate()` and used in `onOptionsItemSelected()`. private byte[] favoriteIconByteArray; @@ -133,9 +126,6 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } - // Set the theme. - setTheme(R.style.PrivacyBrowser); - // Run the default commands. super.onCreate(savedInstanceState); @@ -190,12 +180,20 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma // Display the home arrow on the app bar. appBar.setDisplayHomeAsUpEnabled(true); - // Initialize the database helper. `this` specifies the context. The two `nulls` do not specify the database name or a `CursorFactory`. - // The `0` specifies a database version, but that is ignored and set instead using a constant in `BookmarksDatabaseHelper`. - bookmarksDatabaseHelper = new BookmarksDatabaseHelper(this, null, null, 0); + // Control what the system back command does. + OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + // Prepare to finish the activity. + prepareFinish(); + } + }; - // Load the home folder. - loadFolder(); + // Register the on back pressed callback. + getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback); + + // Initialize the database helper. + bookmarksDatabaseHelper = new BookmarksDatabaseHelper(this); // Set a listener so that tapping a list item loads the URL or folder. bookmarksListView.setOnItemClickListener((parent, view, position, id) -> { @@ -209,9 +207,9 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma bookmarkCursor.moveToFirst(); // Act upon the bookmark according to the type. - if (bookmarkCursor.getInt(bookmarkCursor.getColumnIndex(BookmarksDatabaseHelper.IS_FOLDER)) == 1) { // The selected bookmark is a folder. + if (bookmarkCursor.getInt(bookmarkCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.IS_FOLDER)) == 1) { // The selected bookmark is a folder. // Update the current folder. - currentFolder = bookmarkCursor.getString(bookmarkCursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_NAME)); + currentFolder = bookmarkCursor.getString(bookmarkCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.BOOKMARK_NAME)); // Load the new folder. loadFolder(); @@ -359,7 +357,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma 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) { + if (bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.DISPLAY_ORDER)) != i) { bookmarksDatabaseHelper.updateDisplayOrder(currentBookmarkDatabaseId, i); } } @@ -409,7 +407,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma 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) { + if (bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.DISPLAY_ORDER)) != i) { bookmarksDatabaseHelper.updateDisplayOrder(currentBookmarkDatabaseId, i); } } @@ -449,15 +447,15 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma bookmarksCursor.moveToPosition(selectedBookmarkPosition); // Find out if this bookmark is a folder. - boolean isFolder = (bookmarksCursor.getInt(bookmarksCursor.getColumnIndex(BookmarksDatabaseHelper.IS_FOLDER)) == 1); + boolean isFolder = (bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.IS_FOLDER)) == 1); // Get the selected bookmark database ID. - int databaseId = bookmarksCursor.getInt(bookmarksCursor.getColumnIndex(BookmarksDatabaseHelper._ID)); + int databaseId = bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.ID)); // Show the edit bookmark or edit bookmark folder dialog. if (isFolder) { // Save the current folder name, which is used in `onSaveBookmarkFolder()`. - oldFolderNameString = bookmarksCursor.getString(bookmarksCursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_NAME)); + oldFolderNameString = bookmarksCursor.getString(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.BOOKMARK_NAME)); // Instantiate the edit bookmark folder dialog. DialogFragment editFolderDialog = EditBookmarkFolderDialog.folderDatabaseId(databaseId, favoriteIconBitmap); @@ -550,7 +548,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma 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) { + if (bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.DISPLAY_ORDER)) != i) { bookmarksDatabaseHelper.updateDisplayOrder(currentBookmarkDatabaseId, i); } } @@ -564,7 +562,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma // Close the activity if back has been pressed. if (closeActivityAfterDismissingSnackbar) { - onBackPressed(); + finish(); } } }); @@ -619,19 +617,22 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma // Restore the state if the app has been restarted. if (savedInstanceState != null) { + // Restore the current folder. + currentFolder = savedInstanceState.getString(CURRENT_FOLDER); + // 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); - } - } + // Check each previously checked bookmark in the list view. + if (checkedBookmarksArrayList != null) + checkedBookmarksArrayList.forEach((position) -> bookmarksListView.setItemChecked(position, true)); }); } + + // Load the home folder. + loadFolder(); } @Override @@ -669,7 +670,8 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma } } - // Store the checked items array list in the saved instance state. + // Store the variables in the saved instance state. + savedInstanceState.putString(CURRENT_FOLDER, currentFolder); savedInstanceState.putIntegerArrayList(CHECKED_BOOKMARKS_ARRAY_LIST, checkedBookmarksArrayList); } @@ -690,8 +692,8 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma // Run the command according to the selected option. if (menuItemId == android.R.id.home) { // Home. The home arrow is identified as `android.R.id.home`, not just `R.id.home`. if (currentFolder.isEmpty()) { // Currently in the home folder. - // Run the back commands. - onBackPressed(); + // Prepare to finish the activity. + prepareFinish(); } else { // Currently in a subfolder. // Place the former parent folder in `currentFolder`. currentFolder = bookmarksDatabaseHelper.getParentFolderName(currentFolder); @@ -725,27 +727,6 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma return true; } - @Override - public void onBackPressed() { - // Check to see if a snackbar is currently displayed. If so, it must be closed before exiting so that a pending delete is completed before reloading the list view in the bookmarks drawer. - if ((bookmarksDeletedSnackbar != null) && bookmarksDeletedSnackbar.isShown()) { // Close the bookmarks deleted snackbar before going home. - // Set the close flag. - closeActivityAfterDismissingSnackbar = true; - - // Dismiss the snackbar. - bookmarksDeletedSnackbar.dismiss(); - } else { // Go home immediately. - // Update the bookmarks folder for the bookmarks drawer in the main WebView activity. - MainWebViewActivity.currentBookmarksFolder = currentFolder; - - // Close the bookmarks drawer and reload the bookmarks ListView when returning to the main WebView activity. - MainWebViewActivity.restartFromBookmarksActivity = true; - - // Exit the bookmarks activity. - super.onBackPressed(); - } - } - @Override public void onCreateBookmark(DialogFragment dialogFragment, Bitmap favoriteIconBitmap) { // Get the alert dialog from the fragment. @@ -1056,7 +1037,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma folderCursor.moveToPosition(i); // Get the database ID of the item. - int itemDatabaseId = folderCursor.getInt(folderCursor.getColumnIndex(BookmarksDatabaseHelper._ID)); + int itemDatabaseId = folderCursor.getInt(folderCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.ID)); // If this is a folder, recursively count the contents first. if (bookmarksDatabaseHelper.isFolder(itemDatabaseId)) { @@ -1085,7 +1066,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma folderCursor.moveToPosition(i); // Get the database ID of the item. - int itemDatabaseId = folderCursor.getInt(folderCursor.getColumnIndex(BookmarksDatabaseHelper._ID)); + int itemDatabaseId = folderCursor.getInt(folderCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.ID)); // If this is a folder, recursively delete the contents first. if (bookmarksDatabaseHelper.isFolder(itemDatabaseId)) { @@ -1097,6 +1078,26 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma } } + private void prepareFinish() { + // Check to see if a snackbar is currently displayed. If so, it must be closed before exiting so that a pending delete is completed before reloading the list view in the bookmarks drawer. + if ((bookmarksDeletedSnackbar != null) && bookmarksDeletedSnackbar.isShown()) { // Close the bookmarks deleted snackbar before going home. + // Set the close flag. + closeActivityAfterDismissingSnackbar = true; + + // Dismiss the snackbar. + bookmarksDeletedSnackbar.dismiss(); + } else { // Go home immediately. + // Update the bookmarks folder for the bookmarks drawer in the main WebView activity. + MainWebViewActivity.currentBookmarksFolder = currentFolder; + + // Close the bookmarks drawer and reload the bookmarks ListView when returning to the main WebView activity. + MainWebViewActivity.restartFromBookmarksActivity = true; + + // Exit the bookmarks activity. + finish(); + } + } + private void updateMoveIcons() { // Get a long array of the selected bookmarks. long[] selectedBookmarksLongArray = bookmarksListView.getCheckedItemIds(); @@ -1107,45 +1108,34 @@ 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`. + // Update the move bookmark up menu item. if (selectedBookmarkDatabaseId == firstBookmarkDatabaseId) { // The selected bookmark is in the first position. - // Disable the move bookmark up `MenuItem`. + // Disable the move bookmark up menu item. moveBookmarkUpMenuItem.setEnabled(false); - // Set the move bookmark up icon to be ghosted. + // Set the icon. moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_disabled); } else { // The selected bookmark is not in the first position. // Enable the move bookmark up menu item. moveBookmarkUpMenuItem.setEnabled(true); // Set the icon according to the theme. - if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) { - moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_night); - } else { - moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_day); - } + moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled); } - // Update the move bookmark down `MenuItem`. + // Update the move bookmark down menu item. if (selectedBookmarkDatabaseId == lastBookmarkDatabaseId) { // The selected bookmark is in the last position. - // Disable the move bookmark down `MenuItem`. + // Disable the move bookmark down menu item. moveBookmarkDownMenuItem.setEnabled(false); - // Set the move bookmark down icon to be ghosted. + // Set the icon. moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_disabled); } else { // The selected bookmark is not in the last position. - // Enable the move bookmark down `MenuItem`. + // Enable the move bookmark down menu item. moveBookmarkDownMenuItem.setEnabled(true); - // Set the icon according to the theme. - if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) { - moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_night); - } else { - moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_day); - } + // Set the icon. + moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled); } } @@ -1187,7 +1177,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma TextView bookmarkNameTextView = view.findViewById(R.id.bookmark_name); // Get the favorite icon byte array from the `Cursor`. - byte[] favoriteIconByteArray = cursor.getBlob(cursor.getColumnIndex(BookmarksDatabaseHelper.FAVORITE_ICON)); + byte[] favoriteIconByteArray = cursor.getBlob(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.FAVORITE_ICON)); // Convert the byte array to a `Bitmap` beginning at the first byte and ending at the last. Bitmap favoriteIconBitmap = BitmapFactory.decodeByteArray(favoriteIconByteArray, 0, favoriteIconByteArray.length); @@ -1196,11 +1186,11 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma bookmarkFavoriteIcon.setImageBitmap(favoriteIconBitmap); // Get the bookmark name from the cursor and display it in `bookmarkNameTextView`. - String bookmarkNameString = cursor.getString(cursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_NAME)); + String bookmarkNameString = cursor.getString(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.BOOKMARK_NAME)); bookmarkNameTextView.setText(bookmarkNameString); // Make the font bold for folders. - if (cursor.getInt(cursor.getColumnIndex(BookmarksDatabaseHelper.IS_FOLDER)) == 1) { + if (cursor.getInt(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.IS_FOLDER)) == 1) { bookmarkNameTextView.setTypeface(Typeface.DEFAULT_BOLD); } else { // Reset the font to default for normal bookmarks. bookmarkNameTextView.setTypeface(Typeface.DEFAULT); @@ -1228,4 +1218,4 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma // Run the default commands. super.onDestroy(); } -} \ No newline at end of file +}