]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java
Bump the minimum API to 24 (Android 7).
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / activities / BookmarksActivity.java
index 20dd59652b47652000f33e71349b57da30627827..985414faa1a6706b1dbc2dee966ddd0b8784fd32 100644 (file)
@@ -1,20 +1,20 @@
 /*
- * Copyright © 2016-2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2016-2023 Soren Stoutner <soren@stoutner.com>.
  *
- * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
+ * This file is part of Privacy Browser Android <https://www.stoutner.com/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 <http://www.gnu.org/licenses/>.
+ * along with Privacy Browser Android.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 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) -> {
@@ -452,7 +450,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                     boolean isFolder = (bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.IS_FOLDER)) == 1);
 
                     // Get the selected bookmark database ID.
-                    int databaseId = bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper._ID));
+                    int databaseId = bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.ID));
 
                     // Show the edit bookmark or edit bookmark folder dialog.
                     if (isFolder) {
@@ -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<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);
-                    }
-                }
+                // 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.getColumnIndexOrThrow(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.getColumnIndexOrThrow(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);
         }
     }
 
@@ -1228,4 +1218,4 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         // Run the default commands.
         super.onDestroy();
     }
-}
\ No newline at end of file
+}