/*
- * Copyright © 2020 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2020-2022 Soren Stoutner <soren@stoutner.com>.
*
- * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
+ * This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
- * Privacy Browser is free software: you can redistribute it and/or modify
+ * 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 is distributed in the hope that it will be useful,
+ * 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. If not, see <http://www.gnu.org/licenses/>.
+ * along with Privacy Browser Android. If not, see <http://www.gnu.org/licenses/>.
*/
package com.stoutner.privacybrowser.asynctasks;
-import android.app.AlertDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.webkit.CookieManager;
import android.widget.TextView;
+import androidx.appcompat.app.AlertDialog;
+
import com.stoutner.privacybrowser.R;
import com.stoutner.privacybrowser.helpers.ProxyHelper;
-import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.Proxy;
import java.text.NumberFormat;
public class GetUrlSize extends AsyncTask<String, Void, String> {
- // Define a weak reference for the calling context and fragment.
- private WeakReference<Context> contextWeakReference;
- private WeakReference<AlertDialog> alertDialogWeakReference;
+ // Define weak references for the calling context and alert dialog.
+ private final WeakReference<Context> contextWeakReference;
+ private final WeakReference<AlertDialog> alertDialogWeakReference;
// Define the class variables.
- private String userAgent;
- private boolean cookiesEnabled;
+ private final String userAgent;
+ private final boolean cookiesEnabled;
// The public constructor.
public GetUrlSize(Context context, AlertDialog alertDialog, String userAgent, boolean cookiesEnabled) {
- // Populate the week references to the calling activity and fragment.
+ // Populate the week references for the context and alert dialog.
contextWeakReference = new WeakReference<>(context);
alertDialogWeakReference = new WeakReference<>(alertDialog);
// Initialize the formatted file size string.
String formattedFileSize = context.getString(R.string.unknown_size);
- // Because everything relating to requesting data from a webserver can throw errors, the entire section much catch `IOExceptions`.
+ // Because everything relating to requesting data from a webserver can throw errors, the entire section must catch exceptions.
try {
// Get the URL from the calling fragment.
URL url = new URL(urlToSave[0]);
Proxy proxy = proxyHelper.getCurrentProxy(context);
// Open a connection to the URL. No data is actually sent at this point.
- HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(proxy);
+ HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection(proxy);
// Add the user agent to the header property.
- httpURLConnection.setRequestProperty("User-Agent", userAgent);
+ httpUrlConnection.setRequestProperty("User-Agent", userAgent);
// Add the cookies if they are enabled.
if (cookiesEnabled) {
- // Ge the cookies for the current domain.
+ // Get the cookies for the current domain.
String cookiesString = CookieManager.getInstance().getCookie(url.toString());
// Only add the cookies if they are not null.
if (cookiesString != null) {
// Add the cookies to the header property.
- httpURLConnection.setRequestProperty("Cookie", cookiesString);
+ httpUrlConnection.setRequestProperty("Cookie", cookiesString);
}
}
// Exit if the task has been cancelled.
if (isCancelled()) {
// Disconnect the HTTP URL connection.
- httpURLConnection.disconnect();
+ httpUrlConnection.disconnect();
// Return the formatted file size string.
return formattedFileSize;
}
- // Get the status code.
- int responseCode = httpURLConnection.getResponseCode();
+ // Get the status code. This initiates a network connection.
+ int responseCode = httpUrlConnection.getResponseCode();
// Exit if the task has been cancelled.
if (isCancelled()) {
// Disconnect the HTTP URL connection.
- httpURLConnection.disconnect();
+ httpUrlConnection.disconnect();
// Return the formatted file size string.
return formattedFileSize;
// Check the response code.
if (responseCode >= 400) { // The response code is an error message.
// Set the formatted file size to indicate a bad URL.
- formattedFileSize = context.getString(R.string.bad_url);
+ formattedFileSize = context.getString(R.string.invalid_url);
} else { // The response code is not an error message.
// Get the content length header.
- String contentLengthString = httpURLConnection.getHeaderField("Content-Length");
-
- // Define the file size long.
- long fileSize;
+ String contentLengthString = httpUrlConnection.getHeaderField("Content-Length");
- // Make sure the content length isn't null.
- if (contentLengthString != null) { // The content length isn't null.
- // Convert the content length to a long.
- fileSize = Long.parseLong(contentLengthString);
+ // Only process the content length string if it isn't null.
+ if (contentLengthString != null) {
+ // Convert the content length string to a long.
+ long fileSize = Long.parseLong(contentLengthString);
// Format the file size.
formattedFileSize = NumberFormat.getInstance().format(fileSize) + " " + context.getString(R.string.bytes);
}
} finally {
// Disconnect the HTTP URL connection.
- httpURLConnection.disconnect();
+ httpUrlConnection.disconnect();
}
- } catch (IOException exception) {
+ } catch (Exception exception) {
// Set the formatted file size to indicate a bad URL.
- formattedFileSize = context.getString(R.string.bad_url);
+ formattedFileSize = context.getString(R.string.invalid_url);
}
// Return the formatted file size string.
// `onPostExecute()` operates on the UI thread.
@Override
protected void onPostExecute(String fileSize) {
- // Get a handle for the context and alert dialog.
+ // Get a handle for the alert dialog.
AlertDialog alertDialog = alertDialogWeakReference.get();
// Abort if the alert dialog is gone.
// Get a handle for the file size text view.
TextView fileSizeTextView = alertDialog.findViewById(R.id.file_size_textview);
+ // Remove the incorrect warning below that the file size text view might be null.
+ assert fileSizeTextView != null;
+
// Update the file size.
fileSizeTextView.setText(fileSize);
}