X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2FDownloadFile.java;h=d8fabdea03de86675a17c1c199901622899850b8;hp=4bdc879abb113e08064898a44e442799129925ad;hb=0abf9642763f1af98af73b2fc3cc44752a342db3;hpb=a45494e763affaa93f42927ee58f45803e1ee9db diff --git a/app/src/main/java/com/stoutner/privacybrowser/DownloadFile.java b/app/src/main/java/com/stoutner/privacybrowser/DownloadFile.java index 4bdc879a..d8fabdea 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/DownloadFile.java +++ b/app/src/main/java/com/stoutner/privacybrowser/DownloadFile.java @@ -19,12 +19,15 @@ package com.stoutner.privacybrowser; -import android.app.Activity; +import android.annotation.SuppressLint; import android.app.Dialog; import android.app.DialogFragment; +import android.content.Context; import android.content.DialogInterface; +import android.net.Uri; import android.os.Bundle; // `android.support.v7.app.AlertDialog` uses more of the horizontal screen real estate versus `android.app.AlertDialog's` smaller width. +import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -45,22 +48,18 @@ public class DownloadFile extends DialogFragment { // Create `argumentsBundle`. Bundle argumentsBundle = new Bundle(); - // If `contentDisposition` is empty, use Android's standard string of `downloadfile.bin`. String fileNameString; - if (contentDisposition.isEmpty()) { - fileNameString = "downloadfile.bin"; - } else { - // Extract `fileNameString` from `contentDisposition` using the substring beginning after `filename="` and ending one character before the end of `contentDisposition`. + if (!contentDisposition.isEmpty()) { // Extract `fileNameString` from `contentDisposition` using the substring beginning after `filename="` and ending one character before the end of `contentDisposition`. fileNameString = contentDisposition.substring(contentDisposition.indexOf("filename=\"") + 10, contentDisposition.length() - 1); + } else { // `contentDisposition` is empty, so use the last path segment of the URL as the file name. + Uri downloadUri = Uri.parse(urlString); + fileNameString = downloadUri.getLastPathSegment(); } - // Convert `contentLength` to MB and store it in `fileSizeString`. `%.3g` displays the three most significant digits. - String fileSizeString = String.format(Locale.getDefault(), "%.3g", (float) contentLength / 1048576) + " MB"; - // Store the variables in the `Bundle`. argumentsBundle.putString("URL", urlString); argumentsBundle.putString("File_Name", fileNameString); - argumentsBundle.putString("File_Size", fileSizeString); + argumentsBundle.putLong("File_Size", contentLength); // Add `argumentsBundle` to this instance of `DownloadFile`. DownloadFile thisDownloadFileDialog = new DownloadFile(); @@ -75,7 +74,16 @@ public class DownloadFile extends DialogFragment { // Store the strings in the local class variables. downloadUrl = getArguments().getString("URL"); downloadFileName = getArguments().getString("File_Name"); - fileSize = getArguments().getString("File_Size"); + + // Get the `File_Size`. + long fileSizeLong = getArguments().getLong("File_Size"); + + // Convert `fileSizeLong` to a String. + if (fileSizeLong == -1) { // We don't know the file size. + fileSize = getString(R.string.unknown_size); + } else { // Convert `fileSize` to MB and store it in `fileSizeString`. `%.3g` displays the three most significant digits. + fileSize = String.format(Locale.getDefault(), "%.3g", (float) fileSizeLong / 1048576) + " MB"; + } } // The public interface is used to send information back to the parent activity. @@ -87,15 +95,18 @@ public class DownloadFile extends DialogFragment { private DownloadFileListener downloadFileListener; // Check to make sure tha the parent activity implements the listener. - public void onAttach(Activity parentActivity) { - super.onAttach(parentActivity); + @Override + public void onAttach(Context context) { + super.onAttach(context); try { - downloadFileListener = (DownloadFileListener) parentActivity; + downloadFileListener = (DownloadFileListener) context; } catch (ClassCastException exception) { - throw new ClassCastException(parentActivity.toString() + " must implement DownloadFileListener."); + throw new ClassCastException(context.toString() + " must implement DownloadFileListener."); } } + // `@SuppressLing("InflateParams")` removes the warning about using `null` as the parent view group when inflating the `AlertDialog`. + @SuppressLint("InflateParams") @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Get the activity's layout inflater. @@ -103,7 +114,7 @@ public class DownloadFile extends DialogFragment { // Use `AlertDialog.Builder` to create the `AlertDialog`. `R.style.lightAlertDialog` formats the color of the button text. AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity(), R.style.LightAlertDialog); - dialogBuilder.setTitle(R.string.file_download); + dialogBuilder.setTitle(R.string.save_as); // The parent view is `null` because it will be assigned by `AlertDialog`. dialogBuilder.setView(layoutInflater.inflate(R.layout.download_file_dialog, null)); @@ -128,6 +139,9 @@ public class DownloadFile extends DialogFragment { // Create an `AlertDialog` from the `AlertDialog.Builder`. final AlertDialog alertDialog = dialogBuilder.create(); + // Remove the warning below that `setSoftInputMode` might produce `java.lang.NullPointerException`. + assert alertDialog.getWindow() != null; + // Show the keyboard when `alertDialog` is displayed on the screen. alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); @@ -136,12 +150,12 @@ public class DownloadFile extends DialogFragment { // Set the text for `downloadFileSizeTextView`. TextView downloadFileSizeTextView = (TextView) alertDialog.findViewById(R.id.download_file_size); - assert downloadFileSizeTextView != null; // Remove the warning of the following line that `downloadFileSizeTextView` might be null. + assert downloadFileSizeTextView != null; // Remove the warning on the following line that `downloadFileSizeTextView` might be `null`. downloadFileSizeTextView.setText(fileSize); // Set the text for `downloadFileNameTextView`. EditText downloadFileNameTextView = (EditText) alertDialog.findViewById(R.id.download_file_name); - assert downloadFileNameTextView != null; // Remove the warning on the following line that `downloadFileNameTextView` might be null. + assert downloadFileNameTextView != null; // Remove the warning on the following line that `downloadFileNameTextView` might be `null`. downloadFileNameTextView.setText(downloadFileName); // Allow the `enter` key on the keyboard to save the file from `downloadFileNameTextView`.