From 53a897e96a2d2e6f90ce75f98a12b67f341ee66f Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Fri, 16 Sep 2022 11:22:49 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mx/imgpicker/adapts/FolderAdapt.kt | 18 ++++++++++--- .../app/picker/MXImgPickerActivity.kt | 3 +++ .../com/mx/imgpicker/app/picker/MXPickerVM.kt | 25 +++++++++++-------- .../app/picker/fragment/MXPickerFragment.kt | 8 +++--- .../java/com/mx/imgpicker/db/MXDBSource.kt | 10 +++++--- 5 files changed, 43 insertions(+), 21 deletions(-) diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/adapts/FolderAdapt.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/adapts/FolderAdapt.kt index dc11677..548ec8e 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/adapts/FolderAdapt.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/adapts/FolderAdapt.kt @@ -5,14 +5,18 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.lifecycle.LifecycleCoroutineScope import androidx.recyclerview.widget.RecyclerView import com.mx.imgpicker.MXImagePicker import com.mx.imgpicker.R import com.mx.imgpicker.app.picker.MXPickerVM import com.mx.imgpicker.models.MXDirItem +import kotlinx.coroutines.launch -internal class FolderAdapt(private val vm: MXPickerVM) : - RecyclerView.Adapter() { +internal class FolderAdapt( + private val vm: MXPickerVM, + private val lifecycleScope: LifecycleCoroutineScope +) : RecyclerView.Adapter() { var onItemClick: ((item: MXDirItem) -> Unit)? = null class FolderVH(itemView: View) : RecyclerView.ViewHolder(itemView) { @@ -32,8 +36,16 @@ internal class FolderAdapt(private val vm: MXPickerVM) : override fun onBindViewHolder(holder: FolderVH, position: Int) { val item = vm.dirList.getOrNull(position) ?: return val isSelect = (item.path == vm.selectDirLive.value?.path) + + if (item.lastItem == null) { + lifecycleScope.launch { + item.lastItem = vm.sourceDB.queryLastItem(item.path, vm.pickerType) + this@FolderAdapt.notifyItemChanged(position) + } + } + + holder.img.setImageResource(R.drawable.mx_icon_picker_image_place_holder) item.lastItem?.let { imgItem -> - holder.img.setImageResource(R.drawable.mx_icon_picker_image_place_holder) MXImagePicker.getImageLoader()?.invoke(imgItem, holder.img) } holder.folderNameTxv.text = item.name 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 8d59f92..36a23ea 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 @@ -62,6 +62,9 @@ class MXImgPickerActivity : AppCompatActivity() { (intent.getSerializableExtra(MXPickerBuilder.KEY_INTENT_BUILDER) as? MXConfig) ?: MXConfig() ) + lifecycleScope.launch { + vm.reloadMediaList() + } MXUtils.log("启动") val permissions = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE) diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt index 5f83b66..ffa030c 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File +import java.util.concurrent.atomic.AtomicBoolean internal class MXPickerVM : ViewModel() { companion object { @@ -25,7 +26,7 @@ internal class MXPickerVM : ViewModel() { private val allResStr by lazy { MXImagePicker.getContext().resources.getString(R.string.mx_picker_string_all) } - private val sourceDB by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + val sourceDB by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { MXDBSource(MXImagePicker.getContext()) } private var isRelease = false @@ -68,19 +69,20 @@ internal class MXPickerVM : ViewModel() { val needCompress = MutableLiveData(true) // 是否需要压缩 val fullScreenSelectIndex = MutableLiveData(0) // 是否需要压缩 + private val scanLock = AtomicBoolean(false) fun startScan() { viewModelScope.launch { + if (scanLock.get()) return@launch + scanLock.set(true) MXUtils.log("开始扫描--> <--") val context = MXImagePicker.getContext() - reloadMediaList() - val scanResult: ((List) -> Boolean) = { list -> viewModelScope.launch { val hasSave = withContext(Dispatchers.IO) { mediaList.containsAll(list) } if (hasSave) return@launch - MXUtils.log("扫描结果--> ${list.size}") +// MXUtils.log("扫描结果--> ${list.size}") sourceDB.addSysSource(list) reloadMediaList() } @@ -98,6 +100,7 @@ internal class MXPickerVM : ViewModel() { reloadMediaList() MXUtils.log("结束扫描--> <--") + scanLock.set(false) } } @@ -106,14 +109,10 @@ internal class MXPickerVM : ViewModel() { } suspend fun reloadMediaList() = withContext(Dispatchers.IO) { + val start = System.currentTimeMillis() val dirs = sourceDB.getAllDirList(pickerType) val dir = selectDirLive.value - val allDir = MXDirItem( - allResStr, - "", - dirs.sumOf { it.childSize }, - sourceDB.queryLastItem("", pickerType) - ) + val allDir = MXDirItem(allResStr, "", dirs.sumOf { it.childSize }) val allDirs = listOf(allDir) + dirs val selectDir = allDirs.firstOrNull { it.path == (dir?.path ?: "") } @@ -121,15 +120,19 @@ internal class MXPickerVM : ViewModel() { if (!MXUtils.compareList(dirListLive.value, allDirs)) { dirListLive.postValue(allDirs) + MXUtils.log("目录列表刷新:${dirListLive.value?.size}->${allDirs.size}") } - if (dir != selectDir) { + if (dir?.path != selectDir.path) { selectDirLive.postValue(selectDir) + MXUtils.log("选中目录刷新:${dir?.path}->${selectDir.path}") } val mediaList = sourceDB.getAllSource(pickerType, selectDir.path) if (!MXUtils.compareList(mediaListLive.value, mediaList)) { mediaListLive.postValue(mediaList) + MXUtils.log("图片数据刷新") } + MXUtils.log("加载时长:${(System.currentTimeMillis() - start) / 1000f} 秒") } fun release() { diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/fragment/MXPickerFragment.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/fragment/MXPickerFragment.kt index 637aba7..da785c2 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/fragment/MXPickerFragment.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/fragment/MXPickerFragment.kt @@ -2,7 +2,6 @@ package com.mx.imgpicker.app.picker.fragment import android.Manifest import android.content.Intent -import android.graphics.Rect import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -14,7 +13,10 @@ import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.* +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.SimpleItemAnimator import com.mx.imgpicker.R import com.mx.imgpicker.adapts.FolderAdapt import com.mx.imgpicker.adapts.ImgGridAdapt @@ -30,7 +32,7 @@ import kotlinx.coroutines.launch internal class MXPickerFragment : Fragment() { private val vm by lazy { ViewModelProvider(requireActivity()).get(MXPickerVM::class.java) } private val imgAdapt by lazy { ImgGridAdapt(vm) } - private val folderAdapt by lazy { FolderAdapt(vm) } + private val folderAdapt by lazy { FolderAdapt(vm, lifecycleScope) } private var selectItemIndex: Array? = null private var returnBtn: ImageView? = 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 db49b8e..5728ec1 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt @@ -194,9 +194,6 @@ internal class MXDBSource(val context: Context) { database.close() } } - for (dir in dirs) { - dir.lastItem = queryLastItem(dir.path, type) - } return@withContext dirs } @@ -235,7 +232,12 @@ internal class MXDBSource(val context: Context) { orderBy ) if (cursor != null && cursor.moveToFirst()) { - return@withContext cursorToItem(database, cursor) + do { + val item = cursorToItem(database, cursor) + if (item != null) { + return@withContext item + } + } while (cursor.moveToNext()) } } catch (e: Exception) { e.printStackTrace() -- Gitee From f8d384876bfc7b59a478d00b5fe7ed3c8939eb06 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Fri, 16 Sep 2022 11:29:57 +0800 Subject: [PATCH 2/3] 66 --- .../main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt | 6 +++--- .../src/main/java/com/mx/imgpicker/db/MXDBSource.kt | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt index ffa030c..bdc3ac0 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt @@ -120,17 +120,17 @@ internal class MXPickerVM : ViewModel() { if (!MXUtils.compareList(dirListLive.value, allDirs)) { dirListLive.postValue(allDirs) - MXUtils.log("目录列表刷新:${dirListLive.value?.size}->${allDirs.size}") + MXUtils.log("刷新->目录列表:${dirListLive.value?.size}->${allDirs.size}") } if (dir?.path != selectDir.path) { selectDirLive.postValue(selectDir) - MXUtils.log("选中目录刷新:${dir?.path}->${selectDir.path}") + MXUtils.log("刷新->选中目录:${dir?.path}->${selectDir.path}") } val mediaList = sourceDB.getAllSource(pickerType, selectDir.path) if (!MXUtils.compareList(mediaListLive.value, mediaList)) { mediaListLive.postValue(mediaList) - MXUtils.log("图片数据刷新") + MXUtils.log("刷新->图片列表") } MXUtils.log("加载时长:${(System.currentTimeMillis() - start) / 1000f} 秒") } 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 5728ec1..46a38a1 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt @@ -11,6 +11,7 @@ import com.mx.imgpicker.utils.source_loader.MXVideoSource import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.File +import kotlin.math.abs internal class MXDBSource(val context: Context) { companion object { @@ -279,6 +280,13 @@ internal class MXDBSource(val context: Context) { arrayOf(path) ) } + if (isPrivate && abs(System.currentTimeMillis() - time) > 60 * 1000) {// 删除超时的自拍数据 + database.delete( + MXSQLite.DB_NAME, + "${MXSQLite.DB_PATH} = ?", + arrayOf(path) + ) + } return null } -- Gitee From 43cf8571702c49516b4a439a7e5b75dd0d44adc1 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Fri, 16 Sep 2022 13:35:09 +0800 Subject: [PATCH 3/3] 1.5.4 --- ImagePickerLib/build.gradle | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ImagePickerLib/build.gradle b/ImagePickerLib/build.gradle index ca446ab..ea6f2d6 100644 --- a/ImagePickerLib/build.gradle +++ b/ImagePickerLib/build.gradle @@ -33,7 +33,7 @@ afterEvaluate { groupId = 'com.mx.imgpicker' artifactId = 'MXImagePicker' - version = '1.5.3' + version = '1.5.4' } } } diff --git a/build.gradle b/build.gradle index aed9ce8..31d2550 100644 --- a/build.gradle +++ b/build.gradle @@ -37,5 +37,5 @@ ext { minSdkVersion = 19 versionCode = 1 - versionName = "1.5.3" + versionName = "1.5.4" } \ No newline at end of file -- Gitee