migrate IOUtils to Kotlin (#2763)

* migrate `IOUtils` to Kotlin

* Fix ktlint

* change functions inside IOUtils to extension function
This commit is contained in:
Abrar Wiryawan 2022-11-08 02:10:06 +07:00 committed by GitHub
commit c0a06f7188
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 77 additions and 81 deletions

View file

@ -20,7 +20,7 @@ import android.util.Log
import android.widget.TextView import android.widget.TextView
import androidx.annotation.RawRes import androidx.annotation.RawRes
import com.keylesspalace.tusky.databinding.ActivityLicenseBinding 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.BufferedReader
import java.io.IOException import java.io.IOException
import java.io.InputStreamReader import java.io.InputStreamReader
@ -60,7 +60,7 @@ class LicenseActivity : BaseActivity() {
Log.w("LicenseActivity", e) Log.w("LicenseActivity", e)
} }
IOUtils.closeQuietly(br) br.closeQuietly()
textView.text = sb.toString() textView.text = sb.toString()
} }

View file

@ -20,8 +20,8 @@ import android.graphics.Bitmap
import android.graphics.Bitmap.CompressFormat import android.graphics.Bitmap.CompressFormat
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.net.Uri import android.net.Uri
import com.keylesspalace.tusky.util.IOUtils
import com.keylesspalace.tusky.util.calculateInSampleSize import com.keylesspalace.tusky.util.calculateInSampleSize
import com.keylesspalace.tusky.util.closeQuietly
import com.keylesspalace.tusky.util.getImageOrientation import com.keylesspalace.tusky.util.getImageOrientation
import com.keylesspalace.tusky.util.reorientBitmap import com.keylesspalace.tusky.util.reorientBitmap
import java.io.File import java.io.File
@ -51,7 +51,7 @@ fun downsizeImage(
val options = BitmapFactory.Options() val options = BitmapFactory.Options()
options.inJustDecodeBounds = true options.inJustDecodeBounds = true
BitmapFactory.decodeStream(decodeBoundsInputStream, null, options) BitmapFactory.decodeStream(decodeBoundsInputStream, null, options)
IOUtils.closeQuietly(decodeBoundsInputStream) decodeBoundsInputStream.closeQuietly()
// Get EXIF data, for orientation info. // Get EXIF data, for orientation info.
val orientation = getImageOrientation(uri, contentResolver) val orientation = getImageOrientation(uri, contentResolver)
/* Unfortunately, there isn't a determined worst case compression ratio for image /* Unfortunately, there isn't a determined worst case compression ratio for image
@ -78,7 +78,7 @@ fun downsizeImage(
} catch (error: OutOfMemoryError) { } catch (error: OutOfMemoryError) {
return false return false
} finally { } finally {
IOUtils.closeQuietly(decodeBitmapInputStream) decodeBitmapInputStream.closeQuietly()
} ?: return false } ?: return false
val reorientedBitmap = reorientBitmap(scaledBitmap, orientation) val reorientedBitmap = reorientBitmap(scaledBitmap, orientation)

View file

@ -28,7 +28,7 @@ import com.keylesspalace.tusky.db.DraftEntity
import com.keylesspalace.tusky.entity.Attachment import com.keylesspalace.tusky.entity.Attachment
import com.keylesspalace.tusky.entity.NewPoll import com.keylesspalace.tusky.entity.NewPoll
import com.keylesspalace.tusky.entity.Status 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.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
@ -194,7 +194,7 @@ class DraftHelper @Inject constructor(
return null return null
} }
} else { } else {
IOUtils.copyToFile(contentResolver, this, file) this.copyToFile(contentResolver, file)
} }
return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", file) return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", file)
} }

View file

@ -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 <http://www.gnu.org/licenses>. */
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;
}
}

View file

@ -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 <http://www.gnu.org/licenses>. */
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
}

View file

@ -75,7 +75,7 @@ fun getImageSquarePixels(contentResolver: ContentResolver, uri: Uri): Long {
options.inJustDecodeBounds = true options.inJustDecodeBounds = true
BitmapFactory.decodeStream(input, null, options) BitmapFactory.decodeStream(input, null, options)
IOUtils.closeQuietly(input) input.closeQuietly()
return (options.outWidth * options.outHeight).toLong() return (options.outWidth * options.outHeight).toLong()
} }
@ -158,11 +158,11 @@ fun getImageOrientation(uri: Uri, contentResolver: ContentResolver): Int {
exifInterface = ExifInterface(inputStream) exifInterface = ExifInterface(inputStream)
} catch (e: IOException) { } catch (e: IOException) {
Log.w(TAG, e) Log.w(TAG, e)
IOUtils.closeQuietly(inputStream) inputStream.closeQuietly()
return ExifInterface.ORIENTATION_UNDEFINED return ExifInterface.ORIENTATION_UNDEFINED
} }
val orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL) val orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
IOUtils.closeQuietly(inputStream) inputStream.closeQuietly()
return orientation return orientation
} }