mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-11-01 23:33:54 +01:00
Convert FileUtils to kotlin
This commit is contained in:
parent
aa937ee6a1
commit
6fa1bcccbc
5 changed files with 168 additions and 190 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
159
app/src/main/java/fr/free/nrw/commons/upload/FileUtils.kt
Normal file
159
app/src/main/java/fr/free/nrw/commons/upload/FileUtils.kt
Normal 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
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue