X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fdialogs%2FEditBookmarkDialog.java;h=adf6d44e39946801f741f205436f889efd1b49f5;hp=64efa611a134d622d594d07413df36100fe4003a;hb=ca7516a7edb9e06d0f9fe9186513986cd82be716;hpb=33bd447a83bd3d763ee26bbb3a3f4adb074776ed diff --git a/app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkDialog.java b/app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkDialog.java index 64efa611..adf6d44e 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkDialog.java +++ b/app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkDialog.java @@ -24,13 +24,12 @@ import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; -import android.support.annotation.NonNull; -// `AppCompatDialogFragment` is required instead of `DialogFragment` or an error is produced on API <=22. -import android.support.v7.app.AppCompatDialogFragment; +import android.preference.PreferenceManager; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; @@ -42,26 +41,24 @@ import android.widget.ImageView; import android.widget.RadioButton; import android.widget.RadioGroup; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; // The AndroidX dialog fragment must be used or an error is produced on API <=22. + import com.stoutner.privacybrowser.R; -import com.stoutner.privacybrowser.activities.MainWebViewActivity; import com.stoutner.privacybrowser.helpers.BookmarksDatabaseHelper; -public class EditBookmarkDialog extends AppCompatDialogFragment { - // Instantiate the class variables. +import java.io.ByteArrayOutputStream; + +public class EditBookmarkDialog extends DialogFragment { + // Define the edit bookmark listener. private EditBookmarkListener editBookmarkListener; - private EditText nameEditText; - private EditText urlEditText; - private RadioButton newIconRadioButton; - private Button editButton; - private String currentName; - private String currentUrl; // The public interface is used to send information back to the parent activity. public interface EditBookmarkListener { - void onSaveBookmark(AppCompatDialogFragment dialogFragment, int selectedBookmarkDatabaseId); + void onSaveBookmark(DialogFragment dialogFragment, int selectedBookmarkDatabaseId, Bitmap favoriteIconBitmap); } - public void onAttach(Context context) { + public void onAttach(@NonNull Context context) { // Run the default commands. super.onAttach(context); @@ -70,16 +67,28 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { } // Store the database ID in the arguments bundle. - public static EditBookmarkDialog bookmarkDatabaseId(int databaseId) { - // Create a bundle. - Bundle bundle = new Bundle(); + public static EditBookmarkDialog bookmarkDatabaseId(int databaseId, Bitmap favoriteIconBitmap) { + // Create a favorite icon byte array output stream. + ByteArrayOutputStream favoriteIconByteArrayOutputStream = new ByteArrayOutputStream(); + + // Convert the favorite icon to a PNG and place it in the byte array output stream. `0` is for lossless compression (the only option for a PNG). + favoriteIconBitmap.compress(Bitmap.CompressFormat.PNG, 0, favoriteIconByteArrayOutputStream); + + // Convert the byte array output stream to a byte array. + byte[] favoriteIconByteArray = favoriteIconByteArrayOutputStream.toByteArray(); - // Store the bookmark database ID in the bundle. - bundle.putInt("Database ID", databaseId); + // Create an arguments bundle. + Bundle argumentsBundle = new Bundle(); - // Add the bundle to the dialog. + // Store the variables in the bundle. + argumentsBundle.putInt("database_id", databaseId); + argumentsBundle.putByteArray("favorite_icon_byte_array", favoriteIconByteArray); + + // Create a new instance of the dialog. EditBookmarkDialog editBookmarkDialog = new EditBookmarkDialog(); - editBookmarkDialog.setArguments(bundle); + + // Add the arguments bundle to the dialog. + editBookmarkDialog.setArguments(argumentsBundle); // Return the new dialog. return editBookmarkDialog; @@ -90,11 +99,23 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { - // Remove the incorrect lint warning that `getInt()` might be null. - assert getArguments() != null; + // Get the arguments. + Bundle arguments = getArguments(); + + // Remove the incorrect lint warning below that the arguments might be null. + assert arguments != null; // Store the bookmark database ID in the class variable. - int selectedBookmarkDatabaseId = getArguments().getInt("Database ID"); + int selectedBookmarkDatabaseId = arguments.getInt("database_id"); + + // Get the favorite icon byte array. + byte[] favoriteIconByteArray = arguments.getByteArray("favorite_icon_byte_array"); + + // Remove the incorrect lint warning below that the favorite icon byte array might be null. + assert favoriteIconByteArray != null; + + // Convert the favorite icon byte array to a bitmap. + Bitmap favoriteIconBitmap = BitmapFactory.decodeByteArray(favoriteIconByteArray, 0, favoriteIconByteArray.length); // Initialize the database helper. The `0` specifies a database version, but that is ignored and set instead using a constant in `BookmarksDatabaseHelper`. BookmarksDatabaseHelper bookmarksDatabaseHelper = new BookmarksDatabaseHelper(getContext(), null, null, 0); @@ -106,8 +127,15 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { // Use an alert dialog builder to create the alert dialog. AlertDialog.Builder dialogBuilder; + // Get a handle for the shared preferences. + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); + + // Get the screenshot and theme preferences. + boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false); + boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false); + // Set the style according to the theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { dialogBuilder = new AlertDialog.Builder(getActivity(), R.style.PrivacyBrowserAlertDialogDark); } else { dialogBuilder = new AlertDialog.Builder(getActivity(), R.style.PrivacyBrowserAlertDialogLight); @@ -130,7 +158,7 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { // Set the save button listener. dialogBuilder.setPositiveButton(R.string.save, (DialogInterface dialog, int which) -> { // Return the dialog fragment to the parent activity. - editBookmarkListener.onSaveBookmark(EditBookmarkDialog.this, selectedBookmarkDatabaseId); + editBookmarkListener.onSaveBookmark(this, selectedBookmarkDatabaseId, favoriteIconBitmap); }); // Create an alert dialog from the builder. @@ -140,13 +168,10 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { assert alertDialog.getWindow() != null; // Disable screenshots if not allowed. - if (!MainWebViewActivity.allowScreenshots) { + if (!allowScreenshots) { alertDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } - // Show the keyboard when the alert dialog is displayed on the screen. - alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); - // The alert dialog must be shown before items in the layout can be modified. alertDialog.show(); @@ -154,26 +179,25 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { RadioGroup iconRadioGroup = alertDialog.findViewById(R.id.edit_bookmark_icon_radiogroup); ImageView currentIconImageView = alertDialog.findViewById(R.id.edit_bookmark_current_icon); ImageView newFavoriteIconImageView = alertDialog.findViewById(R.id.edit_bookmark_webpage_favorite_icon); - newIconRadioButton = alertDialog.findViewById(R.id.edit_bookmark_webpage_favorite_icon_radiobutton); - nameEditText = alertDialog.findViewById(R.id.edit_bookmark_name_edittext); - urlEditText = alertDialog.findViewById(R.id.edit_bookmark_url_edittext); - editButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + EditText nameEditText = alertDialog.findViewById(R.id.edit_bookmark_name_edittext); + EditText urlEditText = alertDialog.findViewById(R.id.edit_bookmark_url_edittext); + Button editButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); - // Get the current favorite icon byte array from the `Cursor`. + // Get the current favorite icon byte array from the cursor. byte[] currentIconByteArray = bookmarkCursor.getBlob(bookmarkCursor.getColumnIndex(BookmarksDatabaseHelper.FAVORITE_ICON)); - // Convert the byte array to a `Bitmap` beginning at the first byte and ending at the last. + // Convert the byte array to a bitmap beginning at the first byte and ending at the last. Bitmap currentIconBitmap = BitmapFactory.decodeByteArray(currentIconByteArray, 0, currentIconByteArray.length); - // Display `currentIconBitmap` in `edit_bookmark_current_icon`. + // Display the current icon bitmap. currentIconImageView.setImageBitmap(currentIconBitmap); - // Get a `Bitmap` of the favorite icon from `MainWebViewActivity` and display it in `edit_bookmark_web_page_favorite_icon`. - newFavoriteIconImageView.setImageBitmap(MainWebViewActivity.favoriteIconBitmap); + // Set the new favorite icon bitmap. + newFavoriteIconImageView.setImageBitmap(favoriteIconBitmap); // Store the current bookmark name and URL. - currentName = bookmarkCursor.getString(bookmarkCursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_NAME)); - currentUrl = bookmarkCursor.getString(bookmarkCursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_URL)); + String currentName = bookmarkCursor.getString(bookmarkCursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_NAME)); + String currentUrl = bookmarkCursor.getString(bookmarkCursor.getColumnIndex(BookmarksDatabaseHelper.BOOKMARK_URL)); // Populate the edit texts. nameEditText.setText(currentName); @@ -185,7 +209,7 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { // Update the edit button if the icon selection changes. iconRadioGroup.setOnCheckedChangeListener((RadioGroup group, int checkedId) -> { // Update the edit button. - updateEditButton(); + updateEditButton(alertDialog, currentName, currentUrl); }); // Update the edit button if the bookmark name changes. @@ -203,7 +227,7 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { @Override public void afterTextChanged(Editable s) { // Update the edit button. - updateEditButton(); + updateEditButton(alertDialog, currentName, currentUrl); } }); @@ -222,7 +246,7 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { @Override public void afterTextChanged(Editable s) { // Update the edit button. - updateEditButton(); + updateEditButton(alertDialog, currentName, currentUrl); } }); @@ -231,7 +255,7 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { // Save the bookmark if the event is a key-down on the "enter" button. if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER) && editButton.isEnabled()) { // The enter key was pressed and the edit button is enabled. // Trigger the `Listener` and return the `DialogFragment` to the parent activity. - editBookmarkListener.onSaveBookmark(EditBookmarkDialog.this, selectedBookmarkDatabaseId); + editBookmarkListener.onSaveBookmark(this, selectedBookmarkDatabaseId, favoriteIconBitmap); // Manually dismiss `alertDialog`. alertDialog.dismiss(); @@ -248,7 +272,7 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { // Save the bookmark if the event is a key-down on the "enter" button. if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER) && editButton.isEnabled()) { // The enter key was pressed and the edit button is enabled. // Trigger the `Listener` and return the DialogFragment to the parent activity. - editBookmarkListener.onSaveBookmark(EditBookmarkDialog.this, selectedBookmarkDatabaseId); + editBookmarkListener.onSaveBookmark(this, selectedBookmarkDatabaseId, favoriteIconBitmap); // Manually dismiss the alert dialog. alertDialog.dismiss(); @@ -264,8 +288,14 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { return alertDialog; } - private void updateEditButton() { - // Get the text from the `EditTexts`. + private void updateEditButton(AlertDialog alertdialog, String currentName, String currentUrl) { + // Get handles for the views. + EditText nameEditText = alertdialog.findViewById(R.id.edit_bookmark_name_edittext); + EditText urlEditText = alertdialog.findViewById(R.id.edit_bookmark_url_edittext); + RadioButton newIconRadioButton = alertdialog.findViewById(R.id.edit_bookmark_webpage_favorite_icon_radiobutton); + Button editButton = alertdialog.getButton(AlertDialog.BUTTON_POSITIVE); + + // Get the text from the edit texts. String newName = nameEditText.getText().toString(); String newUrl = urlEditText.getText().toString();