X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fasynctasks%2FSaveWebpageImage.java;fp=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fasynctasks%2FSaveWebpageImage.java;h=0000000000000000000000000000000000000000;hp=5a92123a043cd7b3f1a574c2774b5dc6ee69431b;hb=5186b668274b09e37b371c0a134e53255c98ad98;hpb=514e93baaa8389dc9c5abdb79e68c890c260b8d3 diff --git a/app/src/main/java/com/stoutner/privacybrowser/asynctasks/SaveWebpageImage.java b/app/src/main/java/com/stoutner/privacybrowser/asynctasks/SaveWebpageImage.java deleted file mode 100644 index 5a92123a..00000000 --- a/app/src/main/java/com/stoutner/privacybrowser/asynctasks/SaveWebpageImage.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright0 2019-2022 Soren Stoutner . - * - * This file is part of Privacy Browser Android . - * - * Privacy Browser Android is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Privacy Browser Android is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Privacy Browser Android. If not, see . - */ - -package com.stoutner.privacybrowser.asynctasks; - -import android.app.Activity; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Build; -import android.provider.OpenableColumns; - -import com.google.android.material.snackbar.Snackbar; - -import com.stoutner.privacybrowser.R; -import com.stoutner.privacybrowser.views.NestedScrollWebView; - -import java.io.ByteArrayOutputStream; -import java.io.OutputStream; -import java.lang.ref.WeakReference; - -public class SaveWebpageImage extends AsyncTask { - // Declare the weak references. - private final WeakReference activityWeakReference; - private final WeakReference nestedScrollWebViewWeakReference; - - // Declare the class constants. - private final String SUCCESS = "Success"; - - // Declare the class variables. - private Snackbar savingImageSnackbar; - private Bitmap webpageBitmap; - private final Uri fileUri; - private final String fileNameString; - - // The public constructor. - public SaveWebpageImage(Activity activity, Uri fileUri, NestedScrollWebView nestedScrollWebView) { - // Populate the weak references. - activityWeakReference = new WeakReference<>(activity); - nestedScrollWebViewWeakReference = new WeakReference<>(nestedScrollWebView); - - // Populate the class variables. - this.fileUri = fileUri; - - // Query the exact file name if the API >= 26. - if (Build.VERSION.SDK_INT >= 26) { - // Get a cursor from the content resolver. - Cursor contentResolverCursor = activity.getContentResolver().query(fileUri, null, null, null); - - // Move to the first row. - contentResolverCursor.moveToFirst(); - - // Get the file name from the cursor. - fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME)); - - // Close the cursor. - contentResolverCursor.close(); - } else { - // Use the file URI last path segment as the file name string. - fileNameString = fileUri.getLastPathSegment(); - } - } - - // `onPreExecute()` operates on the UI thread. - @Override - protected void onPreExecute() { - // Get handles for the activity and the nested scroll WebView. - Activity activity = activityWeakReference.get(); - NestedScrollWebView nestedScrollWebView = nestedScrollWebViewWeakReference.get(); - - // Abort if the activity or the nested scroll WebView is gone. - if ((activity == null) || activity.isFinishing() || nestedScrollWebView == null) { - return; - } - - // Create a saving image snackbar. - savingImageSnackbar = Snackbar.make(nestedScrollWebView, activity.getString(R.string.processing_image) + " " + fileNameString, Snackbar.LENGTH_INDEFINITE); - - // Display the saving image snackbar. - savingImageSnackbar.show(); - - // Create a webpage bitmap. Once the Minimum API >= 26 Bitmap.Config.RBGA_F16 can be used instead of ARGB_8888. The nested scroll WebView commands must be run on the UI thread. - webpageBitmap = Bitmap.createBitmap(nestedScrollWebView.getHorizontalScrollRange(), nestedScrollWebView.getVerticalScrollRange(), Bitmap.Config.ARGB_8888); - - // Create a canvas. - Canvas webpageCanvas = new Canvas(webpageBitmap); - - // Draw the current webpage onto the bitmap. The nested scroll WebView commands must be run on the UI thread. - nestedScrollWebView.draw(webpageCanvas); - } - - @Override - protected String doInBackground(Void... Void) { - // Get a handle for the activity. - Activity activity = activityWeakReference.get(); - - // Abort if the activity is gone. - if ((activity == null) || activity.isFinishing()) { - return ""; - } - - // Create a webpage PNG byte array output stream. - ByteArrayOutputStream webpageByteArrayOutputStream = new ByteArrayOutputStream(); - - // Convert the bitmap to a PNG. `0` is for lossless compression (the only option for a PNG). This compression takes a long time. Once the minimum API >= 30 this could be replaced with WEBP_LOSSLESS. - webpageBitmap.compress(Bitmap.CompressFormat.PNG, 0, webpageByteArrayOutputStream); - - // Create a file creation disposition string. - String fileCreationDisposition = SUCCESS; - - try { - // Create an image file output stream. - OutputStream imageFileOutputStream = activity.getContentResolver().openOutputStream(fileUri); - - // Write the webpage image to the image file. - webpageByteArrayOutputStream.writeTo(imageFileOutputStream); - } catch (Exception exception) { - // Store the error in the file creation disposition string. - fileCreationDisposition = exception.toString(); - } - - // Return the file creation disposition string. - return fileCreationDisposition; - } - - // `onPostExecute()` operates on the UI thread. - @Override - protected void onPostExecute(String fileCreationDisposition) { - // Get handles for the weak references. - Activity activity = activityWeakReference.get(); - NestedScrollWebView nestedScrollWebView = nestedScrollWebViewWeakReference.get(); - - // Abort if the activity is gone. - if ((activity == null) || activity.isFinishing()) { - return; - } - - // Dismiss the saving image snackbar. - savingImageSnackbar.dismiss(); - - // Display a file creation disposition snackbar. - if (fileCreationDisposition.equals(SUCCESS)) { - // Display the image saved snackbar. - Snackbar.make(nestedScrollWebView, activity.getString(R.string.saved, fileNameString), Snackbar.LENGTH_SHORT).show(); - } else { - // Display the file saving error. - Snackbar.make(nestedScrollWebView, activity.getString(R.string.error_saving_file, fileNameString, fileCreationDisposition), Snackbar.LENGTH_INDEFINITE).show(); - } - } -}