]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java
Speed up the moving of bookmarks. https://redmine.stoutner.com/issues/48.
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / activities / BookmarksActivity.java
index dcb603ff715678d25e6c5511ebe4ad3397804baa..5e9d9fafe657201d25b3a9f663b82a541d389e02 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-2017 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
@@ -97,10 +97,20 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
+        // Set the activity theme.
+        if (MainWebViewActivity.darkTheme) {
+            setTheme(R.style.PrivacyBrowserDark_SecondaryActivity);
+        } else {
+            setTheme(R.style.PrivacyBrowserLight_SecondaryActivity);
+        }
+
+        // Run the default commands.
         super.onCreate(savedInstanceState);
+
+        // Set the content view.
         setContentView(R.layout.bookmarks_coordinatorlayout);
 
-        // We need to use the `SupportActionBar` from `android.support.v7.app.ActionBar` until the minimum API is >= 21.
+        // Use the `SupportActionBar` from `android.support.v7.app.ActionBar` until the minimum API is >= 21.
         final Toolbar bookmarksAppBar = (Toolbar) findViewById(R.id.bookmarks_toolbar);
         setSupportActionBar(bookmarksAppBar);
 
@@ -185,7 +195,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                 editBookmarkMenuItem = menu.findItem(R.id.edit_bookmark);
                 selectAllBookmarksMenuItem = menu.findItem(R.id.context_menu_select_all_bookmarks);
 
-                // Get a handle for `contextualActionMode` so we can close it programatically.
+                // Store `contextualActionMode` so we can close it programatically.
                 contextualActionMode = mode;
 
                 return true;
@@ -225,19 +235,31 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                     // Disable `moveBookmarkUpMenuItem` if the selected bookmark is at the top of the ListView.
                     if (selectedBookmarkDatabaseId == firstBookmarkDatabaseId) {
                         moveBookmarkUpMenuItem.setEnabled(false);
-                        moveBookmarkUpMenuItem.setIcon(R.drawable.move_bookmark_up_disabled);
+                        moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_disabled);
                     } else {  // Otherwise enable `moveBookmarkUpMenuItem`.
                         moveBookmarkUpMenuItem.setEnabled(true);
-                        moveBookmarkUpMenuItem.setIcon(R.drawable.move_bookmark_up_enabled);
+
+                        // Set the icon according to the theme.
+                        if (MainWebViewActivity.darkTheme) {
+                            moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_dark);
+                        } else {
+                            moveBookmarkUpMenuItem.setIcon(R.drawable.move_up_enabled_light);
+                        }
                     }
 
                     // Disable `moveBookmarkDownMenuItem` if the selected bookmark is at the bottom of the ListView.
                     if (selectedBookmarkDatabaseId == lastBookmarkDatabaseId) {
                         moveBookmarkDownMenuItem.setEnabled(false);
-                        moveBookmarkDownMenuItem.setIcon(R.drawable.move_bookmark_down_disabled);
+                        moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_disabled);
                     } else {  // Otherwise enable `moveBookmarkDownMenuItem`.
                         moveBookmarkDownMenuItem.setEnabled(true);
-                        moveBookmarkDownMenuItem.setIcon(R.drawable.move_bookmark_down_enabled);
+
+                        // Set the icon according to the theme.
+                        if (MainWebViewActivity.darkTheme) {
+                            moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_dark);
+                        } else {
+                            moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled_light);
+                        }
                     }
                 } else {  // More than one bookmark is selected.
                     // List the number of selected bookmarks in the subtitle.
@@ -259,45 +281,46 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
 
             @Override
             public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                // Get the menu item ID.
                 int menuItemId = item.getItemId();
 
-                // `numberOfBookmarks` is used in `R.id.move_bookmark_up_enabled`, `R.id.move_bookmark_down_enabled`, and `R.id.context_menu_select_all_bookmarks`.
+                // Instantiate the common variables.
                 int numberOfBookmarks;
-
-                // `selectedBookmarkLongArray` is used in `R.id.move_bookmark_up`, `R.id.move_bookmark_down`, and `R.id.edit_bookmark`.
-                long[]selectedBookmarkLongArray;
-                // `selectedBookmarkDatabaseId` is used in `R.id.move_bookmark_up`, `R.id.move_bookmark_down`, and `R.id.edit_bookmark`.
-                int selectedBookmarkDatabaseId;
-                // `selectedBookmarkNewPosition` is used in `R.id.move_bookmark_up` and `R.id.move_bookmark_down`.
                 int selectedBookmarkNewPosition;
-                // `bookmarkPositionSparseBooleanArray` is used in `R.id.edit_bookmark` and `R.id.delete_bookmark`.
                 SparseBooleanArray bookmarkPositionSparseBooleanArray;
 
                 switch (menuItemId) {
                     case R.id.move_bookmark_up:
-                        // Get the selected bookmark database ID.
-                        selectedBookmarkLongArray = bookmarksListView.getCheckedItemIds();
-                        selectedBookmarkDatabaseId = (int) selectedBookmarkLongArray[0];
+                        // Get the array of checked bookmarks.
+                        bookmarkPositionSparseBooleanArray = bookmarksListView.getCheckedItemPositions();
+
+                        // Store the position of the selected bookmark.
+                        selectedBookmarkPosition = bookmarkPositionSparseBooleanArray.keyAt(0);
 
                         // Initialize `selectedBookmarkNewPosition`.
                         selectedBookmarkNewPosition = 0;
 
+                        // Iterate through the bookmarks.
                         for (int i = 0; i < bookmarksListView.getCount(); i++) {
-                            int databaseId = (int) bookmarksListView.getItemIdAtPosition(i);
-                            int nextBookmarkDatabaseId = (int) bookmarksListView.getItemIdAtPosition(i + 1);
-
-                            if (databaseId == selectedBookmarkDatabaseId || nextBookmarkDatabaseId == selectedBookmarkDatabaseId) {
-                                if (databaseId == selectedBookmarkDatabaseId) {
-                                    // Move the selected bookmark up one and store the new bookmark position.
-                                    bookmarksDatabaseHelper.updateBookmarkDisplayOrder(databaseId, i - 1);
-                                    selectedBookmarkNewPosition = i - 1;
-                                } else {  // Move the bookmark above the selected bookmark down one.
-                                    bookmarksDatabaseHelper.updateBookmarkDisplayOrder(databaseId, i + 1);
+                            // Get the database ID for the current bookmark.
+                            int currentBookmarkDatabaseId = (int) bookmarksListView.getItemIdAtPosition(i);
+
+                            // Update the display order for the current bookmark.
+                            if (i == selectedBookmarkPosition) {  // The current bookmark is the selected bookmark.
+                                // Move the current bookmark up one.
+                                bookmarksDatabaseHelper.updateBookmarkDisplayOrder(currentBookmarkDatabaseId, i - 1);
+                                selectedBookmarkNewPosition = i - 1;
+                            } else if ((i + 1) == selectedBookmarkPosition){  // The current bookmark is immediately above the selected bookmark.
+                                // Move the current bookmark down one.
+                                bookmarksDatabaseHelper.updateBookmarkDisplayOrder(currentBookmarkDatabaseId, i + 1);
+                            } else {  // The current bookmark is not changing positions.
+                                // Move `bookmarksCursor` 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.getColumnIndex(BookmarksDatabaseHelper.DISPLAY_ORDER)) != i) {
+                                    bookmarksDatabaseHelper.updateBookmarkDisplayOrder(currentBookmarkDatabaseId, i);
                                 }
-                            } else {
-                                // Reset the rest of the bookmarks' DISPLAY_ORDER to match the position in the ListView.
-                                // This isn't necessary, but it clears out any stray values that might have crept into the database.
-                                bookmarksDatabaseHelper.updateBookmarkDisplayOrder(databaseId, i);
                             }
                         }
 
@@ -313,29 +336,36 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         break;
 
                     case R.id.move_bookmark_down:
-                        // Get the selected bookmark database ID.
-                        selectedBookmarkLongArray = bookmarksListView.getCheckedItemIds();
-                        selectedBookmarkDatabaseId = (int) selectedBookmarkLongArray[0];
+                        // Get the array of checked bookmarks.
+                        bookmarkPositionSparseBooleanArray = bookmarksListView.getCheckedItemPositions();
+
+                        // Store the position of the selected bookmark.
+                        selectedBookmarkPosition = bookmarkPositionSparseBooleanArray.keyAt(0);
 
                         // Initialize `selectedBookmarkNewPosition`.
                         selectedBookmarkNewPosition = 0;
 
+                        // Iterate through the bookmarks.
                         for (int i = 0; i <bookmarksListView.getCount(); i++) {
-                            int databaseId = (int) bookmarksListView.getItemIdAtPosition(i);
-                            int previousBookmarkDatabaseId = (int) bookmarksListView.getItemIdAtPosition(i - 1);
-
-                            if (databaseId == selectedBookmarkDatabaseId || previousBookmarkDatabaseId == selectedBookmarkDatabaseId) {
-                                if (databaseId == selectedBookmarkDatabaseId) {
-                                    // Move the selected bookmark down one and store the new bookmark position.
-                                    bookmarksDatabaseHelper.updateBookmarkDisplayOrder(databaseId, i + 1);
-                                    selectedBookmarkNewPosition = i + 1;
-                                } else {  // Move the bookmark below the selected bookmark up one.
-                                    bookmarksDatabaseHelper.updateBookmarkDisplayOrder(databaseId, i - 1);
+                            // Get the database ID for the current bookmark.
+                            int currentBookmarkDatabaseId = (int) bookmarksListView.getItemIdAtPosition(i);
+
+                            // Update the display order for the current bookmark.
+                            if (i == selectedBookmarkPosition) {  // The current bookmark is the selected bookmark.
+                                // Move the current bookmark down one.
+                                bookmarksDatabaseHelper.updateBookmarkDisplayOrder(currentBookmarkDatabaseId, i + 1);
+                                selectedBookmarkNewPosition = i + 1;
+                            } else if ((i - 1) == selectedBookmarkPosition) {  // The current bookmark is immediately below the selected bookmark.
+                                // Move the bookmark below the selected bookmark up one.
+                                bookmarksDatabaseHelper.updateBookmarkDisplayOrder(currentBookmarkDatabaseId, i - 1);
+                            } else {  // The current bookmark is not changing positions.
+                                // Move `bookmarksCursor` 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.getColumnIndex(BookmarksDatabaseHelper.DISPLAY_ORDER)) != i) {
+                                    bookmarksDatabaseHelper.updateBookmarkDisplayOrder(currentBookmarkDatabaseId, i);
                                 }
-                            } else {
-                                // Reset the rest of the bookmark' DISPLAY_ORDER to match the position in the ListView.
-                                // This isn't necessary, but it clears out any stray values that might have crept into the database.
-                                bookmarksDatabaseHelper.updateBookmarkDisplayOrder(databaseId, i);
                             }
                         }
 
@@ -359,13 +389,11 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         break;
 
                     case R.id.edit_bookmark:
-                        // Get a handle for `selectedBookmarkPosition` so we can scroll to it after refreshing the ListView.
+                        // Get the array of checked bookmarks.
                         bookmarkPositionSparseBooleanArray = bookmarksListView.getCheckedItemPositions();
-                        for (int i = 0; i < bookmarkPositionSparseBooleanArray.size(); i++) {
-                            // Find the bookmark that is selected and save the position to `selectedBookmarkPosition`.
-                            if (bookmarkPositionSparseBooleanArray.valueAt(i))
-                                selectedBookmarkPosition = bookmarkPositionSparseBooleanArray.keyAt(i);
-                        }
+
+                        // Store the position of the selected bookmark.
+                        selectedBookmarkPosition = bookmarkPositionSparseBooleanArray.keyAt(0);
 
                         // Move to the selected database ID and find out if it is a folder.
                         bookmarksCursor.moveToPosition(selectedBookmarkPosition);
@@ -392,19 +420,18 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         // Get an array of the selected rows.
                         final long[] selectedBookmarksLongArray = bookmarksListView.getCheckedItemIds();
 
-                        // Get a handle for `selectedBookmarkPosition` so we can scroll to it after refreshing the ListView.
+                        // Get the array of checked bookmarks.
                         bookmarkPositionSparseBooleanArray = bookmarksListView.getCheckedItemPositions();
-                        for (int i = 0; i < bookmarkPositionSparseBooleanArray.size(); i++) {
-                            // Find the bookmark that is selected and save the position to `selectedBookmarkPosition`.
-                            if (bookmarkPositionSparseBooleanArray.valueAt(i))
-                                selectedBookmarkPosition = bookmarkPositionSparseBooleanArray.keyAt(i);
-                        }
+
+                        // Store the position of the first selected bookmark.
+                        selectedBookmarkPosition = bookmarkPositionSparseBooleanArray.keyAt(0);
 
                         updateBookmarksListViewExcept(selectedBookmarksLongArray, currentFolder);
 
-                        // Scroll to where the deleted bookmark was located.
+                        // Scroll to where the first deleted bookmark was located.
                         bookmarksListView.setSelection(selectedBookmarkPosition - 5);
 
+                        // Create `snackbarMessage`.
                         String snackbarMessage;
 
                         // Determine how many items are in the array and prepare an appropriate Snackbar message.
@@ -425,31 +452,17 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                                 .addCallback(new Snackbar.Callback() {
                                     @Override
                                     public void onDismissed(Snackbar snackbar, int event) {
-                                        // Android Studio wants to see entries for every possible `Snackbar.Callback` even if they aren't used.
                                         switch (event) {
-                                            // The user pushed the "Undo" button.
+                                            // The user pushed the `Undo` button.
                                             case Snackbar.Callback.DISMISS_EVENT_ACTION:
                                                 // Refresh the ListView to show the rows again.
                                                 updateBookmarksListView(currentFolder);
 
-                                                // Scroll to where the deleted bookmark was located.
+                                                // Scroll to where the first deleted bookmark was located.
                                                 bookmarksListView.setSelection(selectedBookmarkPosition - 5);
-
                                                 break;
 
-                                            case Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE:
-                                                // Do nothing and let the default behavior run.
-
-                                            case Snackbar.Callback.DISMISS_EVENT_MANUAL:
-                                                // Do nothing and let the default behavior run.
-
-                                            case Snackbar.Callback.DISMISS_EVENT_SWIPE:
-                                                // Do nothing and let the default behavior run.
-
-                                            case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
-                                                // Do nothing and let the default behavior run.
-
-                                            // The Snackbar was dismissed without the "Undo" button being pushed.
+                                            // The `Snackbar` was dismissed without the `Undo` button being pushed.
                                             default:
                                                 // Delete each selected row.
                                                 for (long databaseIdLong : selectedBookmarksLongArray) {
@@ -579,7 +592,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
         // Convert the favoriteIcon Bitmap to a byte array.
         ByteArrayOutputStream favoriteIconByteArrayOutputStream = new ByteArrayOutputStream();
         // `0` is for lossless compression (the only option for a PNG).
-        MainWebViewActivity.favoriteIcon.compress(Bitmap.CompressFormat.PNG, 0, favoriteIconByteArrayOutputStream);
+        MainWebViewActivity.favoriteIconBitmap.compress(Bitmap.CompressFormat.PNG, 0, favoriteIconByteArrayOutputStream);
         byte[] favoriteIconByteArray = favoriteIconByteArrayOutputStream.toByteArray();
 
         // Display the new bookmark below the current items in the (0 indexed) list.
@@ -617,7 +630,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                 BitmapDrawable folderIconBitmapDrawable = (BitmapDrawable) folderIconDrawable;
                 folderIconBitmap = folderIconBitmapDrawable.getBitmap();
             } else {  // Assign `favoriteIcon` from the `WebView`.
-                folderIconBitmap = MainWebViewActivity.favoriteIcon;
+                folderIconBitmap = MainWebViewActivity.favoriteIconBitmap;
             }
 
             // Convert `folderIconBitmap` to a byte array.  `0` is for lossless compression (the only option for a PNG).
@@ -658,7 +671,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
             bookmarksDatabaseHelper.updateBookmark(selectedBookmarkDatabaseId, bookmarkNameString, bookmarkUrlString);
         } else {  // Update the bookmark using the `WebView` favorite icon.
             ByteArrayOutputStream newFavoriteIconByteArrayOutputStream = new ByteArrayOutputStream();
-            MainWebViewActivity.favoriteIcon.compress(Bitmap.CompressFormat.PNG, 0, newFavoriteIconByteArrayOutputStream);
+            MainWebViewActivity.favoriteIconBitmap.compress(Bitmap.CompressFormat.PNG, 0, newFavoriteIconByteArrayOutputStream);
             byte[] newFavoriteIconByteArray = newFavoriteIconByteArrayOutputStream.toByteArray();
 
             //  Update the bookmark and the favorite icon.
@@ -712,7 +725,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                     BitmapDrawable folderIconBitmapDrawable = (BitmapDrawable) folderIconDrawable;
                     folderIconBitmap = folderIconBitmapDrawable.getBitmap();
                 } else {  // Get the web page icon `ImageView` from the `Dialog`.
-                    folderIconBitmap = MainWebViewActivity.favoriteIcon;
+                    folderIconBitmap = MainWebViewActivity.favoriteIconBitmap;
                 }
 
                 // Convert the folder `Bitmap` to a byte array.  `0` is for lossless compression (the only option for a PNG).