Release 3.9.
[PrivacyBrowser.git] / app / src / main / java / com / stoutner / privacybrowser / asynctasks / PrepareSaveDialog.java
index a7d44954a6dcb2539957dc23159f1f835b63d031..c767def1fd0b99be3198ea7928406c646185bed3 100644 (file)
@@ -30,7 +30,9 @@ import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.FragmentManager;
 
 import com.stoutner.privacybrowser.R;
-import com.stoutner.privacybrowser.dialogs.SaveWebpageDialog;
+import com.stoutner.privacybrowser.activities.MainWebViewActivity;
+import com.stoutner.privacybrowser.dataclasses.PendingDialog;
+import com.stoutner.privacybrowser.dialogs.SaveDialog;
 import com.stoutner.privacybrowser.helpers.ProxyHelper;
 
 import java.lang.ref.WeakReference;
@@ -46,20 +48,18 @@ public class PrepareSaveDialog extends AsyncTask<String, Void, String[]> {
     private final WeakReference<FragmentManager> fragmentManagerWeakReference;
 
     // Define the class variables.
-    private final int saveType;
     private final String userAgent;
     private final boolean cookiesEnabled;
     private String urlString;
 
     // The public constructor.
-    public PrepareSaveDialog(Activity activity, Context context, FragmentManager fragmentManager, int saveType, String userAgent, boolean cookiesEnabled) {
+    public PrepareSaveDialog(Activity activity, Context context, FragmentManager fragmentManager, String userAgent, boolean cookiesEnabled) {
         // Populate the weak references.
         activityWeakReference = new WeakReference<>(activity);
         contextWeakReference = new WeakReference<>(context);
         fragmentManagerWeakReference = new WeakReference<>(fragmentManager);
 
         // Store the class variables.
-        this.saveType = saveType;
         this.userAgent = userAgent;
         this.cookiesEnabled = cookiesEnabled;
     }
@@ -88,14 +88,14 @@ public class PrepareSaveDialog extends AsyncTask<String, Void, String[]> {
             // Remove `data:` from the beginning of the URL.
             String urlWithoutData = urlString.substring(5);
 
-            // Get the URL MIME type, which end with a `;`.
+            // Get the URL MIME type, which ends with a `;`.
             String urlMimeType = urlWithoutData.substring(0, urlWithoutData.indexOf(";"));
 
             // Get the Base64 data, which begins after a `,`.
             String base64DataString = urlWithoutData.substring(urlWithoutData.indexOf(",") + 1);
 
             // Calculate the file size of the data URL.  Each Base64 character represents 6 bits.
-            formattedFileSize = NumberFormat.getInstance().format(base64DataString.length() * 3 / 4) + " " + context.getString(R.string.bytes);
+            formattedFileSize = NumberFormat.getInstance().format(base64DataString.length() * 3L / 4) + " " + context.getString(R.string.bytes);
 
             // Set the file name according to the MIME type.
             fileNameString = context.getString(R.string.file) + "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(urlMimeType);
@@ -198,22 +198,17 @@ public class PrepareSaveDialog extends AsyncTask<String, Void, String[]> {
             return;
         }
 
-        // Prevent the dialog from displaying if the app window is not visible.
-        // The async task continues to function even when the app is paused.  Attempting to display a dialog in that state leads to a crash.
-        while (!activity.getWindow().isActive()) {
-            try {
-                // The window is not active.  Wait 1 second.
-                wait(1000);
-            } catch (InterruptedException e) {
-                // Do nothing.
-            }
-        }
-
         // Instantiate the save dialog.
-        DialogFragment saveDialogFragment = SaveWebpageDialog.saveWebpage(saveType, urlString, fileStringArray[0], fileStringArray[1], userAgent, cookiesEnabled);
-
-        // Show the save dialog.  It must be named `save_dialog` so that the file picker can update the file name.
-        saveDialogFragment.show(fragmentManager, activity.getString(R.string.save_dialog));
+        DialogFragment saveDialogFragment = SaveDialog.saveUrl(urlString, fileStringArray[0], fileStringArray[1], userAgent, cookiesEnabled);
+
+        // Try to show the dialog.  Sometimes the window is not active.
+        try {
+            // Show the save dialog.  It must be named `save_dialog` so that the file picker can update the file name.
+            saveDialogFragment.show(fragmentManager, activity.getString(R.string.save_dialog));
+        } catch (Exception exception) {
+            // Add the dialog to the pending dialog array list.  It will be displayed in `onStart()`.
+            MainWebViewActivity.pendingDialogsArrayList.add(new PendingDialog(saveDialogFragment, activity.getString(R.string.save_dialog)));
+        }
     }
 
     // Content dispositions can contain other text besides the file name, and they can be in any order.