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=df4a1a14e2e175fceeeaf6f9690bb1711692824c;hp=64efa611a134d622d594d07413df36100fe4003a;hb=74655c0cd0ba72c80ac6c48df55bc3d2f5280ad2;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..df4a1a14 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkDialog.java +++ b/app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkDialog.java @@ -1,5 +1,5 @@ /* - * Copyright © 2016-2019 Soren Stoutner . + * Copyright © 2016-2020 Soren Stoutner . * * This file is part of Privacy Browser . * @@ -20,17 +20,15 @@ package com.stoutner.privacybrowser.dialogs; import android.annotation.SuppressLint; -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 +40,25 @@ import android.widget.ImageView; import android.widget.RadioButton; import android.widget.RadioGroup; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; + 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(); + + // Create an arguments bundle. + Bundle argumentsBundle = new Bundle(); - // Store the bookmark database ID in the bundle. - bundle.putInt("Database ID", databaseId); + // Store the variables in the bundle. + argumentsBundle.putInt("database_id", databaseId); + argumentsBundle.putByteArray("favorite_icon_byte_array", favoriteIconByteArray); - // Add the bundle to the dialog. + // 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); @@ -104,14 +125,7 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { bookmarkCursor.moveToFirst(); // Use an alert dialog builder to create the alert dialog. - AlertDialog.Builder dialogBuilder; - - // Set the style according to the theme. - if (MainWebViewActivity.darkTheme) { - dialogBuilder = new AlertDialog.Builder(getActivity(), R.style.PrivacyBrowserAlertDialogDark); - } else { - dialogBuilder = new AlertDialog.Builder(getActivity(), R.style.PrivacyBrowserAlertDialogLight); - } + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(requireContext(), R.style.PrivacyBrowserAlertDialog); // Set the title. dialogBuilder.setTitle(R.string.edit_bookmark); @@ -130,7 +144,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. @@ -139,14 +153,17 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { // remove the incorrect lint warning below that `getWindow().addFlags()` might be null. assert alertDialog.getWindow() != null; + // Get a handle for the shared preferences. + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); + + // Get the screenshot preference. + boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false); + // 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 +171,32 @@ 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); - - // Get the current favorite icon byte array from the `Cursor`. + 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); + + // Remove the incorrect lint warnings below that the views might be null. + assert iconRadioGroup != null; + assert currentIconImageView != null; + assert newFavoriteIconImageView != null; + assert nameEditText != null; + assert urlEditText != null; + + // 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 +208,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 +226,7 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { @Override public void afterTextChanged(Editable s) { // Update the edit button. - updateEditButton(); + updateEditButton(alertDialog, currentName, currentUrl); } }); @@ -222,7 +245,7 @@ public class EditBookmarkDialog extends AppCompatDialogFragment { @Override public void afterTextChanged(Editable s) { // Update the edit button. - updateEditButton(); + updateEditButton(alertDialog, currentName, currentUrl); } }); @@ -231,7 +254,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 +271,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 +287,19 @@ 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); + + // Remove the incorrect lint warnings below that the views might be null. + assert nameEditText != null; + assert urlEditText != null; + assert newIconRadioButton != null; + + // Get the text from the edit texts. String newName = nameEditText.getText().toString(); String newUrl = urlEditText.getText().toString();