From: Soren Stoutner Date: Mon, 21 Oct 2024 22:16:14 +0000 (-0700) Subject: Add bookmark move to top and bottom options. https://redmine.stoutner.com/issues... X-Git-Url: https://gitweb.stoutner.com/?a=commitdiff_plain;h=532ebe740fcaa6c944f8b1ea43933a725bd837d5;p=PrivacyBrowserAndroid.git Add bookmark move to top and bottom options. https://redmine.stoutner.com/issues/1082 --- diff --git a/app/build.gradle b/app/build.gradle index b81126cb..36116ccf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Privacy Browser Android. If not, see . + * along with Privacy Browser Android. If not, see . */ plugins { @@ -82,7 +82,7 @@ android { dependencies { // Include the following AndroidX libraries. - implementation "androidx.activity:activity-ktx:1.9.2" + implementation "androidx.activity:activity-ktx:1.9.3" implementation 'androidx.arch.core:core-common:2.2.0' implementation 'androidx.arch.core:core-runtime:2.2.0' implementation 'androidx.appcompat:appcompat:1.7.0' @@ -94,11 +94,11 @@ dependencies { implementation 'androidx.preference:preference-ktx:1.2.1' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.viewpager:viewpager:1.0.0' - implementation 'androidx.webkit:webkit:1.12.0' + implementation 'androidx.webkit:webkit:1.12.1' // Include the Kotlin standard library. This should be the same version number listed in project build.gradle. implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.9.20' // Include the Google material library. - implementation 'com.google.android.material:material:1.13.0-alpha06' + implementation 'com.google.android.material:material:1.13.0-alpha07' } diff --git a/app/src/alt/res/drawable/privacy_browser_foreground.xml b/app/src/alt/res/drawable/privacy_browser_foreground.xml index 517946b4..31e5666c 100644 --- a/app/src/alt/res/drawable/privacy_browser_foreground.xml +++ b/app/src/alt/res/drawable/privacy_browser_foreground.xml @@ -1,9 +1,9 @@ + along with Privacy Browser Android. If not, see . --> . - This file is derived from `security` and `language`, which are part of the Android Material icon set. They are released under the Apache License 2.0. + This file is derived from `security` and `language`, which are part of the Android Material icon set . They are released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> . --> + along with Privacy Browser Android. If not, see . --> + @@ -114,7 +115,9 @@

add.

aod_tablet_rounded_grade200.

arrow_back.

+

arrow_downward_rounded_fill0_weight400_grade0_24px.

arrow_forward.

+

arrow_upward_rounded_fill0_weight400_grade0_24px.

bookmark_rounded_fill0_weight400_grade0_24px.

bookmarks.

bug_report.

@@ -173,8 +176,10 @@

tab.

text_fields.

thumbs_up_down.

-

vertical_align_bottom.

-

vertical_align_top.

+

+ vertical_align_bottom_rounded_fill0_weight400_grade0_24px.

+

+ vertical_align_top_rounded_fill0_weight400_grade0_24px.

visibility_off.

vpn_key.

vpn_lock.

diff --git a/app/src/main/assets/en/about_licenses.html b/app/src/main/assets/en/about_licenses.html index 36a2c057..65bfb288 100644 --- a/app/src/main/assets/en/about_licenses.html +++ b/app/src/main/assets/en/about_licenses.html @@ -14,7 +14,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> @@ -110,7 +110,9 @@

add.

aod_tablet_rounded_grade200.

arrow_back.

+

arrow_downward_rounded_fill0_weight400_grade0_24px.

arrow_forward.

+

arrow_upward_rounded_fill0_weight400_grade0_24px.

bookmark_rounded_fill0_weight400_grade0_24px.

bookmarks.

bug_report.

@@ -169,8 +171,10 @@

tab.

text_fields.

thumbs_up_down.

-

vertical_align_bottom.

-

vertical_align_top.

+

+ vertical_align_bottom_rounded_fill0_weight400_grade0_24px.

+

+ vertical_align_top_rounded_fill0_weight400_grade0_24px.

visibility_off.

vpn_key.

vpn_lock.

diff --git a/app/src/main/assets/es/about_licenses.html b/app/src/main/assets/es/about_licenses.html index 2c5c2e44..b8eea778 100644 --- a/app/src/main/assets/es/about_licenses.html +++ b/app/src/main/assets/es/about_licenses.html @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> @@ -114,7 +114,9 @@

add.

aod_tablet_rounded_grade200.

arrow_back.

+

arrow_downward_rounded_fill0_weight400_grade0_24px.

arrow_forward.

+

arrow_upward_rounded_fill0_weight400_grade0_24px.

bookmark_rounded_fill0_weight400_grade0_24px.

bookmarks.

bug_report.

@@ -173,8 +175,10 @@

tab.

text_fields.

thumbs_up_down.

-

vertical_align_bottom.

-

vertical_align_top.

+

+ vertical_align_bottom_rounded_fill0_weight400_grade0_24px.

+

+ vertical_align_top_rounded_fill0_weight400_grade0_24px.

visibility_off.

vpn_key.

vpn_lock.

