/*
- * Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
*
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.support.design.widget.Snackbar;
+import android.support.v4.app.NavUtils;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.ResourceCursorAdapter;
// `AppCompatDialogFragment` is required instead of `DialogFragment` or an error is produced on API <=22.
import android.support.v7.app.AppCompatDialogFragment;
import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
private static final int ALL_FOLDERS_DATABASE_ID = -2;
private static final int HOME_FOLDER_DATABASE_ID = -1;
- // `bookmarksDatabaseHelper` is used in `onCreate()` and `updateBookmarksListView()`.
+ // `bookmarksDatabaseHelper` is used in `onCreate()`, `updateBookmarksListView()`, and `onDestroy()`.
private BookmarksDatabaseHelper bookmarksDatabaseHelper;
- // `bookmarksCursor` is used in `onCreate()`, `updateBookmarksListView()`, `onSaveBookmark()`, and `onSaveBookmarkFolder()`.
+ // `bookmarksCursor` is used in `onCreate()`, `updateBookmarksListView()`, `onSaveBookmark()`, `onSaveBookmarkFolder()`, and `onDestroy()`.
private Cursor bookmarksCursor;
- // `bookmarksCursorAdapter` is used in `onCreate()`, `onSaveBookmark()`, `onSaveBookmarkFolder()`.
+ // `bookmarksCursorAdapter` is used in `onCreate()` and `updateBookmarksListView()`.
private CursorAdapter bookmarksCursorAdapter;
// `oldFolderNameString` is used in `onCreate()` and `onSaveBookmarkFolder()`.
private String oldFolderNameString;
- // `currentFolderDatabaseId` is used in `onCreate()`, `onSaveBookmark()`, and `onSaveBookmarkFolder()`.
+ // `currentFolderDatabaseId` is used in `onCreate()`, `updateBookmarksListView()`, `onSaveBookmark()`, and `onSaveBookmarkFolder()`.
private int currentFolderDatabaseId;
// `currentFolder` is used in `onCreate()`, `onSaveBookmark()`, and `onSaveBookmarkFolder()`.
private String currentFolderName;
+ // `sortByDisplayOrder` is used in `onCreate()`, `onOptionsItemSelected()`, and `updateBookmarksListView()`.
+ private boolean sortByDisplayOrder;
+
@Override
public void onCreate(Bundle savedInstanceState) {
// Disable screenshots if not allowed.
setContentView(R.layout.bookmarks_databaseview_coordinatorlayout);
// The `SupportActionBar` from `android.support.v7.app.ActionBar` must be used until the minimum API is >= 21.
- final Toolbar bookmarksDatabaseViewAppBar = findViewById(R.id.bookmarks_databaseview_toolbar);
+ Toolbar bookmarksDatabaseViewAppBar = findViewById(R.id.bookmarks_databaseview_toolbar);
setSupportActionBar(bookmarksDatabaseViewAppBar);
// Get a handle for the `AppBar`.
- final ActionBar appBar = getSupportActionBar();
+ ActionBar appBar = getSupportActionBar();
// Remove the incorrect warning in Android Studio that `appBar` might be null.
assert appBar != null;
- // Display the `Spinner` and the back arrow in the `AppBar`.
- appBar.setCustomView(R.layout.bookmarks_databaseview_spinner);
+ // Display the spinner and the back arrow in the app bar.
+ appBar.setCustomView(R.layout.spinner);
appBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_HOME_AS_UP);
// Initialize the database handler. `this` specifies the context. The two `null`s do not specify the database name or a `CursorFactory`. The `0` is to specify a database version, but that is set instead using a constant in `BookmarksDatabaseHelper`.
bookmarksDatabaseHelper = new BookmarksDatabaseHelper(this, null, null, 0);
- // Setup a `MatrixCursor` for "All Folders" and "Home Folder".
+ // Setup a matrix cursor for "All Folders" and "Home Folder".
String[] matrixCursorColumnNames = {BookmarksDatabaseHelper._ID, BookmarksDatabaseHelper.BOOKMARK_NAME};
MatrixCursor matrixCursor = new MatrixCursor(matrixCursorColumnNames);
matrixCursor.addRow(new Object[]{ALL_FOLDERS_DATABASE_ID, getString(R.string.all_folders)});
// Combine `matrixCursor` and `foldersCursor`.
MergeCursor foldersMergeCursor = new MergeCursor(new Cursor[]{matrixCursor, foldersCursor});
- // Create a `ResourceCursorAdapter` for the `Spinner` with `this` context. `0` specifies no flags.;
- ResourceCursorAdapter foldersCursorAdapter = new ResourceCursorAdapter(this, R.layout.bookmarks_databaseview_spinner_item, foldersMergeCursor, 0) {
+ // Create a resource cursor adapter for the spinner.
+ ResourceCursorAdapter foldersCursorAdapter = new ResourceCursorAdapter(this, R.layout.appbar_spinner_item, foldersMergeCursor, 0) {
@Override
public void bindView(View view, Context context, Cursor cursor) {
- // Get a handle for the `Spinner` item `TextView`.
+ // Get a handle for the spinner item text view.
TextView spinnerItemTextView = view.findViewById(R.id.spinner_item_textview);
- // Set the `TextView` to display the folder name.
+ // Set the text view to display the folder name.
spinnerItemTextView.setText(cursor.getString(cursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_NAME)));
}
};
- // Set the `ResourceCursorAdapter` drop drown view resource.
- foldersCursorAdapter.setDropDownViewResource(R.layout.bookmarks_databaseview_spinner_dropdown_item);
-
- // Get a handle for the folder `Spinner`.
- Spinner folderSpinner = findViewById(R.id.bookmarks_databaseview_spinner);
+ // Set the resource cursor adapter drop drown view resource.
+ foldersCursorAdapter.setDropDownViewResource(R.layout.appbar_spinner_dropdown_item);
- // Set the adapter for the folder `Spinner`.
+ // Get a handle for the folder spinner and set the adapter.
+ Spinner folderSpinner = findViewById(R.id.spinner);
folderSpinner.setAdapter(foldersCursorAdapter);
- // Handle clicks on the `Spinner` dropdown.
+ // Handle clicks on the spinner dropdown.
folderSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- // Convert the database ID to an `int`.
- int databaseId = (int) id;
-
// Store the current folder database ID.
- currentFolderDatabaseId = databaseId;
-
- // Populate the bookmarks `ListView` based on the `Spinner` selection.
- switch (databaseId) {
- // Get a cursor with all the folders.
- case ALL_FOLDERS_DATABASE_ID:
- bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor();
- break;
-
- // Get a cursor for the home folder.
- case HOME_FOLDER_DATABASE_ID:
- bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor("");
- break;
+ currentFolderDatabaseId = (int) id;
- // Display the selected folder.
- default:
- // Get a handle for the selected view.
- TextView selectedFolderTextView = view.findViewById(R.id.spinner_item_textview);
+ // Get a handle for the selected view.
+ TextView selectedFolderTextView = findViewById(R.id.spinner_item_textview);
- // Extract the name of the selected folder.
- String folderName = selectedFolderTextView.getText().toString();
+ // Store the current folder name.
+ currentFolderName = selectedFolderTextView.getText().toString();
- // Get a cursor for the selected folder.
- bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor(folderName);
-
- // Store the current folder name.
- currentFolderName = folderName;
- }
-
- // Update the `ListView`.
- bookmarksCursorAdapter.changeCursor(bookmarksCursor);
+ // Update the list view.
+ updateBookmarksListView();
}
@Override
});
}
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu.
+ getMenuInflater().inflate(R.menu.bookmarks_databaseview_options_menu, menu);
+
+ // Success.
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem menuItem) {
+ // Get the ID of the menu item that was selected.
+ int menuItemId = menuItem.getItemId();
+
+ switch (menuItemId) {
+ case android.R.id.home: // The home arrow is identified as `android.R.id.home`, not just `R.id.home`.
+ // Return to `MainWebViewActivity`.
+ NavUtils.navigateUpFromSameTask(this);
+ break;
+
+ case R.id.options_menu_sort:
+ // Update the sort by display order tracker.
+ sortByDisplayOrder = !sortByDisplayOrder;
+
+ // Get a handle for the bookmarks `ListView`.
+ ListView bookmarksListView = findViewById(R.id.bookmarks_databaseview_listview);
+
+ // Update the icon and display a snackbar.
+ if (sortByDisplayOrder) { // Sort by display order.
+ // Update the icon according to the theme.
+ if (MainWebViewActivity.darkTheme) {
+ menuItem.setIcon(R.drawable.sort_selected_dark);
+ } else {
+ menuItem.setIcon(R.drawable.sort_selected_light);
+ }
+
+ // Display a Snackbar indicating the current sort type.
+ Snackbar.make(bookmarksListView, R.string.sorted_by_display_order, Snackbar.LENGTH_SHORT).show();
+ } else { // Sort by database id.
+ // Update the icon according to the theme.
+ if (MainWebViewActivity.darkTheme) {
+ menuItem.setIcon(R.drawable.sort_dark);
+ } else {
+ menuItem.setIcon(R.drawable.sort_light);
+ }
+
+ // Display a Snackbar indicating the current sort type.
+ Snackbar.make(bookmarksListView, R.string.sorted_by_database_id, Snackbar.LENGTH_SHORT).show();
+ }
+
+ // Update the list view.
+ updateBookmarksListView();
+ break;
+ }
+ return true;
+ }
+
+ private void updateBookmarksListView() {
+ // Populate the bookmarks list view based on the spinner selection.
+ switch (currentFolderDatabaseId) {
+ // Get a cursor with all the folders.
+ case ALL_FOLDERS_DATABASE_ID:
+ if (sortByDisplayOrder) {
+ bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursorByDisplayOrder();
+ } else {
+ bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor();
+ }
+ break;
+
+ // Get a cursor for the home folder.
+ case HOME_FOLDER_DATABASE_ID:
+ if (sortByDisplayOrder) {
+ bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursorByDisplayOrder("");
+ } else {
+ bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor("");
+ }
+ break;
+
+ // Display the selected folder.
+ default:
+ // Get a cursor for the selected folder.
+ if (sortByDisplayOrder) {
+ bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursorByDisplayOrder(currentFolderName);
+ } else {
+ bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor(currentFolderName);
+ }
+ }
+
+ // Update the list view.
+ bookmarksCursorAdapter.changeCursor(bookmarksCursor);
+ }
+
@Override
public void onSaveBookmark(AppCompatDialogFragment dialogFragment, int selectedBookmarkDatabaseId) {
// Get handles for the views from dialog fragment.
bookmarksDatabaseHelper.updateBookmark(selectedBookmarkDatabaseId, bookmarkNameString, bookmarkUrlString, parentFolderNameString, displayOrderInt, newFavoriteIconByteArray);
}
- // Update `bookmarksCursor` with the contents of the current folder.
- switch (currentFolderDatabaseId) {
- case ALL_FOLDERS_DATABASE_ID:
- // Get a cursor with all the bookmarks.
- bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor();
- break;
-
- case HOME_FOLDER_DATABASE_ID:
- // Get a cursor with all the bookmarks in the home folder.
- bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor("");
- break;
-
- default:
- // Get a cursor with all the bookmarks in the current folder.
- bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor(currentFolderName);
- }
-
- // Update the `ListView`.
- bookmarksCursorAdapter.changeCursor(bookmarksCursor);
+ // Update the list view.
+ updateBookmarksListView();
}
@Override
bookmarksDatabaseHelper.updateFolder(selectedBookmarkDatabaseId, oldFolderNameString, newFolderNameString, parentFolderNameString, displayOrderInt, newFolderIconByteArray);
}
- // Update `bookmarksCursor` with the contents of the current folder.
- switch (currentFolderDatabaseId) {
- case ALL_FOLDERS_DATABASE_ID:
- // Get a cursor with all the bookmarks.
- bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor();
- break;
-
- case HOME_FOLDER_DATABASE_ID:
- // Get a cursor with all the bookmarks in the home folder.
- bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor("");
- break;
+ // Update the list view.
+ updateBookmarksListView();
+ }
- default:
- // Get a cursor with all the bookmarks in the current folder.
- bookmarksCursor = bookmarksDatabaseHelper.getAllBookmarksCursor(currentFolderName);
- }
+ @Override
+ public void onDestroy() {
+ // Close the bookmarks cursor and database.
+ bookmarksCursor.close();
+ bookmarksDatabaseHelper.close();
- // Update the `ListView`.
- bookmarksCursorAdapter.changeCursor(bookmarksCursor);
+ // Run the default commands.
+ super.onDestroy();
}
}
\ No newline at end of file