diff --git a/app/build.gradle b/app/build.gradle index 8d6f4bf48..c3fba1918 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,9 +96,14 @@ dependencies { kapt 'com.github.bumptech.glide:compiler:4.10.0' - kapt 'androidx.room:room-compiler:2.2.6' - implementation 'androidx.room:room-runtime:2.2.6' - annotationProcessor 'androidx.room:room-compiler:2.2.6' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0' + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9" + + kapt "androidx.room:room-compiler:2.2.6" + implementation "androidx.room:room-ktx:2.2.6" + implementation "androidx.room:room-runtime:2.2.6" + annotationProcessor "androidx.room:room-compiler:2.2.6" } // Apply the PESDKPlugin diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt index a26639b55..62b6e994c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt @@ -18,6 +18,7 @@ import android.provider.MediaStore.Images import android.util.DisplayMetrics import android.view.View import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope import androidx.exifinterface.media.ExifInterface import com.bumptech.glide.Glide import com.bumptech.glide.load.DecodeFormat @@ -36,7 +37,13 @@ import com.simplemobiletools.gallery.pro.dialogs.PickDirectoryDialog import com.simplemobiletools.gallery.pro.helpers.RECYCLE_BIN import com.simplemobiletools.gallery.pro.models.DateTaken import com.squareup.picasso.Picasso -import java.io.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.io.FileOutputStream +import java.io.InputStream +import java.io.OutputStream import java.text.SimpleDateFormat import java.util.* @@ -423,7 +430,12 @@ fun Activity.hasNavBar(): Boolean { return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels > 0) || (realDisplayMetrics.heightPixels - displayMetrics.heightPixels > 0) } -fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, hasRescanned: Boolean = false, callback: (() -> Unit)? = null) { +fun AppCompatActivity.fixDateTaken( + paths: ArrayList, + showToasts: Boolean, + hasRescanned: Boolean = false, + callback: (() -> Unit)? = null +) { val BATCH_SIZE = 50 if (showToasts) { toast(R.string.fixing) @@ -434,7 +446,7 @@ fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, hasResc var didUpdateFile = false val operations = ArrayList() - ensureBackgroundThread { + lifecycleScope.launch(Dispatchers.IO) { val dateTakens = ArrayList() for (path in paths) { @@ -478,10 +490,8 @@ fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, hasResc toast(R.string.no_date_takens_found) } - runOnUiThread { - callback?.invoke() - } - return@ensureBackgroundThread + withContext(Dispatchers.Main) { callback?.invoke() } + return@launch } val resultSize = contentResolver.applyBatch(MediaStore.AUTHORITY, operations).size @@ -494,7 +504,7 @@ fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, hasResc dateTakensDB.insertAll(dateTakens) } - runOnUiThread { + withContext(Dispatchers.Main) { if (showToasts) { toast(if (didUpdateFile) R.string.dates_fixed_successfully else R.string.unknown_error_occurred) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt index 25d2ffb60..8a4b17f07 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt @@ -15,6 +15,8 @@ import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.models.Medium import com.simplemobiletools.gallery.pro.models.ThumbnailItem import com.simplemobiletools.gallery.pro.models.ThumbnailSection +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking import java.io.File import java.util.* @@ -458,10 +460,12 @@ class MediaFetcher(val context: Context) { } val dateTakenValues = try { - if (folder == FAVORITES) { - context.dateTakensDB.getAllDateTakens() - } else { - context.dateTakensDB.getDateTakensFromPath(folder) + runBlocking { + if (folder == FAVORITES) { + context.dateTakensDB.getAllDateTakens() + } else { + context.dateTakensDB.getDateTakensFromPath(folder) + } } } catch (e: Exception) { return dateTakens @@ -495,7 +499,7 @@ class MediaFetcher(val context: Context) { } } - val dateTakenValues = context.dateTakensDB.getAllDateTakens() + val dateTakenValues = runBlocking(Dispatchers.IO) { context.dateTakensDB.getAllDateTakens() } dateTakenValues.forEach { dateTakens[it.fullPath] = it.taken diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DateTakensDao.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DateTakensDao.kt index 5041727e9..93b27b88c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DateTakensDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DateTakensDao.kt @@ -9,11 +9,11 @@ import com.simplemobiletools.gallery.pro.models.DateTaken @Dao interface DateTakensDao { @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertAll(dateTakens: List) + suspend fun insertAll(dateTakens: List) @Query("SELECT full_path, filename, parent_path, date_taken, last_fixed, last_modified FROM date_takens WHERE parent_path = :path COLLATE NOCASE") - fun getDateTakensFromPath(path: String): List + suspend fun getDateTakensFromPath(path: String): List @Query("SELECT full_path, filename, parent_path, date_taken, last_fixed, last_modified FROM date_takens") - fun getAllDateTakens(): List + suspend fun getAllDateTakens(): List }