diff --git a/app/src/main/assets/fr/about_licenses.html b/app/src/main/assets/fr/about_licenses.html index f3fecb82..fdd59829 100644 --- a/app/src/main/assets/fr/about_licenses.html +++ b/app/src/main/assets/fr/about_licenses.html @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> @@ -116,7 +116,9 @@

add.

aod_tablet_rounded_grade200.

arrow_back.

+

arrow_downward_rounded_fill0_weight400_grade0_24px.

arrow_forward.

+

arrow_upward_rounded_fill0_weight400_grade0_24px.

bookmark_rounded_fill0_weight400_grade0_24px.

bookmarks.

bug_report.

@@ -175,8 +177,10 @@

tab.

text_fields.

thumbs_up_down.

-

vertical_align_bottom.

-

vertical_align_top.

+

+ vertical_align_bottom_rounded_fill0_weight400_grade0_24px.

+

+ vertical_align_top_rounded_fill0_weight400_grade0_24px.

visibility_off.

vpn_key.

vpn_lock.

diff --git a/app/src/main/assets/it/about_licenses.html b/app/src/main/assets/it/about_licenses.html index 2647b3ce..0f6e5633 100644 --- a/app/src/main/assets/it/about_licenses.html +++ b/app/src/main/assets/it/about_licenses.html @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> @@ -118,7 +118,9 @@

add.

aod_tablet_rounded_grade200.

arrow_back.

+

arrow_downward_rounded_fill0_weight400_grade0_24px.

arrow_forward.

+

arrow_upward_rounded_fill0_weight400_grade0_24px.

bookmark_rounded_fill0_weight400_grade0_24px.

bookmarks.

bug_report.

@@ -177,8 +179,10 @@

tab.

text_fields.

thumbs_up_down.

-

vertical_align_bottom.

-

vertical_align_top.

+

+ vertical_align_bottom_rounded_fill0_weight400_grade0_24px.

+

+ vertical_align_top_rounded_fill0_weight400_grade0_24px.

visibility_off.

vpn_key.

vpn_lock.

diff --git a/app/src/main/assets/pt-rBR/about_licenses.html b/app/src/main/assets/pt-rBR/about_licenses.html index fc524073..d6a47a02 100644 --- a/app/src/main/assets/pt-rBR/about_licenses.html +++ b/app/src/main/assets/pt-rBR/about_licenses.html @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> @@ -113,7 +113,9 @@

add.

aod_tablet_rounded_grade200.

arrow_back.

+

arrow_downward_rounded_fill0_weight400_grade0_24px.

arrow_forward.

+

arrow_upward_rounded_fill0_weight400_grade0_24px.

bookmark_rounded_fill0_weight400_grade0_24px.

bookmarks.

bug_report.

@@ -172,8 +174,10 @@

tab.

text_fields.

thumbs_up_down.

-

vertical_align_bottom.

-

vertical_align_top.

+

+ vertical_align_bottom_rounded_fill0_weight400_grade0_24px.

+

+ vertical_align_top_rounded_fill0_weight400_grade0_24px.

visibility_off.

vpn_key.

vpn_lock.

diff --git a/app/src/main/assets/ru/about_licenses.html b/app/src/main/assets/ru/about_licenses.html index 6e3cac23..649efed4 100644 --- a/app/src/main/assets/ru/about_licenses.html +++ b/app/src/main/assets/ru/about_licenses.html @@ -14,7 +14,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> @@ -110,7 +110,9 @@

add.

aod_tablet_rounded_grade200.

arrow_back.

+

arrow_downward_rounded_fill0_weight400_grade0_24px.

arrow_forward.

+

arrow_upward_rounded_fill0_weight400_grade0_24px.

bookmark_rounded_fill0_weight400_grade0_24px.

bookmarks.

bug_report.

@@ -169,8 +171,10 @@

tab.

text_fields.

thumbs_up_down.

-

vertical_align_bottom.

-

vertical_align_top.

+

+ vertical_align_bottom_rounded_fill0_weight400_grade0_24px.

+

+ vertical_align_top_rounded_fill0_weight400_grade0_24px.

visibility_off.

vpn_key.

vpn_lock.

