X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fdialogs%2FCreateBookmarkDialog.java;h=f89649bc542d8f9910be6c37f74630a252b01f85;hp=b2966c14a4fb9fd067c22a55aac95a3c6b6ccfee;hb=f52255e6eeb1a6be9f190e733563cc37b5d1f2b5;hpb=e75f230075b4059be6a9b6d27d8b6b202c74a6ff diff --git a/app/src/main/java/com/stoutner/privacybrowser/dialogs/CreateBookmarkDialog.java b/app/src/main/java/com/stoutner/privacybrowser/dialogs/CreateBookmarkDialog.java index b2966c14..f89649bc 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/dialogs/CreateBookmarkDialog.java +++ b/app/src/main/java/com/stoutner/privacybrowser/dialogs/CreateBookmarkDialog.java @@ -1,5 +1,5 @@ /* - * Copyright © 2016-2017 Soren Stoutner . + * Copyright © 2016-2019 Soren Stoutner . * * This file is part of Privacy Browser . * @@ -24,39 +24,68 @@ import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.NonNull; -// We have to use `AppCompatDialogFragment` instead of `DialogFragment` or an error is produced on API <= 22. -import android.support.v7.app.AppCompatDialogFragment; +import android.preference.PreferenceManager; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; import android.widget.EditText; -import com.stoutner.privacybrowser.activities.MainWebViewActivity; +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; -public class CreateBookmarkDialog extends AppCompatDialogFragment { +import java.io.ByteArrayOutputStream; + +public class CreateBookmarkDialog extends DialogFragment { // The public interface is used to send information back to the parent activity. public interface CreateBookmarkListener { - void onCreateBookmark(AppCompatDialogFragment dialogFragment); + void onCreateBookmark(DialogFragment dialogFragment, Bitmap favoriteIconBitmap); } - // `createBookmarkListener` is used in `onAttach()` and `onCreateDialog()` + // The create bookmark listener is initialized in `onAttach()` and used in `onCreateDialog()`. private CreateBookmarkListener createBookmarkListener; - - public void onAttach(Context context) { + public void onAttach(@NonNull Context context) { + // Run the default commands. super.onAttach(context); - // Get a handle for `CreateBookmarkListener` from `context`. - try { - createBookmarkListener = (CreateBookmarkListener) context; - } catch(ClassCastException exception) { - throw new ClassCastException(context.toString() + " must implement `CreateBookmarkListener`."); - } + // Get a handle for the create bookmark listener from the launching context. + createBookmarkListener = (CreateBookmarkListener) context; + } + + public static CreateBookmarkDialog createBookmark(String url, String title, 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 variables in the bundle. + argumentsBundle.putString("url", url); + argumentsBundle.putString("title", title); + argumentsBundle.putByteArray("favorite_icon_byte_array", favoriteIconByteArray); + + // Create a new instance of the dialog. + CreateBookmarkDialog createBookmarkDialog = new CreateBookmarkDialog(); + + // Add the bundle to the dialog. + createBookmarkDialog.setArguments(argumentsBundle); + + // Return the new dialog. + return createBookmarkDialog; } // `@SuppressLing("InflateParams")` removes the warning about using `null` as the parent view group when inflating the `AlertDialog`. @@ -64,14 +93,40 @@ public class CreateBookmarkDialog extends AppCompatDialogFragment { @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { + // Get the arguments. + Bundle arguments = getArguments(); + + // Remove the incorrect lint warning below that the arguments might be null. + assert arguments != null; + + // Get the strings from the arguments. + String url = arguments.getString("url"); + String title = arguments.getString("title"); + + // 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); + + // Get a handle for the shared preferences. + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); + + // Get the theme and screenshot preferences. + boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false); + boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false); + // Create a drawable version of the favorite icon. - Drawable favoriteIconDrawable = new BitmapDrawable(getResources(), MainWebViewActivity.favoriteIconBitmap); + Drawable favoriteIconDrawable = new BitmapDrawable(getResources(), favoriteIconBitmap); - // Use `AlertDialog.Builder` to create the `AlertDialog`. + // Use an alert dialog builder to create the alert dialog. AlertDialog.Builder dialogBuilder; // 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); @@ -81,88 +136,87 @@ public class CreateBookmarkDialog extends AppCompatDialogFragment { dialogBuilder.setTitle(R.string.create_bookmark); dialogBuilder.setIcon(favoriteIconDrawable); + // Remove the warning below that `getLayoutInflater()` might be null. + assert getActivity() != null; + // Set the view. The parent view is `null` because it will be assigned by the `AlertDialog`. dialogBuilder.setView(getActivity().getLayoutInflater().inflate(R.layout.create_bookmark_dialog, null)); // Set an `onClick()` listener for the negative button. - dialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // Do nothing. The `AlertDialog` will close automatically. - } + dialogBuilder.setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> { + // Do nothing. The `AlertDialog` will close automatically. }); // Set an `onClick()` listener for the positive button. - dialogBuilder.setPositiveButton(R.string.create, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // Return the `DialogFragment` to the parent activity. - createBookmarkListener.onCreateBookmark(CreateBookmarkDialog.this); - } + dialogBuilder.setPositiveButton(R.string.create, (DialogInterface dialog, int which) -> { + // Return the `DialogFragment` to the parent activity. + createBookmarkListener.onCreateBookmark(this, favoriteIconBitmap); }); - // Create an `AlertDialog` from the `AlertDialog.Builder`. - final AlertDialog alertDialog = dialogBuilder.create(); + AlertDialog alertDialog = dialogBuilder.create(); - // Remove the warning below that `setSoftInputMode` might produce `java.lang.NullPointerException`. + // Remove the warning below that `getWindow()` might be null. assert alertDialog.getWindow() != null; + // Disable screenshots if not allowed. + if (!allowScreenshots) { + alertDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); + } + // Show the keyboard when the `AlertDialog` is displayed on the screen. alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); - // The `AlertDialog` needs to be shown before `setOnKeyListener()` can be called. + // The alert dialog needs to be shown before `setOnKeyListener()` can be called. alertDialog.show(); // Get a handle for `create_bookmark_name_edittext`. - EditText createBookmarkNameEditText = (EditText) alertDialog.findViewById(R.id.create_bookmark_name_edittext); + EditText createBookmarkNameEditText = alertDialog.findViewById(R.id.create_bookmark_name_edittext); // Set the current `WebView` title as the text for `create_bookmark_name_edittext`. - createBookmarkNameEditText.setText(MainWebViewActivity.webViewTitle); - - // Allow the `enter` key on the keyboard to create the bookmark from `create_bookmark_name_edittext`. - createBookmarkNameEditText.setOnKeyListener(new View.OnKeyListener() { - public boolean onKey(View view, int keyCode, KeyEvent event) { - // If the event is a key-down on the `enter` key, select the `PositiveButton` `Create`. - if ((keyCode == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN)) { - // Trigger `createBookmarkListener` and return the `DialogFragment` to the parent activity. - createBookmarkListener.onCreateBookmark(CreateBookmarkDialog.this); - - // Manually dismiss the `AlertDialog`. - alertDialog.dismiss(); - - // Consume the event. - return true; - } else { // If any other key was pressed, do not consume the event. - return false; - } + createBookmarkNameEditText.setText(title); + + // Allow the `enter` key on the keyboard to create the bookmark from the create bookmark name edittext`. + createBookmarkNameEditText.setOnKeyListener((View view, int keyCode, KeyEvent keyEvent) -> { + // If the event is a key-down on the `enter` key, select the create button. + if ((keyCode == KeyEvent.KEYCODE_ENTER) && (keyEvent.getAction() == KeyEvent.ACTION_DOWN)) { + // Trigger the create bookmark listener and return the dialog fragment and the favorite icon bitmap to the parent activity. + createBookmarkListener.onCreateBookmark(this, favoriteIconBitmap); + + // Manually dismiss the alert dialog. + alertDialog.dismiss(); + + // Consume the event. + return true; + } else { // Some other key was pressed. + // Do not consume the event. + return false; } }); - // Set the formattedUrlString as the initial text of `create_bookmark_url_edittext`. - EditText createBookmarkUrlEditText = (EditText) alertDialog.findViewById(R.id.create_bookmark_url_edittext); - createBookmarkUrlEditText.setText(MainWebViewActivity.formattedUrlString); - - // Allow the `enter` key on the keyboard to create the bookmark from `create_bookmark_url_edittext`. - createBookmarkUrlEditText.setOnKeyListener(new View.OnKeyListener() { - public boolean onKey(View v, int keyCode, KeyEvent event) { - // If the event is a key-down on the "enter" key, select the PositiveButton "Create". - if ((keyCode == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN)) { - // Trigger `createBookmarkListener` and return the DialogFragment to the parent activity. - createBookmarkListener.onCreateBookmark(CreateBookmarkDialog.this); - - // Manually dismiss the `AlertDialog`. - alertDialog.dismiss(); - - // Consume the event. - return true; - } else { // If any other key was pressed, do not consume the event. - return false; - } + // Set the formatted URL string as the initial text of the create bookmark URL edit text. + EditText createBookmarkUrlEditText = alertDialog.findViewById(R.id.create_bookmark_url_edittext); + createBookmarkUrlEditText.setText(url); + + // Allow the enter key on the keyboard to create the bookmark from create bookmark URL edit text. + createBookmarkUrlEditText.setOnKeyListener((View v, int keyCode, KeyEvent keyEvent) -> { + // If the event is a key-down on the `enter` key, select the create button. + if ((keyCode == KeyEvent.KEYCODE_ENTER) && (keyEvent.getAction() == KeyEvent.ACTION_DOWN)) { + // Trigger the create bookmark listener and return the dialog fragment and the favorite icon bitmap to the parent activity. + createBookmarkListener.onCreateBookmark(this, favoriteIconBitmap); + + // Manually dismiss the alert dialog. + alertDialog.dismiss(); + + // Consume the event. + return true; + } else { // Some other key was pressed. + // Do not consume the event. + return false; } }); - // `onCreateDialog()` requires the return of an `AlertDialog`. + // Return the alert dialog. return alertDialog; } } \ No newline at end of file