X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FBookmarksDatabaseViewActivity.kt;h=227c4149846db099a471ad573ab39418dc98d277;hp=ad408ecee8c691e1ada7a4ea2e437f1b588db746;hb=bc1692b6c9d99726e7c6b7cf6a5c24f67f042b18;hpb=2f0d40bbfc1aca5d88e711422cec58d912b66884 diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksDatabaseViewActivity.kt b/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksDatabaseViewActivity.kt index ad408ece..227c4149 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksDatabaseViewActivity.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksDatabaseViewActivity.kt @@ -61,24 +61,30 @@ import com.stoutner.privacybrowser.dialogs.EditBookmarkDatabaseViewDialog.Compan import com.stoutner.privacybrowser.dialogs.EditBookmarkDatabaseViewDialog.EditBookmarkDatabaseViewListener import com.stoutner.privacybrowser.dialogs.EditBookmarkFolderDatabaseViewDialog.Companion.folderDatabaseId import com.stoutner.privacybrowser.dialogs.EditBookmarkFolderDatabaseViewDialog.EditBookmarkFolderDatabaseViewListener +import com.stoutner.privacybrowser.helpers.BOOKMARK_NAME +import com.stoutner.privacybrowser.helpers.BOOKMARK_URL +import com.stoutner.privacybrowser.helpers.DISPLAY_ORDER +import com.stoutner.privacybrowser.helpers.FAVORITE_ICON +import com.stoutner.privacybrowser.helpers.FOLDER_ID +import com.stoutner.privacybrowser.helpers.ID +import com.stoutner.privacybrowser.helpers.IS_FOLDER +import com.stoutner.privacybrowser.helpers.PARENT_FOLDER_ID import com.stoutner.privacybrowser.helpers.BookmarksDatabaseHelper import java.io.ByteArrayOutputStream import java.util.Arrays +// Define the public class constants. +const val HOME_FOLDER_DATABASE_ID = -1 +const val HOME_FOLDER_ID = 0L + // Define the private class constants. private const val ALL_FOLDERS_DATABASE_ID = -2 -private const val CURRENT_FOLDER_DATABASE_ID = "current_folder_database_id" -private const val CURRENT_FOLDER_NAME = "current_folder_name" -private const val SORT_BY_DISPLAY_ORDER = "sort_by_display_order" +private const val CURRENT_FOLDER_DATABASE_ID = "A" +private const val SORT_BY_DISPLAY_ORDER = "B" class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseViewListener, EditBookmarkFolderDatabaseViewListener { - companion object { - // Define the public class constants. - const val HOME_FOLDER_DATABASE_ID = -1 - } - // Define the class variables. private var closeActivityAfterDismissingSnackbar = false private var currentFolderDatabaseId = 0 @@ -90,8 +96,6 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV private lateinit var bookmarksCursor: Cursor private lateinit var bookmarksDatabaseHelper: BookmarksDatabaseHelper private lateinit var bookmarksListView: ListView - private lateinit var currentFolderName: String - private lateinit var oldFolderNameString: String public override fun onCreate(savedInstanceState: Bundle?) { // Get a handle for the shared preferences. @@ -110,10 +114,10 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV super.onCreate(savedInstanceState) // Get the favorite icon byte array. - val favoriteIconByteArray = intent.getByteArrayExtra(CURRENT_FAVORITE_ICON_BYTE_ARRAY)!! + val currentFavoriteIconByteArray = intent.getByteArrayExtra(CURRENT_FAVORITE_ICON_BYTE_ARRAY)!! // Convert the favorite icon byte array to a bitmap and store it in a class variable. - val favoriteIconBitmap = BitmapFactory.decodeByteArray(favoriteIconByteArray, 0, favoriteIconByteArray.size) + val currentFavoriteIconBitmap = BitmapFactory.decodeByteArray(currentFavoriteIconByteArray, 0, currentFavoriteIconByteArray.size) // Set the view according to the theme. if (bottomAppBar) { @@ -129,7 +133,7 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV // Get a handle for the toolbar. val toolbar = findViewById(R.id.bookmarks_databaseview_toolbar) - val bookmarksListView = findViewById(R.id.bookmarks_databaseview_listview) + bookmarksListView = findViewById(R.id.bookmarks_databaseview_listview) // Set the support action bar. setSupportActionBar(toolbar) @@ -158,16 +162,16 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV bookmarksDatabaseHelper = BookmarksDatabaseHelper(this) // Create a matrix cursor column name string array. - val matrixCursorColumnNames = arrayOf(BookmarksDatabaseHelper.ID, BookmarksDatabaseHelper.BOOKMARK_NAME) + val matrixCursorColumnNames = arrayOf(ID, BOOKMARK_NAME, PARENT_FOLDER_ID) // Setup the matrix cursor. MatrixCursor(matrixCursorColumnNames).use { matrixCursor -> // Add "All Folders" and "Home Folder" to the matrix cursor. - matrixCursor.addRow(arrayOf(ALL_FOLDERS_DATABASE_ID, getString(R.string.all_folders))) - matrixCursor.addRow(arrayOf(HOME_FOLDER_DATABASE_ID, getString(R.string.home_folder))) + matrixCursor.addRow(arrayOf(ALL_FOLDERS_DATABASE_ID, getString(R.string.all_folders), HOME_FOLDER_ID)) + matrixCursor.addRow(arrayOf(HOME_FOLDER_DATABASE_ID, getString(R.string.home_folder), HOME_FOLDER_ID)) // Get a cursor with the list of all the folders. - val foldersCursor = bookmarksDatabaseHelper.allFolders + val foldersCursor = bookmarksDatabaseHelper.getFoldersExcept(listOf()) // Combine the matrix cursor and the folders cursor. val foldersMergeCursor = MergeCursor(arrayOf(matrixCursor, foldersCursor)) @@ -182,11 +186,24 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV val defaultFolderBitmap = defaultFolderBitmapDrawable.bitmap // Create a resource cursor adapter for the spinner. - val foldersCursorAdapter: ResourceCursorAdapter = object : ResourceCursorAdapter(this, R.layout.appbar_spinner_item, foldersMergeCursor, 0) { + val foldersCursorAdapter: ResourceCursorAdapter = object : ResourceCursorAdapter(this, R.layout.bookmarks_databaseview_appbar_spinner_item, foldersMergeCursor, 0) { override fun bindView(view: View, context: Context, cursor: Cursor) { // Get handles for the spinner views. - val spinnerItemImageView = view.findViewById(R.id.spinner_item_imageview) - val spinnerItemTextView = view.findViewById(R.id.spinner_item_textview) + val subfolderSpacerTextView = view.findViewById(R.id.subfolder_spacer_textview) + val folderIconImageView = view.findViewById(R.id.folder_icon_imageview) + val folderNameTextView = view.findViewById(R.id.folder_name_textview) + + // Populate the subfolder spacer if it is not null (the spinner is open). + if (subfolderSpacerTextView != null) { + // Indent subfolders. + if (cursor.getLong(cursor.getColumnIndexOrThrow(PARENT_FOLDER_ID)) != HOME_FOLDER_ID) { // The folder is not in the home folder. + // Get the subfolder spacer. + subfolderSpacerTextView.text = bookmarksDatabaseHelper.getSubfolderSpacer(cursor.getLong(cursor.getColumnIndexOrThrow(FOLDER_ID))) + } else { // The folder is in the home folder. + // Reset the subfolder spacer. + subfolderSpacerTextView.text = "" + } + } // Set the folder icon according to the type. if (foldersMergeCursor.position > 1) { // Set a user folder icon. @@ -200,7 +217,7 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV val defaultFolderIconByteArray = defaultFolderIconByteArrayOutputStream.toByteArray() // Get the folder icon byte array from the cursor. - val folderIconByteArray = cursor.getBlob(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.FAVORITE_ICON)) + val folderIconByteArray = cursor.getBlob(cursor.getColumnIndexOrThrow(FAVORITE_ICON)) // Convert the byte array to a bitmap beginning at the first byte and ending at the last. val folderIconBitmap = BitmapFactory.decodeByteArray(folderIconByteArray, 0, folderIconByteArray.size) @@ -208,23 +225,23 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV // Set the icon according to the type. if (Arrays.equals(folderIconByteArray, defaultFolderIconByteArray)) { // The default folder icon is used. // Set a smaller and darker folder icon, which works well with the spinner. - spinnerItemImageView.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.folder_dark_blue)) + folderIconImageView.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.folder_dark_blue)) } else { // A custom folder icon is uses. // Set the folder image stored in the cursor. - spinnerItemImageView.setImageBitmap(folderIconBitmap) + folderIconImageView.setImageBitmap(folderIconBitmap) } } else { // Set the `All Folders` or `Home Folder` icon. // Set the gray folder image. - spinnerItemImageView.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.folder_gray)) + folderIconImageView.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.folder_gray)) } - // Set the text view to display the folder name. - spinnerItemTextView.text = cursor.getString(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.BOOKMARK_NAME)) + // Set the folder name. + folderNameTextView.text = cursor.getString(cursor.getColumnIndexOrThrow(BOOKMARK_NAME)) } } // Set the resource cursor adapter drop drown view resource. - foldersCursorAdapter.setDropDownViewResource(R.layout.appbar_spinner_dropdown_item) + foldersCursorAdapter.setDropDownViewResource(R.layout.bookmarks_databaseview_appbar_spinner_dropdown_item) // Get a handle for the folder spinner. val folderSpinner = findViewById(R.id.spinner) @@ -240,12 +257,6 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV // Store the current folder database ID. currentFolderDatabaseId = id.toInt() - // Get a handle for the selected view. - val selectedFolderTextView = findViewById(R.id.spinner_item_textview) - - // Store the current folder name. - currentFolderName = selectedFolderTextView.text.toString() - // Update the list view. updateBookmarksListView() } @@ -263,7 +274,6 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV } else { // The activity was restarted. // Restore the class variables from the saved instance state. currentFolderDatabaseId = savedInstanceState.getInt(CURRENT_FOLDER_DATABASE_ID) - currentFolderName = savedInstanceState.getString(CURRENT_FOLDER_NAME)!! sortByDisplayOrder = savedInstanceState.getBoolean(SORT_BY_DISPLAY_ORDER) // Update the spinner if the home folder is selected. Android handles this by default for the main cursor but not the matrix cursor. @@ -284,66 +294,71 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV override fun bindView(view: View, context: Context, cursor: Cursor) { // Get handles for the views. - val bookmarkDatabaseIdTextView = view.findViewById(R.id.bookmarks_databaseview_database_id) - val bookmarkFavoriteIcon = view.findViewById(R.id.bookmarks_databaseview_favorite_icon) - val bookmarkNameTextView = view.findViewById(R.id.bookmarks_databaseview_bookmark_name) - val bookmarkUrlTextView = view.findViewById(R.id.bookmarks_databaseview_bookmark_url) - val bookmarkDisplayOrderTextView = view.findViewById(R.id.bookmarks_databaseview_display_order) - val parentFolderImageView = view.findViewById(R.id.bookmarks_databaseview_parent_folder_icon) - val bookmarkParentFolderTextView = view.findViewById(R.id.bookmarks_databaseview_parent_folder) + val databaseIdTextView = view.findViewById(R.id.database_id_textview) + val bookmarkFavoriteIconImageView = view.findViewById(R.id.favorite_icon_imageview) + val nameTextView = view.findViewById(R.id.name_textview) + val folderIdTextView = view.findViewById(R.id.folder_id_textview) + val urlTextView = view.findViewById(R.id.url_textview) + val displayOrderTextView = view.findViewById(R.id.display_order_textview) + val parentFolderIconImageView = view.findViewById(R.id.parent_folder_icon_imageview) + val parentFolderTextView = view.findViewById(R.id.parent_folder_textview) // Get the information from the cursor. - val bookmarkDatabaseId = cursor.getInt(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.ID)) - val bookmarkFavoriteIconByteArray = cursor.getBlob(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.FAVORITE_ICON)) - val bookmarkNameString = cursor.getString(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.BOOKMARK_NAME)) - val bookmarkUrlString = cursor.getString(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.BOOKMARK_URL)) - val bookmarkDisplayOrder = cursor.getInt(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.DISPLAY_ORDER)) - val bookmarkParentFolder = cursor.getString(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.PARENT_FOLDER)) + val databaseId = cursor.getInt(cursor.getColumnIndexOrThrow(ID)) + val bookmarkFavoriteIconByteArray = cursor.getBlob(cursor.getColumnIndexOrThrow(FAVORITE_ICON)) + val nameString = cursor.getString(cursor.getColumnIndexOrThrow(BOOKMARK_NAME)) + val folderId = cursor.getLong(cursor.getColumnIndexOrThrow(FOLDER_ID)) + val urlString = cursor.getString(cursor.getColumnIndexOrThrow(BOOKMARK_URL)) + val displayOrder = cursor.getInt(cursor.getColumnIndexOrThrow(DISPLAY_ORDER)) + val parentFolderId = cursor.getLong(cursor.getColumnIndexOrThrow(PARENT_FOLDER_ID)) // Convert the byte array to a `Bitmap` beginning at the beginning at the first byte and ending at the last. val bookmarkFavoriteIconBitmap = BitmapFactory.decodeByteArray(bookmarkFavoriteIconByteArray, 0, bookmarkFavoriteIconByteArray.size) // Populate the views. - bookmarkDatabaseIdTextView.text = bookmarkDatabaseId.toString() - bookmarkFavoriteIcon.setImageBitmap(bookmarkFavoriteIconBitmap) - bookmarkNameTextView.text = bookmarkNameString - bookmarkUrlTextView.text = bookmarkUrlString - bookmarkDisplayOrderTextView.text = bookmarkDisplayOrder.toString() + databaseIdTextView.text = databaseId.toString() + bookmarkFavoriteIconImageView.setImageBitmap(bookmarkFavoriteIconBitmap) + nameTextView.text = nameString + urlTextView.text = urlString + displayOrderTextView.text = displayOrder.toString() // Check to see if the bookmark is a folder. - if (cursor.getInt(cursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.IS_FOLDER)) == 1) { // The bookmark is a folder. + if (cursor.getInt(cursor.getColumnIndexOrThrow(IS_FOLDER)) == 1) { // The bookmark is a folder. // Make the font bold. When the first argument is null the font is not changed. - bookmarkNameTextView.setTypeface(null, Typeface.BOLD) + nameTextView.setTypeface(null, Typeface.BOLD) + + // Display the folder ID. + folderIdTextView.text = getString(R.string.folder_id_separator, folderId) // Hide the URL. - bookmarkUrlTextView.visibility = View.GONE + urlTextView.visibility = View.GONE } else { // The bookmark is not a folder. // Reset the font to default. - bookmarkNameTextView.typeface = Typeface.DEFAULT + nameTextView.typeface = Typeface.DEFAULT // Show the URL. - bookmarkUrlTextView.visibility = View.VISIBLE + urlTextView.visibility = View.VISIBLE } // Make the folder name gray if it is the home folder. - if (bookmarkParentFolder.isEmpty()) { // The bookmark is in the home folder. + if (parentFolderId == HOME_FOLDER_ID) { // The bookmark is in the home folder. // Get the home folder icon. - parentFolderImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.folder_gray)) + parentFolderIconImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.folder_gray)) // Set the parent folder text to be `Home Folder`. - bookmarkParentFolderTextView.setText(R.string.home_folder) + parentFolderTextView.setText(R.string.home_folder) // Set the home folder text to be gray. - bookmarkParentFolderTextView.setTextColor(getColor(R.color.gray_500)) + parentFolderTextView.setTextColor(getColor(R.color.gray_500)) } else { // The bookmark is in a subfolder. - // Get the parent folder icon. - parentFolderImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.folder_dark_blue)) + // Set the parent folder icon. + parentFolderIconImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.folder_dark_blue)) // Set the parent folder name. - bookmarkParentFolderTextView.text = bookmarkParentFolder + parentFolderTextView.text = bookmarksDatabaseHelper.getFolderName(parentFolderId) // Set the parent folder text color. - bookmarkParentFolderTextView.setTextColor(getColor(R.color.parent_folder_text)) + parentFolderTextView.setTextColor(getColor(R.color.parent_folder_text)) } } } @@ -358,17 +373,14 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV // Show the edit bookmark or edit bookmark folder dialog. if (bookmarksDatabaseHelper.isFolder(databaseId)) { - // Save the current folder name, which is used in `onSaveBookmarkFolder()`. - oldFolderNameString = bookmarksCursor.getString(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.BOOKMARK_NAME)) - // Instantiate the edit bookmark folder dialog. - val editBookmarkFolderDatabaseViewDialog: DialogFragment = folderDatabaseId(databaseId, favoriteIconBitmap) + val editBookmarkFolderDatabaseViewDialog = folderDatabaseId(databaseId, currentFavoriteIconBitmap) // Make it so. editBookmarkFolderDatabaseViewDialog.show(supportFragmentManager, resources.getString(R.string.edit_folder)) } else { // Instantiate the edit bookmark dialog. - val editBookmarkDatabaseViewDialog: DialogFragment = bookmarkDatabaseId(databaseId, favoriteIconBitmap) + val editBookmarkDatabaseViewDialog = bookmarkDatabaseId(databaseId, currentFavoriteIconBitmap) // Make it so. editBookmarkDatabaseViewDialog.show(supportFragmentManager, resources.getString(R.string.edit_bookmark)) @@ -436,13 +448,13 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV // Do not allow a bookmark to be deselected if the folder is selected. if (!checked) { - // Get the folder name. - val folderName = bookmarksDatabaseHelper.getParentFolderName(id.toInt()) + // Get the parent folder ID. + val parentFolderId = bookmarksDatabaseHelper.getParentFolderId(databaseId) // If the bookmark is not in the root folder, check to see if the folder is selected. - if (folderName.isNotEmpty()) { - // Get the database ID of the folder. - val folderDatabaseId = bookmarksDatabaseHelper.getFolderDatabaseId(folderName) + if (parentFolderId != HOME_FOLDER_ID) { + // Get the folder database ID. + val folderDatabaseId = bookmarksDatabaseHelper.getFolderDatabaseId(parentFolderId) // Move the bookmarks cursor to the first position. bookmarksCursor.moveToFirst() @@ -453,7 +465,7 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV // Get the position of the folder in the bookmarks cursor. while ((folderPosition < 0) && (bookmarksCursor.position < bookmarksCursor.count)) { // Check if the folder database ID matches the bookmark database ID. - if (folderDatabaseId == bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.ID))) { + if (folderDatabaseId == bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(ID))) { // Get the folder position. folderPosition = bookmarksCursor.position @@ -501,26 +513,32 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV // Populate the bookmarks cursor. bookmarksCursor = when (currentFolderDatabaseId) { // Get all the bookmarks except the ones being deleted. - ALL_FOLDERS_DATABASE_ID -> + ALL_FOLDERS_DATABASE_ID -> { if (sortByDisplayOrder) bookmarksDatabaseHelper.getAllBookmarksByDisplayOrderExcept(selectedBookmarksIdsLongArray) else bookmarksDatabaseHelper.getAllBookmarksExcept(selectedBookmarksIdsLongArray) + } // Get the home folder bookmarks except the ones being deleted. - HOME_FOLDER_DATABASE_ID -> + HOME_FOLDER_DATABASE_ID -> { if (sortByDisplayOrder) - bookmarksDatabaseHelper.getBookmarksByDisplayOrderExcept(selectedBookmarksIdsLongArray, "") + bookmarksDatabaseHelper.getBookmarksByDisplayOrderExcept(selectedBookmarksIdsLongArray, HOME_FOLDER_ID) else - bookmarksDatabaseHelper.getBookmarksExcept(selectedBookmarksIdsLongArray, "") - + bookmarksDatabaseHelper.getBookmarksExcept(selectedBookmarksIdsLongArray, HOME_FOLDER_ID) + } // Get the current folder bookmarks except the ones being deleted. - else -> + else -> { + // Get the current folder ID. + val currentFolderId = bookmarksDatabaseHelper.getFolderId(currentFolderDatabaseId) + + // Get the cursor. if (sortByDisplayOrder) - bookmarksDatabaseHelper.getBookmarksByDisplayOrderExcept(selectedBookmarksIdsLongArray, currentFolderName) + bookmarksDatabaseHelper.getBookmarksByDisplayOrderExcept(selectedBookmarksIdsLongArray, currentFolderId) else - bookmarksDatabaseHelper.getBookmarksExcept(selectedBookmarksIdsLongArray, currentFolderName) + bookmarksDatabaseHelper.getBookmarksExcept(selectedBookmarksIdsLongArray, currentFolderId) + } } // Update the list view. @@ -557,8 +575,13 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV deleteMenuItem.isEnabled = true // Close the activity if back has been pressed. - if (closeActivityAfterDismissingSnackbar) + if (closeActivityAfterDismissingSnackbar) { + // Reload the bookmarks list view when returning to the bookmarks activity. + BookmarksActivity.restartFromBookmarksDatabaseViewActivity = true + + // Finish the activity. finish() + } } }) @@ -592,6 +615,15 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV return true } + public override fun onDestroy() { + // Close the bookmarks cursor and database. + bookmarksCursor.close() + bookmarksDatabaseHelper.close() + + // Run the default commands. + super.onDestroy() + } + override fun onOptionsItemSelected(menuItem: MenuItem): Boolean { // Get the menu item ID. val menuItemId = menuItem.itemId @@ -633,112 +665,10 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV // Store the class variables in the bundle. savedInstanceState.putInt(CURRENT_FOLDER_DATABASE_ID, currentFolderDatabaseId) - savedInstanceState.putString(CURRENT_FOLDER_NAME, currentFolderName) savedInstanceState.putBoolean(SORT_BY_DISPLAY_ORDER, sortByDisplayOrder) } - private fun prepareFinish() { - // Check to see if a snackbar is currently displayed. If so, it must be closed before existing so that a pending delete is completed before reloading the list view in the bookmarks activity. - 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 current folder in the bookmarks activity. - if (currentFolderDatabaseId == ALL_FOLDERS_DATABASE_ID || currentFolderDatabaseId == HOME_FOLDER_DATABASE_ID) { // All folders or the the home folder are currently displayed. - // Load the home folder. - BookmarksActivity.currentFolder = "" - } else { // A subfolder is currently displayed. - // Load the current folder. - BookmarksActivity.currentFolder = currentFolderName - } - - // Reload the bookmarks list view when returning to the bookmarks activity. - BookmarksActivity.restartFromBookmarksDatabaseViewActivity = true - - // Exit the bookmarks database view activity. - finish() - } - } - - private fun updateBookmarksListView() { - // Populate the bookmarks list view based on the spinner selection. - bookmarksCursor = when (currentFolderDatabaseId) { - // Get all the bookmarks. - ALL_FOLDERS_DATABASE_ID -> - if (sortByDisplayOrder) - bookmarksDatabaseHelper.allBookmarksByDisplayOrder - else - bookmarksDatabaseHelper.allBookmarks - - // Get the bookmarks in the current folder. - HOME_FOLDER_DATABASE_ID -> - if (sortByDisplayOrder) - bookmarksDatabaseHelper.getBookmarksByDisplayOrder("") - else - bookmarksDatabaseHelper.getBookmarks("") - - // Get the bookmarks in the specified folder. - else -> - if (sortByDisplayOrder) - bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderName) - else - bookmarksDatabaseHelper.getBookmarks(currentFolderName) - } - - // Update the cursor adapter if it isn't null, which happens when the activity is restarted. - if (bookmarksCursorAdapter != null) { - bookmarksCursorAdapter!!.changeCursor(bookmarksCursor) - } - } - - private fun selectAllBookmarksInFolder(folderId: Int) { - // Get the folder name. - val folderName = bookmarksDatabaseHelper.getFolderName(folderId) - - // Get a cursor with the contents of the folder. - val folderCursor = bookmarksDatabaseHelper.getBookmarks(folderName) - - // Move to the beginning of the cursor. - folderCursor.moveToFirst() - - while (folderCursor.position < folderCursor.count) { - // Get the bookmark database ID. - val bookmarkId = folderCursor.getInt(folderCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.ID)) - - // Move the bookmarks cursor to the first position. - bookmarksCursor.moveToFirst() - - // Initialize the bookmark position variable. - var bookmarkPosition = -1 - - // Get the position of this bookmark in the bookmarks cursor. - while ((bookmarkPosition < 0) && (bookmarksCursor.position < bookmarksCursor.count)) { - // Check if the bookmark IDs match. - if (bookmarkId == bookmarksCursor.getInt(bookmarksCursor.getColumnIndexOrThrow(BookmarksDatabaseHelper.ID))) { - // Get the bookmark position. - bookmarkPosition = bookmarksCursor.position - - // If this bookmark is a folder, select all the bookmarks inside it. - if (bookmarksDatabaseHelper.isFolder(bookmarkId)) - selectAllBookmarksInFolder(bookmarkId) - - // Select the bookmark. - bookmarksListView.setItemChecked(bookmarkPosition, true) - } - - // Increment the bookmarks cursor position. - bookmarksCursor.moveToNext() - } - - // Move to the next position. - folderCursor.moveToNext() - } - } - - override fun onSaveBookmark(dialogFragment: DialogFragment, selectedBookmarkDatabaseId: Int, favoriteIconBitmap: Bitmap) { + override fun saveBookmark(dialogFragment: DialogFragment, selectedBookmarkDatabaseId: Int, favoriteIconBitmap: Bitmap) { // Get the dialog from the dialog fragment. val dialog = dialogFragment.dialog!! @@ -755,15 +685,15 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV val folderDatabaseId = folderSpinner.selectedItemId.toInt() val displayOrderInt = displayOrderEditText.text.toString().toInt() - // Get the parent folder name. - val parentFolderNameString: String = if (folderDatabaseId == HOME_FOLDER_DATABASE_ID) // The home folder is selected. Use `""`. - "" + // Get the parent folder ID. + val parentFolderId: Long = if (folderDatabaseId == HOME_FOLDER_DATABASE_ID) // The home folder is selected. + HOME_FOLDER_ID else // Get the parent folder name from the database. - bookmarksDatabaseHelper.getFolderName(folderDatabaseId) + bookmarksDatabaseHelper.getFolderId(folderDatabaseId) // Update the bookmark. if (currentIconRadioButton.isChecked) { // Update the bookmark without changing the favorite icon. - bookmarksDatabaseHelper.updateBookmark(selectedBookmarkDatabaseId, bookmarkNameString, bookmarkUrlString, parentFolderNameString, displayOrderInt) + bookmarksDatabaseHelper.updateBookmark(selectedBookmarkDatabaseId, bookmarkNameString, bookmarkUrlString, parentFolderId, displayOrderInt) } else { // Update the bookmark using the `WebView` favorite icon. // Create a favorite icon byte array output stream. val newFavoriteIconByteArrayOutputStream = ByteArrayOutputStream() @@ -775,14 +705,14 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV val newFavoriteIconByteArray = newFavoriteIconByteArrayOutputStream.toByteArray() // Update the bookmark and the favorite icon. - bookmarksDatabaseHelper.updateBookmark(selectedBookmarkDatabaseId, bookmarkNameString, bookmarkUrlString, parentFolderNameString, displayOrderInt, newFavoriteIconByteArray) + bookmarksDatabaseHelper.updateBookmark(selectedBookmarkDatabaseId, bookmarkNameString, bookmarkUrlString, parentFolderId, displayOrderInt, newFavoriteIconByteArray) } // Update the list view. updateBookmarksListView() } - override fun onSaveBookmarkFolder(dialogFragment: DialogFragment, selectedFolderDatabaseId: Int, favoriteIconBitmap: Bitmap) { + override fun saveBookmarkFolder(dialogFragment: DialogFragment, selectedFolderDatabaseId: Int, favoriteIconBitmap: Bitmap) { // Get the dialog from the dialog fragment. val dialog = dialogFragment.dialog!! @@ -799,15 +729,15 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV val parentFolderDatabaseId = parentFolderSpinner.selectedItemId.toInt() val displayOrderInt = displayOrderEditText.text.toString().toInt() - // Set the parent folder name. - val parentFolderNameString: String = if (parentFolderDatabaseId == HOME_FOLDER_DATABASE_ID) // The home folder is selected. Use `""`. - "" + // Set the parent folder ID. + val parentFolderId: Long = if (parentFolderDatabaseId == HOME_FOLDER_DATABASE_ID) // The home folder is selected. + HOME_FOLDER_ID else // Get the parent folder name from the database. - bookmarksDatabaseHelper.getFolderName(parentFolderDatabaseId) + bookmarksDatabaseHelper.getFolderId(parentFolderDatabaseId) // Update the folder. if (currentIconRadioButton.isChecked) { // Update the folder without changing the favorite icon. - bookmarksDatabaseHelper.updateFolder(selectedFolderDatabaseId, oldFolderNameString, newFolderNameString, parentFolderNameString, displayOrderInt) + bookmarksDatabaseHelper.updateFolder(selectedFolderDatabaseId, newFolderNameString, parentFolderId, displayOrderInt) } else { // Update the folder and the icon. // Get the new folder icon bitmap. val folderIconBitmap = if (defaultIconRadioButton.isChecked) { @@ -834,19 +764,120 @@ class BookmarksDatabaseViewActivity : AppCompatActivity(), EditBookmarkDatabaseV val newFolderIconByteArray = newFolderIconByteArrayOutputStream.toByteArray() // Update the folder and the icon. - bookmarksDatabaseHelper.updateFolder(selectedFolderDatabaseId, oldFolderNameString, newFolderNameString, parentFolderNameString, displayOrderInt, newFolderIconByteArray) + bookmarksDatabaseHelper.updateFolder(selectedFolderDatabaseId, newFolderNameString, parentFolderId, displayOrderInt, newFolderIconByteArray) } // Update the list view. updateBookmarksListView() } - public override fun onDestroy() { - // Close the bookmarks cursor and database. - bookmarksCursor.close() - bookmarksDatabaseHelper.close() + private fun updateBookmarksListView() { + // Populate the bookmarks list view based on the spinner selection. + bookmarksCursor = when (currentFolderDatabaseId) { + // Get all the bookmarks. + ALL_FOLDERS_DATABASE_ID -> { + if (sortByDisplayOrder) + bookmarksDatabaseHelper.allBookmarksByDisplayOrder + else + bookmarksDatabaseHelper.allBookmarks + } - // Run the default commands. - super.onDestroy() + // Get the bookmarks in the home folder. + HOME_FOLDER_DATABASE_ID -> { + if (sortByDisplayOrder) + bookmarksDatabaseHelper.getBookmarksByDisplayOrder(HOME_FOLDER_ID) + else + bookmarksDatabaseHelper.getBookmarks(HOME_FOLDER_ID) + } + + // Get the bookmarks in the specified folder. + else -> { + // Get the current folder ID. + val currentFolderId = bookmarksDatabaseHelper.getFolderId(currentFolderDatabaseId) + + if (sortByDisplayOrder) + bookmarksDatabaseHelper.getBookmarksByDisplayOrder(currentFolderId) + else + bookmarksDatabaseHelper.getBookmarks(currentFolderId) + } + } + + // Update the cursor adapter if it isn't null, which happens when the activity is restarted. + if (bookmarksCursorAdapter != null) { + bookmarksCursorAdapter!!.changeCursor(bookmarksCursor) + } + } + + private fun prepareFinish() { + // Check to see if a snackbar is currently displayed. If so, it must be closed before existing so that a pending delete is completed before reloading the list view in the bookmarks activity. + 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 current folder in the bookmarks activity. + if ((currentFolderDatabaseId == ALL_FOLDERS_DATABASE_ID) || (currentFolderDatabaseId == HOME_FOLDER_DATABASE_ID)) { // All folders or the the home folder are currently displayed. + // Load the home folder. + BookmarksActivity.currentFolderId = HOME_FOLDER_ID + } else { // A subfolder is currently displayed. + // Load the current folder. + BookmarksActivity.currentFolderId = bookmarksDatabaseHelper.getFolderId(currentFolderDatabaseId) + } + + // Reload the bookmarks list view when returning to the bookmarks activity. + BookmarksActivity.restartFromBookmarksDatabaseViewActivity = true + + // Exit the bookmarks database view activity. + finish() + } + } + + private fun selectAllBookmarksInFolder(folderDatabaseId: Int) { + // Get the folder ID. + val folderId = bookmarksDatabaseHelper.getFolderId(folderDatabaseId) + + // Get a cursor with the contents of the folder. + val folderCursor = bookmarksDatabaseHelper.getBookmarks(folderId) + + // Get the column indexes. + val idColumnIndex = bookmarksCursor.getColumnIndexOrThrow(ID) + + // Move to the beginning of the cursor. + folderCursor.moveToFirst() + + while (folderCursor.position < folderCursor.count) { + // Get the bookmark database ID. + val bookmarkId = folderCursor.getInt(folderCursor.getColumnIndexOrThrow(ID)) + + // Move the bookmarks cursor to the first position. + bookmarksCursor.moveToFirst() + + // Initialize the bookmark position variable. + var bookmarkPosition = -1 + + // Get the position of this bookmark in the bookmarks cursor. + while ((bookmarkPosition < 0) && (bookmarksCursor.position < bookmarksCursor.count)) { + // Check if the bookmark IDs match. + if (bookmarkId == bookmarksCursor.getInt(idColumnIndex)) { + // Get the bookmark position. + bookmarkPosition = bookmarksCursor.position + + // If this bookmark is a folder, select all the bookmarks inside it. + if (bookmarksDatabaseHelper.isFolder(bookmarkId)) + selectAllBookmarksInFolder(bookmarkId) + + // Select the bookmark. + bookmarksListView.setItemChecked(bookmarkPosition, true) + } + + // Increment the bookmarks cursor position. + bookmarksCursor.moveToNext() + } + + // Move to the next position. + folderCursor.moveToNext() + } } }