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;
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;
}
// 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);
return;
}
- // Prevent the dialog from displaying if the app window is not visible.
- // The asynctask 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.