Convert FileUtils to kotlin

This commit is contained in:
Paul Hawke 2024-12-09 21:37:20 -06:00
parent aa937ee6a1
commit 6fa1bcccbc
5 changed files with 168 additions and 190 deletions

View file

@ -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);
}

View file

@ -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;
}
}
}

View file

@ -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
}
}

View file

@ -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);
}
/**

View file

@ -187,7 +187,7 @@ public class UploadModel {
public Observable<Contribution> 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);