diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.java b/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.java deleted file mode 100644 index b04f969b8..000000000 --- a/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2017 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker 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. - * - * Loop Habit Tracker 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 this program. If not, see . - */ - -package org.isoron.androidbase.utils; - -import android.os.*; -import android.util.*; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.io.*; - -public abstract class FileUtils -{ - public static void copy(File src, File dst) throws IOException - { - FileInputStream inStream = new FileInputStream(src); - FileOutputStream outStream = new FileOutputStream(dst); - copy(inStream, outStream); - } - - public static void copy(InputStream inStream, File dst) throws IOException - { - FileOutputStream outStream = new FileOutputStream(dst); - copy(inStream, outStream); - } - - public static void copy(InputStream in, OutputStream out) throws IOException - { - int numBytes; - byte[] buffer = new byte[1024]; - - while ((numBytes = in.read(buffer)) != -1) - out.write(buffer, 0, numBytes); - } - - @Nullable - public static File getDir(@NonNull File potentialParentDirs[], - @Nullable String relativePath) - { - if (relativePath == null) relativePath = ""; - - File chosenDir = null; - for (File dir : potentialParentDirs) - { - if (dir == null || !dir.canWrite()) continue; - chosenDir = dir; - break; - } - - if (chosenDir == null) - { - Log.e("FileUtils", - "getDir: all potential parents are null or non-writable"); - return null; - } - - File dir = new File( - String.format("%s/%s/", chosenDir.getAbsolutePath(), relativePath)); - if (!dir.exists() && !dir.mkdirs()) - { - Log.e("FileUtils", - "getDir: chosen dir does not exist and cannot be created"); - return null; - } - - return dir; - } - - @Nullable - public static File getSDCardDir(@Nullable String relativePath) - { - File parents[] = - new File[]{ Environment.getExternalStorageDirectory() }; - return getDir(parents, relativePath); - } -} diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.kt b/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.kt new file mode 100644 index 000000000..e4b3e79cf --- /dev/null +++ b/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.kt @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2017 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker 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. + * + * Loop Habit Tracker 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 this program. If not, see . + */ +package org.isoron.androidbase.utils + +import android.os.Environment +import android.util.Log +import java.io.* + +object FileUtils { + @Throws(IOException::class) + @JvmStatic + fun copy(src: File, dst: File) { + val inStream = FileInputStream(src) + val outStream = FileOutputStream(dst) + copy(inStream, outStream) + } + + @Throws(IOException::class) + @JvmStatic + fun copy(inStream: InputStream, dst: File) { + val outStream = FileOutputStream(dst) + copy(inStream, outStream) + } + + @Throws(IOException::class) + @JvmStatic + fun copy(input: InputStream, out: OutputStream) { + var numBytes: Int + val buffer = ByteArray(1024) + while (input.read(buffer).also { numBytes = it } != -1) { + out.write(buffer, 0, numBytes) + } + } + + @JvmStatic + fun getDir(potentialParentDirs: Array, + relativePath: String?): File? { + var relativePath = relativePath + if (relativePath == null) relativePath = "" + var chosenDir: File? = null + for (dir in potentialParentDirs) { + if (dir == null || !dir.canWrite()) continue + chosenDir = dir + break + } + if (chosenDir == null) { + Log.e("FileUtils", + "getDir: all potential parents are null or non-writable") + return null + } + val dir = File(String.format("%s/%s/", chosenDir.absolutePath, relativePath)) + if (!dir.exists() && !dir.mkdirs()) { + Log.e("FileUtils", + "getDir: chosen dir does not exist and cannot be created") + return null + } + return dir + } + + @JvmStatic + fun getSDCardDir(relativePath: String?): File? { + val parents = arrayOf(Environment.getExternalStorageDirectory()) + return getDir(parents, relativePath) + } +} \ No newline at end of file diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index 4cf89c363..db7123710 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -109,7 +109,7 @@ class ListHabitsScreen val inStream = activity.contentResolver.openInputStream(data.data!!) val cacheDir = activity.externalCacheDir val tempFile = File.createTempFile("import", "", cacheDir) - FileUtils.copy(inStream, tempFile) + FileUtils.copy(inStream!!, tempFile) onImportData(tempFile) { tempFile.delete() } } catch (e: IOException) { showMessage(R.string.could_not_import)