diff --git a/app/src/main/assets/shared_images/arrow_downward_rounded_fill0_weight400_grade0_24px.svg b/app/src/main/assets/shared_images/arrow_downward_rounded_fill0_weight400_grade0_24px.svg new file mode 100644 index 00000000..003d2719 --- /dev/null +++ b/app/src/main/assets/shared_images/arrow_downward_rounded_fill0_weight400_grade0_24px.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/app/src/main/assets/shared_images/arrow_upward_rounded_fill0_weight400_grade0_24px.svg b/app/src/main/assets/shared_images/arrow_upward_rounded_fill0_weight400_grade0_24px.svg new file mode 100644 index 00000000..f7db3691 --- /dev/null +++ b/app/src/main/assets/shared_images/arrow_upward_rounded_fill0_weight400_grade0_24px.svg @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/app/src/main/assets/shared_images/bookmark_rounded_fill0_weight400_grade0_24px.svg b/app/src/main/assets/shared_images/bookmark_rounded_fill0_weight400_grade0_24px.svg index 232a38f3..aa5b1a6b 100644 --- a/app/src/main/assets/shared_images/bookmark_rounded_fill0_weight400_grade0_24px.svg +++ b/app/src/main/assets/shared_images/bookmark_rounded_fill0_weight400_grade0_24px.svg @@ -18,7 +18,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> - - - - - - - diff --git a/app/src/main/assets/shared_images/vertical_align_bottom_rounded_fill0_weight400_grade0_24px.svg b/app/src/main/assets/shared_images/vertical_align_bottom_rounded_fill0_weight400_grade0_24px.svg new file mode 100644 index 00000000..d5e29522 --- /dev/null +++ b/app/src/main/assets/shared_images/vertical_align_bottom_rounded_fill0_weight400_grade0_24px.svg @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/app/src/main/assets/shared_images/vertical_align_top.svg b/app/src/main/assets/shared_images/vertical_align_top.svg deleted file mode 100644 index 8c4e76da..00000000 --- a/app/src/main/assets/shared_images/vertical_align_top.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - diff --git a/app/src/main/assets/shared_images/vertical_align_top_rounded_fill0_weight400_grade0_24px.svg b/app/src/main/assets/shared_images/vertical_align_top_rounded_fill0_weight400_grade0_24px.svg new file mode 100644 index 00000000..2a788666 --- /dev/null +++ b/app/src/main/assets/shared_images/vertical_align_top_rounded_fill0_weight400_grade0_24px.svg @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/app/src/main/assets/tr/about_licenses.html b/app/src/main/assets/tr/about_licenses.html index 158b8bb8..c1a5f6c6 100644 --- a/app/src/main/assets/tr/about_licenses.html +++ b/app/src/main/assets/tr/about_licenses.html @@ -14,7 +14,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> @@ -111,7 +111,9 @@

add.

aod_tablet_rounded_grade200.

arrow_back.

+

arrow_downward_rounded_fill0_weight400_grade0_24px.

arrow_forward.

+

arrow_upward_rounded_fill0_weight400_grade0_24px.

bookmark_rounded_fill0_weight400_grade0_24px.

bookmarks.

bug_report.

@@ -170,8 +172,10 @@

tab.

text_fields.

thumbs_up_down.

-

vertical_align_bottom.

-

vertical_align_top.

+

+ vertical_align_bottom_rounded_fill0_weight400_grade0_24px.

+

+ vertical_align_top_rounded_fill0_weight400_grade0_24px.

visibility_off.

vpn_key.

vpn_lock.

diff --git a/app/src/main/assets/zh-rCN/about_licenses.html b/app/src/main/assets/zh-rCN/about_licenses.html index 858649a5..ac8c5520 100644 --- a/app/src/main/assets/zh-rCN/about_licenses.html +++ b/app/src/main/assets/zh-rCN/about_licenses.html @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> @@ -111,7 +111,9 @@

add.

aod_tablet_rounded_grade200.

arrow_back.

+

arrow_downward_rounded_fill0_weight400_grade0_24px.

arrow_forward.

+

arrow_upward_rounded_fill0_weight400_grade0_24px.

bookmark_rounded_fill0_weight400_grade0_24px.

bookmarks.

bug_report.

@@ -170,8 +172,10 @@

tab.

text_fields.

thumbs_up_down.

-

vertical_align_bottom.

-

vertical_align_top.

+

+ vertical_align_bottom_rounded_fill0_weight400_grade0_24px.

+

+ vertical_align_top_rounded_fill0_weight400_grade0_24px.

visibility_off.

vpn_key.

vpn_lock.

diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.kt b/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.kt index 794f7e5d..62004a9a 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.kt @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Privacy Browser Android. If not, see . + * along with Privacy Browser Android. If not, see . */ package com.stoutner.privacybrowser.activities @@ -105,6 +105,8 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma private lateinit var currentFavoriteIconByteArray: ByteArray private lateinit var moveBookmarkDownMenuItem: MenuItem private lateinit var moveBookmarkUpMenuItem: MenuItem + private lateinit var moveToTopMenuItem: MenuItem + private lateinit var moveToBottomMenuItem: MenuItem private lateinit var moveToFolderMenuItem: MenuItem override fun onCreate(savedInstanceState: Bundle?) { @@ -231,6 +233,8 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma // Get handles for menu items that need to be selectively disabled. moveBookmarkUpMenuItem = menu.findItem(R.id.move_bookmark_up) moveBookmarkDownMenuItem = menu.findItem(R.id.move_bookmark_down) + moveToTopMenuItem = menu.findItem(R.id.move_to_top) + moveToBottomMenuItem = menu.findItem(R.id.move_to_bottom) moveToFolderMenuItem = menu.findItem(R.id.move_to_folder) editBookmarkMenuItem = menu.findItem(R.id.edit_bookmark) deleteBookmarksMenuItem = menu.findItem(R.id.delete_bookmark) @@ -240,6 +244,8 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma if (sortBookmarksAlphabetically) { moveBookmarkUpMenuItem.isVisible = false moveBookmarkDownMenuItem.isVisible = false + moveToTopMenuItem.isVisible = false + moveToBottomMenuItem.isVisible = false } // Disable the delete bookmarks menu item if a delete is pending. @@ -278,10 +284,6 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma // Show the edit bookmark menu item. editBookmarkMenuItem.isVisible = true - - // Update the enabled status of the move icons if the bookmarks are not sorted alphabetically. - if (!sortBookmarksAlphabetically) - updateMoveIcons() } else { // More than one bookmark is selected. // Update the move menu items if the bookmarks are not sorted alphabetically. if (!sortBookmarksAlphabetically) { @@ -293,6 +295,23 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma editBookmarkMenuItem.isVisible = false } + // Update the move icons if not sorting alphabetically. + if (!sortBookmarksAlphabetically) { + // Adjust the visibility of the move to top and bottom menu items. + if ((numberOfSelectedBookmarks == bookmarksListView.count)) { // All the bookmarks are selected. + // Hide the move to top and bottom menu items. + moveToTopMenuItem.isVisible = false + moveToBottomMenuItem.isVisible = false + } else { // Not all the bookmarks are selected. + // Show the move to top and bottom menu item. + moveToTopMenuItem.isVisible = true + moveToBottomMenuItem.isVisible = true + } + + // Update the move icons. + updateMoveIcons() + } + // Display the move to folder menu item if at least one other folder exists. moveToFolderMenuItem.isVisible = bookmarksDatabaseHelper.hasFoldersExceptDatabaseId(bookmarksListView.checkedItemIds) @@ -365,7 +384,7 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma bookmarksCursorAdapter.changeCursor(bookmarksCursor) // Scroll to the new bookmark position. - scrollBookmarks(checkedBookmarkNewPosition) + bookmarksListView.setSelection(checkedBookmarkNewPosition) // Update the enabled status of the move icons. updateMoveIcons() @@ -419,6 +438,122 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma // Update the enabled status of the move icons. updateMoveIcons() + } else if (menuItemId == R.id.move_to_top) { // Move to top. + // Get a list of selected bookmark IDs by display order. + val selectedBookmarkIdsList = getSelectedBookmarkIdsByDisplayOrder() + + // Update the display order of the bookmarks that are selected. `newDisplayOrder` is the index, which auto-increments. + for ((newSelectedBookmarkDisplayOrder, bookmarkDatabaseId) in selectedBookmarkIdsList.withIndex()) { + // Set the new bookmark position. + bookmarksDatabaseHelper.updateDisplayOrder(bookmarkDatabaseId, newSelectedBookmarkDisplayOrder) + } + + // Get the number of bookmarks. + val numberOfSelectedBookmarks = selectedBookmarkIdsList.size + val totalNumberOfBookmarksMinusOne = bookmarksListView.count - 1 + + // Initialize the new unselected bookmark display order. + var newUnselectedBookmarkDisplayOrder = numberOfSelectedBookmarks + + // Increment the display order of the other bookmarks by the number of selected bookmarks. + for (i in 0..totalNumberOfBookmarksMinusOne) { + // Get the bookmark database ID long at the indicated position. + val bookmarkDatabaseIdLong = bookmarksListView.getItemIdAtPosition(i) + + // Increment the display order if it isn't one of the selected bookmarks. + if (!selectedBookmarkIdsList.contains(bookmarkDatabaseIdLong.toInt())) { + // Move the bookmarks cursor to the current bookmark position. + bookmarksCursor.moveToPosition(i) + + // Update the unselected bookmark display order if it has changed. + if (bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(DISPLAY_ORDER)) != newUnselectedBookmarkDisplayOrder) + bookmarksDatabaseHelper.updateDisplayOrder(bookmarkDatabaseIdLong.toInt(), newUnselectedBookmarkDisplayOrder) + + // Increment the new unselected bookmark display order. + ++newUnselectedBookmarkDisplayOrder + } + } + + // Update the bookmarks cursor with the current contents of the bookmarks database. + bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId) + + // Update the list view. + bookmarksCursorAdapter.changeCursor(bookmarksCursor) + + // Update the enabled status of the move icons. + updateMoveIcons() + + // Reselect the original bookmarks (the system only automatically does so for those that were visible before the move). + for (i in 0..totalNumberOfBookmarksMinusOne) { + // Reelect the originally selected bookmarks. Deselect all the other bookmarks. + bookmarksListView.setItemChecked(i, i < numberOfSelectedBookmarks) + } + + // Scroll to the top. + scrollBookmarks(0) + } else if (menuItemId == R.id.move_to_bottom) { // Move to bottom. + // Get a list of selected bookmark IDs by display order. + val selectedBookmarkIdsList = getSelectedBookmarkIdsByDisplayOrder() + + // Get the number of bookmarks. + val numberOfSelectedBookmarks = selectedBookmarkIdsList.size + val totalNumberOfBookmarks = bookmarksListView.count + val totalNumberOfBookmarksMinusOne = totalNumberOfBookmarks - 1 + + // Initialize the new selected bookmark display order. + var newSelectedBookmarkDisplayOrder = totalNumberOfBookmarks - numberOfSelectedBookmarks + + // Update the display order of the bookmarks that are selected. + for (bookmarkDatabaseId in selectedBookmarkIdsList) { + // Set the new bookmark position. + bookmarksDatabaseHelper.updateDisplayOrder(bookmarkDatabaseId, newSelectedBookmarkDisplayOrder) + + // Increment the new selected bookmark display order. + ++newSelectedBookmarkDisplayOrder + } + + // Initialize the new unselected bookmark display order. + var newUnselectedBookmarkDisplayOrder = 0 + + // Increment the display order of the bookmarks that are not selected. + for (i in 0..totalNumberOfBookmarksMinusOne) { + // Get the bookmark database ID long at the indicated position. + val bookmarkDatabaseIdLong = bookmarksListView.getItemIdAtPosition(i) + + // Adjust the display order if it isn't one of the selected bookmarks. + if (!selectedBookmarkIdsList.contains(bookmarkDatabaseIdLong.toInt())) { + // Move the bookmarks cursor to the current bookmark position. + bookmarksCursor.moveToPosition(i) + + // Update the unselected bookmark display order if it has changed. + if (bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(DISPLAY_ORDER)) != newUnselectedBookmarkDisplayOrder) + bookmarksDatabaseHelper.updateDisplayOrder(bookmarkDatabaseIdLong.toInt(), newUnselectedBookmarkDisplayOrder) + + // Increment the new unselected bookmark display order. + ++newUnselectedBookmarkDisplayOrder + } + } + + // Update the bookmarks cursor with the current contents of the bookmarks database. + bookmarksCursor = bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId) + + // Update the list view. + bookmarksCursorAdapter.changeCursor(bookmarksCursor) + + // Update the enabled status of the move icons. + updateMoveIcons() + + // Calculate th + val firstSelectedBookmarkAtEnd = totalNumberOfBookmarks - numberOfSelectedBookmarks + + // Reselect the original bookmarks (the system only automatically does so for those that were visible before the move). + for (i in 0..totalNumberOfBookmarksMinusOne) { + // Reelect the originally selected bookmarks. Deselect all the other bookmarks. + bookmarksListView.setItemChecked(i, i >= firstSelectedBookmarkAtEnd) + } + + // Scroll to the bottom. + scrollBookmarks(totalNumberOfBookmarksMinusOne) } else if (menuItemId == R.id.move_to_folder) { // Move to folder. // Instantiate the move to folder alert dialog. val moveToFolderDialog = MoveToFolderDialog.moveBookmarks(currentFolderId, bookmarksListView.checkedItemIds) @@ -1048,6 +1183,35 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma } } + private fun getSelectedBookmarkIdsByDisplayOrder(): List { + // Create the lists. + val selectedBookmarkPositionsList = mutableListOf() + val selectedBookmarkIdsList = mutableListOf() + + // Get the array of checked bookmark positions. + val checkedBookmarkPositionsSparseBooleanArray = bookmarksListView.checkedItemPositions + + // Get the checked bookmarks positions sparse boolean array size. + val checkedBookmarkPositionsSparseBooleanArraySize = checkedBookmarkPositionsSparseBooleanArray.size() + + // Get the position of the bookmarks that are selected. If other bookmarks have previously been selected they will be included in the sparse boolean array with a value of `false`. + for (i in 0 until checkedBookmarkPositionsSparseBooleanArraySize) { + // Check to see if the value for the bookmark is true, meaning it is currently selected. + if (checkedBookmarkPositionsSparseBooleanArray.valueAt(i)) { + // Add the selected bookmarks positions to the list. + selectedBookmarkPositionsList.add(checkedBookmarkPositionsSparseBooleanArray.keyAt(i)) + } + } + + // Get the selected bookmark IDs from their positions. The selected bookmark positions list will already be sorted by position. + for (selectedBookmarkPosition in selectedBookmarkPositionsList) { + selectedBookmarkIdsList.add(bookmarksListView.getItemIdAtPosition(selectedBookmarkPosition).toInt()) + } + + // Return the selected bookmark IDs list. + return selectedBookmarkIdsList + } + private fun 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. @@ -1069,23 +1233,23 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma } private fun updateMoveIcons() { - // Get a long array of the selected bookmarks. - val selectedBookmarksLongArray = bookmarksListView.checkedItemIds + // Get a long array of the selected bookmarks IDs. + val selectedBookmarkIdsLongArray = bookmarksListView.checkedItemIds // Get the database IDs for the first, last, and selected bookmarks. val firstBookmarkDatabaseId = bookmarksListView.getItemIdAtPosition(0).toInt() val lastBookmarkDatabaseId = bookmarksListView.getItemIdAtPosition(bookmarksListView.count - 1).toInt() // The bookmarks list view is 0 indexed. - val selectedBookmarkDatabaseId = selectedBookmarksLongArray[0].toInt() + val firstSelectedBookmarkDatabaseId = selectedBookmarkIdsLongArray[0].toInt() // Update the move bookmark up menu item. - if (selectedBookmarkDatabaseId == firstBookmarkDatabaseId) { // The selected bookmark is in the first position. - // Disable the move bookmark up menu item. + if (firstSelectedBookmarkDatabaseId == firstBookmarkDatabaseId) { // The selected bookmark is in the first position. + // Disable the menu item. moveBookmarkUpMenuItem.isEnabled = false // 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. + // Enable the menu item. moveBookmarkUpMenuItem.isEnabled = true // Set the icon according to the theme. @@ -1093,19 +1257,82 @@ class BookmarksActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBookma } // Update the move bookmark down menu item. - if (selectedBookmarkDatabaseId == lastBookmarkDatabaseId) { // The selected bookmark is in the last position. - // Disable the move bookmark down menu item. + if (firstSelectedBookmarkDatabaseId == lastBookmarkDatabaseId) { // The selected bookmark is in the last position. + // Disable the menu item. moveBookmarkDownMenuItem.isEnabled = false // 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 menu item. + // Enable the menu item. moveBookmarkDownMenuItem.isEnabled = true // Set the icon. moveBookmarkDownMenuItem.setIcon(R.drawable.move_down_enabled) } + + // Create a list of selected bookmark positions. + val selectedBookmarkPositionsList = mutableListOf() + + // Get the array of checked bookmark positions. + val checkedBookmarkPositionsSparseBooleanArray = bookmarksListView.checkedItemPositions + + // Get the checked bookmarks positions sparse boolean array size. + val checkedBookmarkPositionsSparseBooleanArraySize = checkedBookmarkPositionsSparseBooleanArray.size() + + // Get the position of the bookmarks that are selected. If other bookmarks have previously been selected they will be included in the sparse boolean array with a value of `false`. + for (i in 0 until checkedBookmarkPositionsSparseBooleanArraySize) { + // Check to see if the value for the bookmark is true, meaning it is currently selected. + if (checkedBookmarkPositionsSparseBooleanArray.valueAt(i)) { + // Add the selected bookmarks positions to the list. + selectedBookmarkPositionsList.add(checkedBookmarkPositionsSparseBooleanArray.keyAt(i)) + } + } + + // Get the selected bookmark positions list size. + val selectedBookmarkPositionsListSize = selectedBookmarkPositionsList.size + + // Create a contiguous selected bookmarks tracker. + var selectedBookmarksAreContiguous = true + + for (i in 0 until selectedBookmarkPositionsListSize) { + // Check all the items after the first one. + if (i > 0) { + // Mark the list as not contiguous if any of the bookmark positions jump by more than 1. + if (selectedBookmarkPositionsList.elementAt(i) - selectedBookmarkPositionsList.elementAt(i - 1) != 1) + selectedBookmarksAreContiguous = false + } + } + + // Update the move to top menu item. + if (selectedBookmarkIdsLongArray.contains(firstBookmarkDatabaseId.toLong()) && selectedBookmarksAreContiguous) { // The selected bookmarks contains the first bookmark and they are contiguous. + // Disable the menu item. + moveToTopMenuItem.isEnabled = false + + // Set the icon. + moveToTopMenuItem.setIcon(R.drawable.move_to_top_disabled) + } else { // The selected bookmarks do not contain the first bookmark. + // Enable the menu item. + moveToTopMenuItem.isEnabled = true + + // Set the icon. + moveToTopMenuItem.setIcon(R.drawable.move_to_top_enabled) + } + + // Update the move to bottom menu item. + if (selectedBookmarkIdsLongArray.contains(lastBookmarkDatabaseId.toLong()) && selectedBookmarksAreContiguous) { // The selected bookmarks contains the last bookmark and they are contiguous. + // Disable the menu item. + moveToBottomMenuItem.isEnabled = false + + // Set the icon. + moveToBottomMenuItem.setIcon(R.drawable.move_to_bottom_disabled) + } else { // The selected bookmarks do not contain the last bookmark. + // Enable the menu item. + moveToBottomMenuItem.isEnabled = true + + // Set the icon. + moveToBottomMenuItem.setIcon(R.drawable.move_to_bottom_enabled) + } } private fun scrollBookmarks(selectedBookmarkPosition: Int) { diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.kt b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.kt index 2f9b09e4..c6172edd 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.kt @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Privacy Browser Android. If not, see . + * along with Privacy Browser Android. If not, see . */ package com.stoutner.privacybrowser.activities @@ -4562,13 +4562,13 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook navigationScrollToBottomMenuItem.title = getString(R.string.scroll_to_bottom) // Set the icon. - navigationScrollToBottomMenuItem.icon = AppCompatResources.getDrawable(applicationContext, R.drawable.move_down_enabled) + navigationScrollToBottomMenuItem.icon = AppCompatResources.getDrawable(applicationContext, R.drawable.move_to_bottom_enabled) } else { // The WebView is not scrolled to the top. // Set the title. navigationScrollToBottomMenuItem.title = getString(R.string.scroll_to_top) // Set the icon. - navigationScrollToBottomMenuItem.icon = AppCompatResources.getDrawable(applicationContext, R.drawable.move_up_enabled) + navigationScrollToBottomMenuItem.icon = AppCompatResources.getDrawable(applicationContext, R.drawable.move_to_top_enabled) } // Display the number of blocked requests. diff --git a/app/src/main/java/com/stoutner/privacybrowser/helpers/BookmarksDatabaseHelper.kt b/app/src/main/java/com/stoutner/privacybrowser/helpers/BookmarksDatabaseHelper.kt index 929ce15c..98235479 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/helpers/BookmarksDatabaseHelper.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/helpers/BookmarksDatabaseHelper.kt @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Privacy Browser Android. If not, see . + * along with Privacy Browser Android. If not, see . */ package com.stoutner.privacybrowser.helpers diff --git a/app/src/main/res/drawable/about_blue.xml b/app/src/main/res/drawable/about_blue.xml index 05b7570e..ac2df642 100644 --- a/app/src/main/res/drawable/about_blue.xml +++ b/app/src/main/res/drawable/about_blue.xml @@ -1,4 +1,4 @@ - + + + + + + + + + + + + + + + + + + + . It is released under the Apache License 2.0. --> + . It is released under the Apache License 2.0. --> + + + + + + + + + . It is released under the Apache License 2.0. --> + . It is released under the Apache License 2.0. --> + + . - This file is derived from elements of `bookmark` and `create_new_folder`, which are part of the Android Material icon set. They are released under the Apache License 2.0 . + This file is derived from elements of `bookmark` and `create_new_folder`, which are part of the Android Material icon set . They are released under the Apache License 2.0. This file is part of Privacy Browser Android . @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> + + + + + + + . --> + along with Privacy Browser Android. If not, see . --> + + . - This file is derived from `exit_to_app`, which is part of the Android Material icon set. It is released under the Apache License 2.0. + This file is derived from `exit_to_app`, which is part of the Android Material icon set . It is released under the Apache License 2.0. This file is part of Privacy Browser Android . @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> . - This file is derived from `exit_to_app`, which is part of the Android Material icon set. It is released under the Apache License 2.0. + This file is derived from `exit_to_app`, which is part of the Android Material icon set . It is released under the Apache License 2.0. This file is part of Privacy Browser Android . @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> + + + + + + + + + + + + + + + + . - This file is derived from `security` and `language`, which are part of the Android Material icon set. They are released under the Apache License 2.0. + This file is derived from `security` and `language`, which are part of the Android Material icon set . They are released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> . --> + along with Privacy Browser Android. If not, see . --> diff --git a/app/src/main/res/drawable/lock.xml b/app/src/main/res/drawable/lock.xml index cc00ae00..27625f4d 100644 --- a/app/src/main/res/drawable/lock.xml +++ b/app/src/main/res/drawable/lock.xml @@ -1,4 +1,4 @@ - + - \ No newline at end of file + diff --git a/app/src/main/res/drawable/menu.xml b/app/src/main/res/drawable/menu.xml index 67d9f2b8..a556dc02 100644 --- a/app/src/main/res/drawable/menu.xml +++ b/app/src/main/res/drawable/menu.xml @@ -1,4 +1,4 @@ - + + + . --> + + android:viewportHeight="960" + android:viewportWidth="960" > - \ No newline at end of file + android:pathData="M440,647v-447q0,-17 11.5,-28.5T480,160q17,0 28.5,11.5T520,200v447l196,-196q12,-12 28,-11.5t28,12.5q11,12 11.5,28T772,508L508,772q-6,6 -13,8.5t-15,2.5q-8,0 -15,-2.5t-13,-8.5L188,508q-11,-11 -11,-27.5t11,-28.5q12,-12 28.5,-12t28.5,12l195,195Z" /> + diff --git a/app/src/main/res/drawable/move_down_enabled.xml b/app/src/main/res/drawable/move_down_enabled.xml index e957ae01..70007af9 100644 --- a/app/src/main/res/drawable/move_down_enabled.xml +++ b/app/src/main/res/drawable/move_down_enabled.xml @@ -1,13 +1,13 @@ - + + android:viewportHeight="960" + android:viewportWidth="960" > - \ No newline at end of file + android:pathData="M440,647v-447q0,-17 11.5,-28.5T480,160q17,0 28.5,11.5T520,200v447l196,-196q12,-12 28,-11.5t28,12.5q11,12 11.5,28T772,508L508,772q-6,6 -13,8.5t-15,2.5q-8,0 -15,-2.5t-13,-8.5L188,508q-11,-11 -11,-27.5t11,-28.5q12,-12 28.5,-12t28.5,12l195,195Z" /> + diff --git a/app/src/main/res/drawable/move_to_bottom_disabled.xml b/app/src/main/res/drawable/move_to_bottom_disabled.xml new file mode 100644 index 00000000..fa6313c5 --- /dev/null +++ b/app/src/main/res/drawable/move_to_bottom_disabled.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/move_to_bottom_enabled.xml b/app/src/main/res/drawable/move_to_bottom_enabled.xml new file mode 100644 index 00000000..6c671b84 --- /dev/null +++ b/app/src/main/res/drawable/move_to_bottom_enabled.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/move_to_folder_blue.xml b/app/src/main/res/drawable/move_to_folder_blue.xml index 2187503e..8883f2ca 100644 --- a/app/src/main/res/drawable/move_to_folder_blue.xml +++ b/app/src/main/res/drawable/move_to_folder_blue.xml @@ -1,9 +1,9 @@ + along with Privacy Browser Android. If not, see . --> . --> + + + + + diff --git a/app/src/main/res/drawable/move_to_top_enabled.xml b/app/src/main/res/drawable/move_to_top_enabled.xml new file mode 100644 index 00000000..eeb8eee9 --- /dev/null +++ b/app/src/main/res/drawable/move_to_top_enabled.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/move_up_disabled.xml b/app/src/main/res/drawable/move_up_disabled.xml index 6aa24cc3..4be762d3 100644 --- a/app/src/main/res/drawable/move_up_disabled.xml +++ b/app/src/main/res/drawable/move_up_disabled.xml @@ -1,13 +1,13 @@ - + + android:viewportHeight="960" + android:viewportWidth="960" > - \ No newline at end of file + android:pathData="M440,313 L244,509q-12,12 -28,11.5T188,508q-11,-12 -11.5,-28t11.5,-28l264,-264q6,-6 13,-8.5t15,-2.5q8,0 15,2.5t13,8.5l264,264q11,11 11,27.5T772,508q-12,12 -28.5,12T715,508L520,313v447q0,17 -11.5,28.5T480,800q-17,0 -28.5,-11.5T440,760v-447Z" /> + diff --git a/app/src/main/res/drawable/move_up_enabled.xml b/app/src/main/res/drawable/move_up_enabled.xml index 89f66c67..2d3574a3 100644 --- a/app/src/main/res/drawable/move_up_enabled.xml +++ b/app/src/main/res/drawable/move_up_enabled.xml @@ -1,13 +1,13 @@ - + + android:viewportHeight="960" + android:viewportWidth="960" > - \ No newline at end of file + android:pathData="M440,313 L244,509q-12,12 -28,11.5T188,508q-11,-12 -11.5,-28t11.5,-28l264,-264q6,-6 13,-8.5t15,-2.5q8,0 15,2.5t13,8.5l264,264q11,11 11,27.5T772,508q-12,12 -28.5,12T715,508L520,313v447q0,17 -11.5,28.5T480,800q-17,0 -28.5,-11.5T440,760v-447Z" /> + diff --git a/app/src/main/res/drawable/next.xml b/app/src/main/res/drawable/next.xml index 58bf8f71..6eb0a237 100644 --- a/app/src/main/res/drawable/next.xml +++ b/app/src/main/res/drawable/next.xml @@ -1,4 +1,4 @@ - + + . - This file is derived from `push_pin_filled`, which is part of the Android Material icon set and is released under the Apache License 2.0. + This file is derived from `push_pin_filled`, which is part of the Android Material icon set . It is released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 diff --git a/app/src/main/res/drawable/previous.xml b/app/src/main/res/drawable/previous.xml index 0964180a..dde1fd4a 100644 --- a/app/src/main/res/drawable/previous.xml +++ b/app/src/main/res/drawable/previous.xml @@ -1,4 +1,4 @@ - + . - This file is derived from `security` and `language`, which are part of the Android Material icon set. They are released under the Apache License 2.0. + This file is derived from `security` and `language`, which are part of the Android Material icon set . They are released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> . - This file is derived from `security` and `language`, which are part of the Android Material icon set. They are released under the Apache License 2.0. + This file is derived from `security` and `language`, which are part of the Android Material icon set . They are released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> . - This file is derived from `security` and `language`, which are part of the Android Material icon set. They are released under the Apache License 2.0. + This file is derived from `security` and `language`, which are part of the Android Material icon set . They are released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> + + + + + + + + + + + + + + + + . - This file is derived from `sort`, which is part of the Android Material icon set and is released under the Apache License 2.0. + This file is derived from `sort`, which is part of the Android Material icon set and is released under the Apache License 2.0 . - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> + + + + . - This file is derived from `security` and `language`, which are part of the Android Material icon set. They are released under the Apache License 2.0. + This file is derived from `security` and `language`, which are part of the Android Material icon set . They are released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> . - This file is derived from `compare`, which is part of the Android Material icon set. It is released under the Apache License 2.0. + This file is derived from `compare`, which is part of the Android Material icon set . It is released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> + . - This file is derived from `compare`, which is part of the Android Material icon set. It is released under the Apache License 2.0. + This file is derived from `compare`, which is part of the Android Material icon set . It is released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> . - This file is derived from `compare`, which is part of the Android Material icon set. It is released under the Apache License 2.0. + This file is derived from `compare`, which is part of the Android Material icon set . It is released under the Apache License 2.0. - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> + + . - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> + + + + @@ -45,21 +57,21 @@ diff --git a/app/src/main/res/menu/bookmarks_options_menu.xml b/app/src/main/res/menu/bookmarks_options_menu.xml index 03c8bded..c9dbd844 100644 --- a/app/src/main/res/menu/bookmarks_options_menu.xml +++ b/app/src/main/res/menu/bookmarks_options_menu.xml @@ -3,7 +3,7 @@ + along with Privacy Browser Android. If not, see . --> . - This file is part of Privacy Browser Android . + This file is part of Privacy Browser Android . 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 @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> @@ -49,7 +49,7 @@ . --> + along with Privacy Browser Android. If not, see . --> @@ -183,6 +183,7 @@ Grafik in neuem Tab öffnen Bild teilen URL kopieren + Text kopieren E-Mail-Adresse E-Mail-Adresse kopieren E-Mail senden diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eeaa5a23..ca05c276 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Privacy Browser Android. If not, see . --> + along with Privacy Browser Android. If not, see . --> Selected:\u0020 %1$d Move Up Move Down + Move to Top + Move to Bottom Edit Delete Select All @@ -607,10 +609,10 @@ Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36 Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1 Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 - Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0 + Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 + Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0 + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_Z) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15 Custom user agent diff --git a/build.gradle b/build.gradle index 027a715d..da3439b9 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Privacy Browser Android. If not, see . + * along with Privacy Browser Android. If not, see . */ // Top-level build file where you can add configuration options common to all sub-projects/modules.