]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java
Save and restore the app state. https://redmine.stoutner.com/issues/461
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / activities / BookmarksActivity.java
index 67cff69d917672d1a2c2fe360341fb6240b9b8be..735d3e39793c951699bb31475e881deb6d2fab0d 100644 (file)
@@ -25,6 +25,7 @@ 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;
@@ -51,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;
 
@@ -67,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 {
@@ -84,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;
@@ -108,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;
 
@@ -128,8 +131,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         // Get a handle for the shared preferences.
         SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
 
-        // Get the theme and screenshot preferences.
-        boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
+        // Get the screenshot preference.
         boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
 
         // Disable screenshots if not allowed.
@@ -137,12 +139,8 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
             getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
         }
 
-        // Set the activity theme.
-        if (darkTheme) {
-            setTheme(R.style.PrivacyBrowserDark_SecondaryActivity);
-        } else {
-            setTheme(R.style.PrivacyBrowserLight_SecondaryActivity);
-        }
+        // Set the theme.
+        setTheme(R.style.PrivacyBrowser);
 
         // Run the default commands.
         super.onCreate(savedInstanceState);
@@ -587,6 +585,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<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);
+                    }
+                }
+            });
+        }
     }
 
     @Override
@@ -604,6 +618,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<Integer> 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.
@@ -991,12 +1029,6 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
     }
 
     private void updateMoveIcons() {
-        // Get a handle for the shared preferences.
-        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
-
-        // Get the theme and screenshot preferences.
-        boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
-
         // Get a long array of the selected bookmarks.
         long[] selectedBookmarksLongArray = bookmarksListView.getCheckedItemIds();
 
@@ -1006,6 +1038,9 @@ 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`.
         if (selectedBookmarkDatabaseId == firstBookmarkDatabaseId) {  // The selected bookmark is in the first position.
             // Disable the move bookmark up `MenuItem`.
@@ -1014,14 +1049,14 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
             //  Set the move bookmark up icon to be ghosted.
             moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_disabled);
         } else {  // The selected bookmark is not in the first position.
-            // Enable the move bookmark up `MenuItem`.
+            // Enable the move bookmark up menu item.
             moveBookmarkUpMenuItem.setEnabled(true);
 
             // Set the icon according to the theme.
-            if (darkTheme) {
-                moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_dark);
+            if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) {
+                moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_night);
             } else {
-                moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_light);
+                moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_day);
             }
         }
 
@@ -1037,10 +1072,10 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
             moveBookmarkDownMenuItem.setEnabled(true);
 
             // Set the icon according to the theme.
-            if (darkTheme) {
-                moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_dark);
+            if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) {
+                moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_night);
             } else {
-                moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_light);
+                moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_day);
             }
         }
     }