From 6d76e73ed1b7ebd66db4770dfa94309478f11c88 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Thu, 4 Jan 2024 11:05:08 +0800 Subject: [PATCH 1/3] 1.6.6 --- .../java/com/mx/imgpicker/MXImagePicker.kt | 8 ++ .../app/picker/MXImgPickerActivity.kt | 4 +- .../java/com/mx/imgpicker/db/MXDBSource.kt | 116 ++++++++++-------- .../java/com/mx/imgpicker/utils/MXScanBiz.kt | 51 ++++---- README.md | 4 +- .../com/mx/imagepicker_sample/MainActivity.kt | 5 +- build.gradle | 2 +- 7 files changed, 111 insertions(+), 79 deletions(-) diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/MXImagePicker.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/MXImagePicker.kt index 4e97aab..ee28ca4 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/MXImagePicker.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/MXImagePicker.kt @@ -2,12 +2,14 @@ package com.mx.imgpicker import android.app.Activity import android.app.Application +import android.content.Context import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.mx.imgpicker.app.MXImgShowActivity import com.mx.imgpicker.app.picker.MXImgPickerActivity import com.mx.imgpicker.models.MXItem +import com.mx.imgpicker.utils.MXScanBiz import com.mx.imgpicker.utils.MXUtils import java.util.concurrent.atomic.AtomicBoolean @@ -73,7 +75,13 @@ object MXImagePicker { override fun onActivityDestroyed(p0: Activity) { } + } + /** + * 预扫描所有图片/视频 + */ + suspend fun preScan(context: Context) { + MXScanBiz.preScan(context) } } diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXImgPickerActivity.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXImgPickerActivity.kt index 1fbfc69..2c04b5b 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXImgPickerActivity.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXImgPickerActivity.kt @@ -121,7 +121,9 @@ class MXImgPickerActivity : AppCompatActivity() { MXScanBiz.setOnUpdateListener { lifecycleScope.launch { vm.reloadMediaList() } } - MXScanBiz.scanAll(this, lifecycleScope) + lifecycleScope.launch { + MXScanBiz.scanAll(this@MXImgPickerActivity) + } } fun showLargeView(show: Boolean, target: MXItem? = null) { diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt index 005a04c..0cc0d8b 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt @@ -90,6 +90,23 @@ internal class MXDBSource private constructor(val context: Context) { return false } + /** + * 删除记录 + */ + fun deleteAll(): Boolean { + synchronized(lock) { + val database = dbHelp.writableDatabase + try { + database.delete(MXSQLite.DB_NAME, null, null) + } catch (e: Exception) { + e.printStackTrace() + } finally { + database.close() + } + } + return false + } + /** * 获取对应类型的所有数据 */ @@ -97,62 +114,61 @@ internal class MXDBSource private constructor(val context: Context) { type: MXPickerType, path: String, maxListSize: Int - ): ArrayList = - withContext(Dispatchers.IO) { - val sourceList = ArrayList() - val section = ArrayList() - val sectionArg = ArrayList() + ): ArrayList = withContext(Dispatchers.IO) { + val sourceList = ArrayList() + val section = ArrayList() + val sectionArg = ArrayList() - if (type != MXPickerType.ImageAndVideo) { - section.add("${MXSQLite.DB_TYPE}=?") - sectionArg.add(type.value) - } - if (path.isNotBlank()) { - section.add("${MXSQLite.DB_DIR}=?") - sectionArg.add(path) - } - val orderBy = - MXSQLite.DB_TIME + " desc" + (if (maxListSize > 0) " limit $maxListSize" else "") + if (type != MXPickerType.ImageAndVideo) { + section.add("${MXSQLite.DB_TYPE}=?") + sectionArg.add(type.value) + } + if (path.isNotBlank()) { + section.add("${MXSQLite.DB_DIR}=?") + sectionArg.add(path) + } + val orderBy = + MXSQLite.DB_TIME + " desc" + (if (maxListSize > 0) " limit $maxListSize" else "") - synchronized(lock) { - val database = dbHelp.writableDatabase - var cursor: Cursor? = null + synchronized(lock) { + val database = dbHelp.writableDatabase + var cursor: Cursor? = null + try { + cursor = database.query( + MXSQLite.DB_NAME, + arrayOf( + MXSQLite.DB_PATH, + MXSQLite.DB_TIME, + MXSQLite.DB_PRIVATE, + MXSQLite.DB_VIDEO_LENGTH, + MXSQLite.DB_TYPE + ), + section.joinToString(" and "), + sectionArg.toTypedArray(), + null, + null, + orderBy + ) + if (cursor != null && cursor.moveToFirst()) { + do { + val item = cursorToItem(database, cursor) + if (item != null) { + sourceList.add(item) + } + } while (cursor.moveToNext()) + } + } catch (e: Exception) { + e.printStackTrace() + } finally { try { - cursor = database.query( - MXSQLite.DB_NAME, - arrayOf( - MXSQLite.DB_PATH, - MXSQLite.DB_TIME, - MXSQLite.DB_PRIVATE, - MXSQLite.DB_VIDEO_LENGTH, - MXSQLite.DB_TYPE - ), - section.joinToString(" and "), - sectionArg.toTypedArray(), - null, - null, - orderBy - ) - if (cursor != null && cursor.moveToFirst()) { - do { - val item = cursorToItem(database, cursor) - if (item != null) { - sourceList.add(item) - } - } while (cursor.moveToNext()) - } + cursor?.close() } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - cursor?.close() - } catch (e: Exception) { - } - database.close() } + database.close() } - return@withContext sourceList } + return@withContext sourceList + } suspend fun getAllDirList(type: MXPickerType): ArrayList = withContext(Dispatchers.IO) { @@ -251,7 +267,7 @@ internal class MXDBSource private constructor(val context: Context) { } finally { try { cursor?.close() - } catch (e: Exception) { + } catch (_: Exception) { } database.close() } diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXScanBiz.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXScanBiz.kt index 695549f..9ff485e 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXScanBiz.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXScanBiz.kt @@ -17,38 +17,43 @@ object MXScanBiz { private const val PAGE_SIZE = 20 private const val SCAN_SIZE = PAGE_SIZE * 2 + private var hasDeleteAll = false private var hasScanAllImage = false private var hasScanAllVideo = false private var hasScanAllDirs = false private var listener: (() -> Unit)? = null + internal suspend fun preScan(context: Context) = withContext(Dispatchers.Main) { + if (!hasDeleteAll) { + MXUtils.log("MXScanBiz -- deleteAll") + MXDBSource.instance.deleteAll() + hasDeleteAll = true + } + scanAll(context) + } - fun scanAll(context: Context, scope: CoroutineScope) { - MXUtils.log("MXScanBiz -- scanAll") - val job = scope.launch { - MXUtils.log("MXScanBiz -- scanAll 开始扫描") - if (!hasScanAllImage) { - val size = scanImage(context, Int.MAX_VALUE) - if (size > 0) { - hasScanAllImage = true - } + internal suspend fun scanAll(context: Context) = withContext(Dispatchers.Main) { + MXUtils.log("MXScanBiz -- scanAll 开始扫描") + if (!hasScanAllImage) { + val size = scanImage(context, Int.MAX_VALUE) + if (size > 0) { + hasScanAllImage = true } - if (!hasScanAllVideo) { - val size = scanVideo(context, Int.MAX_VALUE) - if (size > 0) { - hasScanAllVideo = true - } - } - if (!hasScanAllDirs) { - val size = scanDirs(context, Int.MAX_VALUE) - if (size > 0) { - hasScanAllDirs = true - } + } + if (!hasScanAllVideo) { + val size = scanVideo(context, Int.MAX_VALUE) + if (size > 0) { + hasScanAllVideo = true } } - job.invokeOnCompletion { - MXUtils.log("MXScanBiz -- scanAll 结束扫描") - listener?.invoke() + if (!hasScanAllDirs) { + val size = scanDirs(context, Int.MAX_VALUE) + if (size > 0) { + hasScanAllDirs = true + } } + + MXUtils.log("MXScanBiz -- scanAll 结束扫描") + listener?.invoke() } fun scanRecent(context: Context, scope: CoroutineScope) { diff --git a/README.md b/README.md index b58e72a..ae9d4da 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Gradle引用 ```gradle - implementation 'com.gitee.zhangmengxiong:MXImagePicker:1.6.5' + implementation 'com.gitee.zhangmengxiong:MXImagePicker:1.6.6' ``` ![Image text](https://gitee.com/zhangmengxiong/MXImagePicker/raw/master/imgs/screenshot1.png) @@ -57,7 +57,7 @@ startActivityForResult(intent, 0x22) ```kotlin MXImagePicker.init(application) -MXScanBiz.scanAll(this, lifecycleScope) +lifecycleScope.launch{ MXScanBiz.preScan(this) } ``` ##### MXPickerBuilder参数说明 diff --git a/app/src/main/java/com/mx/imagepicker_sample/MainActivity.kt b/app/src/main/java/com/mx/imagepicker_sample/MainActivity.kt index bb68dea..119ee8e 100644 --- a/app/src/main/java/com/mx/imagepicker_sample/MainActivity.kt +++ b/app/src/main/java/com/mx/imagepicker_sample/MainActivity.kt @@ -15,7 +15,6 @@ import com.mx.imgpicker.builder.MXPickerBuilder import com.mx.imgpicker.compress.MXImageCompress import com.mx.imgpicker.models.MXCompressType import com.mx.imgpicker.models.MXPickerType -import com.mx.imgpicker.utils.MXScanBiz import com.mx.starter.MXStarter import kotlinx.coroutines.launch import java.io.File @@ -168,6 +167,8 @@ class MainActivity : FragmentActivity() { ) } MXImagePicker.init(application) - MXScanBiz.scanAll(this, lifecycleScope) + lifecycleScope.launch { + MXImagePicker.preScan(this@MainActivity) + } } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 259eb8c..f073b5e 100644 --- a/build.gradle +++ b/build.gradle @@ -16,5 +16,5 @@ ext { minSdkVersion = 19 versionCode = 1 - versionName = "1.6.5" + versionName = "1.6.6" } \ No newline at end of file -- Gitee From 877775d38e2bae3058dc078a8a681bbe94ebaabe Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Thu, 4 Jan 2024 11:07:26 +0800 Subject: [PATCH 2/3] Update MXScanBiz.kt --- .../src/main/java/com/mx/imgpicker/utils/MXScanBiz.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXScanBiz.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXScanBiz.kt index 9ff485e..f2abca9 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXScanBiz.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXScanBiz.kt @@ -17,16 +17,16 @@ object MXScanBiz { private const val PAGE_SIZE = 20 private const val SCAN_SIZE = PAGE_SIZE * 2 - private var hasDeleteAll = false + private var hasDeleteAllFirstTime = false private var hasScanAllImage = false private var hasScanAllVideo = false private var hasScanAllDirs = false private var listener: (() -> Unit)? = null internal suspend fun preScan(context: Context) = withContext(Dispatchers.Main) { - if (!hasDeleteAll) { + if (!hasDeleteAllFirstTime) { MXUtils.log("MXScanBiz -- deleteAll") MXDBSource.instance.deleteAll() - hasDeleteAll = true + hasDeleteAllFirstTime = true } scanAll(context) } -- Gitee From 43dea8aaa2fb4759ce5a3a3be1cd62d0ab895fcf Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Thu, 4 Jan 2024 11:08:14 +0800 Subject: [PATCH 3/3] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ae9d4da..502237d 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ startActivityForResult(intent, 0x22) ```kotlin MXImagePicker.init(application) -lifecycleScope.launch{ MXScanBiz.preScan(this) } +lifecycleScope.launch{ MXImagePicker.preScan(this@MainActivity) } ``` ##### MXPickerBuilder参数说明 -- Gitee