diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java index eb42606ba..fff4e4ca7 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java @@ -528,7 +528,9 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment final Bundle bundle = new Bundle(); try { bundle.putString("query", - FileUtils.readFromResource("/queries/radius_query_for_upload_wizard.rq")); + FileUtils.INSTANCE.readFromResource( + "/queries/radius_query_for_upload_wizard.rq") + ); } catch (IOException e) { Timber.e(e); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java deleted file mode 100644 index 8a8fa35b3..000000000 --- a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java +++ /dev/null @@ -1,183 +0,0 @@ -package fr.free.nrw.commons.upload; - -import android.content.ContentResolver; -import android.content.Context; -import android.net.Uri; -import android.webkit.MimeTypeMap; - -import androidx.exifinterface.media.ExifInterface; - -import fr.free.nrw.commons.location.LatLng; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.math.BigInteger; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import java.util.Locale; -import timber.log.Timber; - -public class FileUtils { - - /** - * Get SHA1 of filePath from input stream - */ - static String getSHA1(InputStream is) { - - MessageDigest digest; - try { - digest = MessageDigest.getInstance("SHA1"); - } catch (NoSuchAlgorithmException e) { - Timber.e(e, "Exception while getting Digest"); - return ""; - } - - byte[] buffer = new byte[8192]; - int read; - try { - while ((read = is.read(buffer)) > 0) { - digest.update(buffer, 0, read); - } - byte[] md5sum = digest.digest(); - BigInteger bigInt = new BigInteger(1, md5sum); - String output = bigInt.toString(16); - // Fill to 40 chars - output = String.format("%40s", output).replace(' ', '0'); - Timber.i("File SHA1: %s", output); - - return output; - } catch (IOException e) { - Timber.e(e, "IO Exception"); - return ""; - } finally { - try { - is.close(); - } catch (IOException e) { - Timber.e(e, "Exception on closing MD5 input stream"); - } - } - } - - /** - * Get Geolocation of filePath from input filePath path - */ - static String getGeolocationOfFile(String filePath, LatLng inAppPictureLocation) { - - try { - ExifInterface exifInterface = new ExifInterface(filePath); - ImageCoordinates imageObj = new ImageCoordinates(exifInterface, inAppPictureLocation); - if (imageObj.getDecimalCoords() != null) { // If image has geolocation information in its EXIF - return imageObj.getDecimalCoords(); - } else { - return ""; - } - } catch (IOException e) { - e.printStackTrace(); - return ""; - } - } - - - /** - * Read and return the content of a resource filePath as string. - * - * @param fileName asset filePath's path (e.g. "/queries/radius_query_for_upload_wizard.rq") - * @return the content of the filePath - */ - public static String readFromResource(String fileName) throws IOException { - StringBuilder buffer = new StringBuilder(); - BufferedReader reader = null; - try { - InputStream inputStream = FileUtils.class.getResourceAsStream(fileName); - if (inputStream == null) { - throw new FileNotFoundException(fileName); - } - reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); - String line; - while ((line = reader.readLine()) != null) { - buffer.append(line).append("\n"); - } - } finally { - if (reader != null) { - reader.close(); - } - } - return buffer.toString(); - } - - /** - * Deletes files. - * - * @param file context - */ - public static boolean deleteFile(File file) { - boolean deletedAll = true; - if (file != null) { - if (file.isDirectory()) { - String[] children = file.list(); - for (String child : children) { - deletedAll = deleteFile(new File(file, child)) && deletedAll; - } - } else { - deletedAll = file.delete(); - } - } - - return deletedAll; - } - - public static String getMimeType(Context context, Uri uri) { - String mimeType; - if (uri.getScheme()!=null && uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { - ContentResolver cr = context.getContentResolver(); - mimeType = cr.getType(uri); - } else { - String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri - .toString()); - mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension( - fileExtension.toLowerCase(Locale.getDefault())); - } - return mimeType; - } - - static String getFileExt(String fileName) { - //Default filePath extension - String extension = ".jpg"; - - int i = fileName.lastIndexOf('.'); - if (i > 0) { - extension = fileName.substring(i + 1); - } - return extension; - } - - static FileInputStream getFileInputStream(String filePath) throws FileNotFoundException { - return new FileInputStream(filePath); - } - - public static boolean recursivelyCreateDirs(String dirPath) { - File fileDir = new File(dirPath); - if (!fileDir.exists()) { - return fileDir.mkdirs(); - } - return true; - } - - /** - * Check if file exists in local dirs - */ - public static boolean fileExists(Uri localUri) { - try { - File file = new File(localUri.getPath()); - return file.exists(); - } catch (Exception e) { - Timber.d(e); - return false; - } - } -} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.kt b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.kt new file mode 100644 index 000000000..1febd8e88 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.kt @@ -0,0 +1,159 @@ +package fr.free.nrw.commons.upload + +import android.content.ContentResolver +import android.content.Context +import android.net.Uri +import android.webkit.MimeTypeMap +import androidx.exifinterface.media.ExifInterface +import fr.free.nrw.commons.location.LatLng +import timber.log.Timber +import java.io.BufferedReader +import java.io.File +import java.io.FileInputStream +import java.io.FileNotFoundException +import java.io.IOException +import java.io.InputStream +import java.io.InputStreamReader +import java.math.BigInteger +import java.security.MessageDigest +import java.security.NoSuchAlgorithmException +import java.util.Locale + +object FileUtils { + + /** + * Get SHA1 of filePath from input stream + */ + fun getSHA1(stream: InputStream): String { + val digest: MessageDigest + try { + digest = MessageDigest.getInstance("SHA1") + } catch (e: NoSuchAlgorithmException) { + Timber.e(e, "Exception while getting Digest") + return "" + } + + val buffer = ByteArray(8192) + var read: Int + try { + while ((stream.read(buffer).also { read = it }) > 0) { + digest.update(buffer, 0, read) + } + val md5sum = digest.digest() + val bigInt = BigInteger(1, md5sum) + var output = bigInt.toString(16) + // Fill to 40 chars + output = String.format("%40s", output).replace(' ', '0') + Timber.i("File SHA1: %s", output) + + return output + } catch (e: IOException) { + Timber.e(e, "IO Exception") + return "" + } finally { + try { + stream.close() + } catch (e: IOException) { + Timber.e(e, "Exception on closing MD5 input stream") + } + } + } + + /** + * Get Geolocation of filePath from input filePath path + */ + fun getGeolocationOfFile(filePath: String, inAppPictureLocation: LatLng?): String? = try { + val exifInterface = ExifInterface(filePath) + val imageObj = ImageCoordinates(exifInterface, inAppPictureLocation) + if (imageObj.decimalCoords != null) { // If image has geolocation information in its EXIF + imageObj.decimalCoords + } else { + "" + } + } catch (e: IOException) { + Timber.e(e) + "" + } + + + /** + * Read and return the content of a resource filePath as string. + * + * @param fileName asset filePath's path (e.g. "/queries/radius_query_for_upload_wizard.rq") + * @return the content of the filePath + */ + @Throws(IOException::class) + fun readFromResource(fileName: String) = buildString { + try { + val inputStream = FileUtils::class.java.getResourceAsStream(fileName) ?: + throw FileNotFoundException(fileName) + + BufferedReader(InputStreamReader(inputStream, "UTF-8")).use { reader -> + var line: String? + while ((reader.readLine().also { line = it }) != null) { + append(line).append("\n") + } + } + } catch (e: Throwable) { + Timber.e(e) + } + } + + /** + * Deletes files. + * + * @param file context + */ + fun deleteFile(file: File?): Boolean { + var deletedAll = true + if (file != null) { + if (file.isDirectory) { + val children = file.list() + for (child in children!!) { + deletedAll = deleteFile(File(file, child)) && deletedAll + } + } else { + deletedAll = file.delete() + } + } + + return deletedAll + } + + fun getMimeType(context: Context, uri: Uri): String? { + val mimeType: String? + if (uri.scheme != null && uri.scheme == ContentResolver.SCHEME_CONTENT) { + val cr = context.contentResolver + mimeType = cr.getType(uri) + } else { + val fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri.toString()) + mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension( + fileExtension.lowercase(Locale.getDefault()) + ) + } + return mimeType + } + + fun getFileExt(fileName: String): String { + //Default filePath extension + var extension = ".jpg" + + val i = fileName.lastIndexOf('.') + if (i > 0) { + extension = fileName.substring(i + 1) + } + return extension + } + + @Throws(FileNotFoundException::class) + fun getFileInputStream(filePath: String?): FileInputStream = + FileInputStream(filePath) + + fun recursivelyCreateDirs(dirPath: String): Boolean { + val fileDir = File(dirPath) + if (!fileDir.exists()) { + return fileDir.mkdirs() + } + return true + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileUtilsWrapper.java b/app/src/main/java/fr/free/nrw/commons/upload/FileUtilsWrapper.java index a35eeebe9..a2ca62917 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/FileUtilsWrapper.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/FileUtilsWrapper.java @@ -29,19 +29,19 @@ public class FileUtilsWrapper { } public String getFileExt(String fileName) { - return FileUtils.getFileExt(fileName); + return FileUtils.INSTANCE.getFileExt(fileName); } public String getSHA1(InputStream is) { - return FileUtils.getSHA1(is); + return FileUtils.INSTANCE.getSHA1(is); } public FileInputStream getFileInputStream(String filePath) throws FileNotFoundException { - return FileUtils.getFileInputStream(filePath); + return FileUtils.INSTANCE.getFileInputStream(filePath); } public String getGeolocationOfFile(String filePath, LatLng inAppPictureLocation) { - return FileUtils.getGeolocationOfFile(filePath, inAppPictureLocation); + return FileUtils.INSTANCE.getGeolocationOfFile(filePath, inAppPictureLocation); } public String getMimeType(File file) { @@ -49,7 +49,7 @@ public class FileUtilsWrapper { } public String getMimeType(Uri uri) { - return FileUtils.getMimeType(context, uri); + return FileUtils.INSTANCE.getMimeType(context, uri); } /** diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java index 2611645de..dfb7ae794 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java @@ -187,7 +187,7 @@ public class UploadModel { public Observable buildContributions() { return Observable.fromIterable(items).map(item -> { - String imageSHA1 = FileUtils.getSHA1(context.getContentResolver().openInputStream(item.getContentUri())); + String imageSHA1 = FileUtils.INSTANCE.getSHA1(context.getContentResolver().openInputStream(item.getContentUri())); final Contribution contribution = new Contribution( item, sessionManager, newListOf(selectedDepictions), newListOf(selectedCategories), imageSHA1);