From c0a06f7188ceb6a550ce54a8ce4164e4f906f369 Mon Sep 17 00:00:00 2001 From: Abrar Wiryawan Date: Tue, 8 Nov 2022 02:10:06 +0700 Subject: [PATCH] migrate `IOUtils` to Kotlin (#2763) * migrate `IOUtils` to Kotlin * Fix ktlint * change functions inside IOUtils to extension function --- .../keylesspalace/tusky/LicenseActivity.kt | 4 +- .../components/compose/ImageDownsizer.kt | 6 +- .../tusky/components/drafts/DraftHelper.kt | 4 +- .../com/keylesspalace/tusky/util/IOUtils.java | 71 ------------------- .../com/keylesspalace/tusky/util/IOUtils.kt | 67 +++++++++++++++++ .../keylesspalace/tusky/util/MediaUtils.kt | 6 +- 6 files changed, 77 insertions(+), 81 deletions(-) delete mode 100644 app/src/main/java/com/keylesspalace/tusky/util/IOUtils.java create mode 100644 app/src/main/java/com/keylesspalace/tusky/util/IOUtils.kt diff --git a/app/src/main/java/com/keylesspalace/tusky/LicenseActivity.kt b/app/src/main/java/com/keylesspalace/tusky/LicenseActivity.kt index ed3aed3a..3099bd00 100644 --- a/app/src/main/java/com/keylesspalace/tusky/LicenseActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/LicenseActivity.kt @@ -20,7 +20,7 @@ import android.util.Log import android.widget.TextView import androidx.annotation.RawRes import com.keylesspalace.tusky.databinding.ActivityLicenseBinding -import com.keylesspalace.tusky.util.IOUtils +import com.keylesspalace.tusky.util.closeQuietly import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader @@ -60,7 +60,7 @@ class LicenseActivity : BaseActivity() { Log.w("LicenseActivity", e) } - IOUtils.closeQuietly(br) + br.closeQuietly() textView.text = sb.toString() } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ImageDownsizer.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ImageDownsizer.kt index a0215847..4976ae0c 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ImageDownsizer.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ImageDownsizer.kt @@ -20,8 +20,8 @@ import android.graphics.Bitmap import android.graphics.Bitmap.CompressFormat import android.graphics.BitmapFactory import android.net.Uri -import com.keylesspalace.tusky.util.IOUtils import com.keylesspalace.tusky.util.calculateInSampleSize +import com.keylesspalace.tusky.util.closeQuietly import com.keylesspalace.tusky.util.getImageOrientation import com.keylesspalace.tusky.util.reorientBitmap import java.io.File @@ -51,7 +51,7 @@ fun downsizeImage( val options = BitmapFactory.Options() options.inJustDecodeBounds = true BitmapFactory.decodeStream(decodeBoundsInputStream, null, options) - IOUtils.closeQuietly(decodeBoundsInputStream) + decodeBoundsInputStream.closeQuietly() // Get EXIF data, for orientation info. val orientation = getImageOrientation(uri, contentResolver) /* Unfortunately, there isn't a determined worst case compression ratio for image @@ -78,7 +78,7 @@ fun downsizeImage( } catch (error: OutOfMemoryError) { return false } finally { - IOUtils.closeQuietly(decodeBitmapInputStream) + decodeBitmapInputStream.closeQuietly() } ?: return false val reorientedBitmap = reorientBitmap(scaledBitmap, orientation) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftHelper.kt b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftHelper.kt index c6eea4af..61023ddb 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftHelper.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftHelper.kt @@ -28,7 +28,7 @@ import com.keylesspalace.tusky.db.DraftEntity import com.keylesspalace.tusky.entity.Attachment import com.keylesspalace.tusky.entity.NewPoll import com.keylesspalace.tusky.entity.Status -import com.keylesspalace.tusky.util.IOUtils +import com.keylesspalace.tusky.util.copyToFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import okhttp3.OkHttpClient @@ -194,7 +194,7 @@ class DraftHelper @Inject constructor( return null } } else { - IOUtils.copyToFile(contentResolver, this, file) + this.copyToFile(contentResolver, file) } return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", file) } diff --git a/app/src/main/java/com/keylesspalace/tusky/util/IOUtils.java b/app/src/main/java/com/keylesspalace/tusky/util/IOUtils.java deleted file mode 100644 index 7c3b68a7..00000000 --- a/app/src/main/java/com/keylesspalace/tusky/util/IOUtils.java +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright 2017 Andrew Dawson - * - * This file is a part of Tusky. - * - * This program 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. - * - * Tusky 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 Tusky; if not, - * see . */ - -package com.keylesspalace.tusky.util; - -import android.content.ContentResolver; -import android.net.Uri; -import androidx.annotation.Nullable; - -import java.io.Closeable; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; - -public class IOUtils { - - private static final int DEFAULT_BLOCKSIZE = 16384; - - public static void closeQuietly(@Nullable Closeable stream) { - try { - if (stream != null) { - stream.close(); - } - } catch (IOException e) { - // intentionally unhandled - } - } - - public static boolean copyToFile(ContentResolver contentResolver, Uri uri, File file) { - InputStream from; - FileOutputStream to; - try { - from = contentResolver.openInputStream(uri); - to = new FileOutputStream(file); - } catch (FileNotFoundException e) { - return false; - } - if (from == null) { - return false; - } - byte[] chunk = new byte[DEFAULT_BLOCKSIZE]; - try { - while (true) { - int bytes = from.read(chunk, 0, chunk.length); - if (bytes < 0) { - break; - } - to.write(chunk, 0, bytes); - } - } catch (IOException e) { - return false; - } - closeQuietly(from); - closeQuietly(to); - return true; - } -} diff --git a/app/src/main/java/com/keylesspalace/tusky/util/IOUtils.kt b/app/src/main/java/com/keylesspalace/tusky/util/IOUtils.kt new file mode 100644 index 00000000..005554bf --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/util/IOUtils.kt @@ -0,0 +1,67 @@ +/* Copyright 2017 Andrew Dawson + * + * This file is a part of Tusky. + * + * This program 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. + * + * Tusky 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 Tusky; if not, + * see . */ + +package com.keylesspalace.tusky.util + +import android.content.ContentResolver +import android.net.Uri +import java.io.Closeable +import java.io.File +import java.io.FileNotFoundException +import java.io.FileOutputStream +import java.io.IOException +import java.io.InputStream + +private const val DEFAULT_BLOCKSIZE = 16384 + +fun Closeable?.closeQuietly() { + try { + this?.close() + } catch (e: IOException) { + // intentionally unhandled + } +} + +fun Uri.copyToFile( + contentResolver: ContentResolver, + file: File, +): Boolean { + val from: InputStream? + val to: FileOutputStream + + try { + from = contentResolver.openInputStream(this) + to = FileOutputStream(file) + } catch (e: FileNotFoundException) { + return false + } + + if (from == null) return false + + val chunk = ByteArray(DEFAULT_BLOCKSIZE) + try { + while (true) { + val bytes = from.read(chunk, 0, chunk.size) + if (bytes < 0) break + to.write(chunk, 0, bytes) + } + } catch (e: IOException) { + return false + } + + from.closeQuietly() + to.closeQuietly() + return true +} diff --git a/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt b/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt index 9568d73d..408f6453 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt @@ -75,7 +75,7 @@ fun getImageSquarePixels(contentResolver: ContentResolver, uri: Uri): Long { options.inJustDecodeBounds = true BitmapFactory.decodeStream(input, null, options) - IOUtils.closeQuietly(input) + input.closeQuietly() return (options.outWidth * options.outHeight).toLong() } @@ -158,11 +158,11 @@ fun getImageOrientation(uri: Uri, contentResolver: ContentResolver): Int { exifInterface = ExifInterface(inputStream) } catch (e: IOException) { Log.w(TAG, e) - IOUtils.closeQuietly(inputStream) + inputStream.closeQuietly() return ExifInterface.ORIENTATION_UNDEFINED } val orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL) - IOUtils.closeQuietly(inputStream) + inputStream.closeQuietly() return orientation }