From b62abaec376ab55692f04f2a121acd66baa045bb Mon Sep 17 00:00:00 2001 From: litingting Date: Wed, 29 Oct 2025 09:55:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 4 + app/objectbox-models/default.json | 78 ++++++++++ app/src/main/AndroidManifest.xml | 15 +- .../com/ux/video/file/filerecovery/App.kt | 2 + .../file/filerecovery/base/BaseFragment.kt | 24 +++ .../file/filerecovery/db/ObjectBoxManager.kt | 144 ++++++++++++++++++ .../ResultPhotos.kt => db/ResultData.kt} | 6 +- .../ResultDataFiles.kt} | 14 +- .../documents/DocumentsScanResultAdapter.kt | 6 +- .../file/filerecovery/main/MainActivity.kt | 9 +- .../filerecovery/recovery/RecoveryActivity.kt | 74 +++++++++ .../recovery/ui/MyViewPage2Adapter.kt | 14 ++ .../ui/recoveryphoto/RecoveryPhotoFragment.kt | 32 ++++ .../recoveryphoto/RecoveryPhotoViewModel.kt | 7 + .../result/ScanResultDisplayActivity.kt | 10 +- .../result/ScanResultDocumentsAdapter.kt | 18 +-- .../result/ScanResultPhotoAdapter.kt | 10 +- .../ConfirmDeleteDialogFragment.kt | 2 +- .../{photo => sort}/DateFilterPopupWindows.kt | 2 +- .../DatePickerDialogFragment.kt | 2 +- .../{photo => sort}/DeletingDialogFragment.kt | 2 +- .../{photo => sort}/FilterPopupWindows.kt | 3 +- .../PhotoDisplayDateAdapter.kt | 29 ++-- .../PhotoDisplayDateChildAdapter.kt | 139 ++++++++++++----- .../{photo => sort}/PhotoInfoActivity.kt | 46 +++--- .../{photo => sort}/PhotoSortingActivity.kt | 47 +++--- .../{photo => sort}/RecoverOrDeleteManager.kt | 65 ++++---- .../RecoveringDialogFragment.kt | 2 +- .../{photo => sort}/SortDialogFragment.kt | 2 +- .../video/file/filerecovery/utils/Common.kt | 132 +++++++++++----- .../filerecovery/utils/ExtendFunctions.kt | 36 ++--- .../file/filerecovery/utils/ScanManager.kt | 76 +++++---- .../file/filerecovery/utils/ScanRepository.kt | 26 ++-- .../file/filerecovery/utils/ScanState.kt | 4 +- .../filerecovery/video/VideoPlayActivity.kt | 17 +-- ...elector_recovery_file_tab_layout_title.xml | 6 + app/src/main/res/drawable/icon_apk.png | Bin 0 -> 26160 bytes app/src/main/res/drawable/icon_doc.png | Bin 0 -> 27818 bytes app/src/main/res/drawable/icon_pdf.png | Bin 0 -> 22454 bytes app/src/main/res/drawable/icon_ppt.png | Bin 0 -> 20853 bytes app/src/main/res/drawable/icon_txt.png | Bin 0 -> 22325 bytes app/src/main/res/drawable/icon_unknow.png | Bin 0 -> 17966 bytes app/src/main/res/drawable/icon_xls.png | Bin 0 -> 26358 bytes .../main/res/layout/activity_photo_info.xml | 2 +- .../res/layout/activity_photo_sorting.xml | 2 +- app/src/main/res/layout/activity_recovery.xml | 53 +++++++ .../res/layout/fragment_recovery_photo.xml | 20 +++ ..._documents_item.xml => one_audio_item.xml} | 0 .../main/res/layout/one_documents_item.xml | 78 ++++++++++ app/src/main/res/layout/tab_layout_item.xml | 24 +++ app/src/main/res/values/strings.xml | 2 + build.gradle.kts | 6 + gradle/libs.versions.toml | 6 + 53 files changed, 1003 insertions(+), 295 deletions(-) create mode 100644 app/objectbox-models/default.json create mode 100644 app/src/main/java/com/ux/video/file/filerecovery/base/BaseFragment.kt create mode 100644 app/src/main/java/com/ux/video/file/filerecovery/db/ObjectBoxManager.kt rename app/src/main/java/com/ux/video/file/filerecovery/{photo/ResultPhotos.kt => db/ResultData.kt} (50%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo/ResultPhotosFiles.kt => db/ResultDataFiles.kt} (77%) create mode 100644 app/src/main/java/com/ux/video/file/filerecovery/recovery/RecoveryActivity.kt create mode 100644 app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/MyViewPage2Adapter.kt create mode 100644 app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoFragment.kt create mode 100644 app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoViewModel.kt rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/ConfirmDeleteDialogFragment.kt (96%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/DateFilterPopupWindows.kt (99%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/DatePickerDialogFragment.kt (99%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/DeletingDialogFragment.kt (93%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/FilterPopupWindows.kt (98%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/PhotoDisplayDateAdapter.kt (81%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/PhotoDisplayDateChildAdapter.kt (65%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/PhotoInfoActivity.kt (87%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/PhotoSortingActivity.kt (96%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/RecoverOrDeleteManager.kt (71%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/RecoveringDialogFragment.kt (93%) rename app/src/main/java/com/ux/video/file/filerecovery/{photo => sort}/SortDialogFragment.kt (98%) create mode 100644 app/src/main/res/color/selector_recovery_file_tab_layout_title.xml create mode 100644 app/src/main/res/drawable/icon_apk.png create mode 100644 app/src/main/res/drawable/icon_doc.png create mode 100644 app/src/main/res/drawable/icon_pdf.png create mode 100644 app/src/main/res/drawable/icon_ppt.png create mode 100644 app/src/main/res/drawable/icon_txt.png create mode 100644 app/src/main/res/drawable/icon_unknow.png create mode 100644 app/src/main/res/drawable/icon_xls.png create mode 100644 app/src/main/res/layout/activity_recovery.xml create mode 100644 app/src/main/res/layout/fragment_recovery_photo.xml rename app/src/main/res/layout/{one_audio_documents_item.xml => one_audio_item.xml} (100%) create mode 100644 app/src/main/res/layout/one_documents_item.xml create mode 100644 app/src/main/res/layout/tab_layout_item.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 67dfffd..3545135 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.kotlin.android) id ("kotlin-kapt") id ("kotlin-parcelize") + id("io.objectbox") } android { @@ -47,6 +48,9 @@ dependencies { implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.fragment.ktx) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/objectbox-models/default.json b/app/objectbox-models/default.json new file mode 100644 index 0000000..6e25a4d --- /dev/null +++ b/app/objectbox-models/default.json @@ -0,0 +1,78 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "2:1219714858038066790", + "lastPropertyId": "8:5134665607056785092", + "name": "ResultDataFiles", + "properties": [ + { + "id": "1:1863268749092884504", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:685886748782553244", + "name": "fileType", + "type": 5 + }, + { + "id": "3:313976899017664946", + "name": "name", + "type": 9 + }, + { + "id": "4:3491625332486824618", + "name": "path", + "type": 9 + }, + { + "id": "5:2788384583815433725", + "name": "size", + "type": 6 + }, + { + "id": "6:8902434027574194684", + "name": "sizeString", + "type": 9 + }, + { + "id": "7:8305655849151310709", + "name": "lastModified", + "type": 6 + }, + { + "id": "8:5134665607056785092", + "name": "resolution", + "type": 9 + } + ], + "relations": [] + } + ], + "lastEntityId": "2:1219714858038066790", + "lastIndexId": "0:0", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [ + 4830032338777965154 + ], + "retiredIndexUids": [], + "retiredPropertyUids": [ + 7967846713481917737, + 5916406351352231902, + 5265574492754659377, + 1284016652408596993, + 3831579248666795267, + 4445203567182319472, + 6858261029979256233, + 2835789057594891780 + ], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 13ce729..aea2e06 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,12 +2,8 @@ - - + + @@ -24,14 +20,17 @@ android:supportsRtl="true" android:theme="@style/Theme.FileRecovery" tools:targetApi="31"> + : Fragment() { + + protected lateinit var binding: T + + abstract fun initBinding(inflater: LayoutInflater, container: ViewGroup?): T + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = initBinding(inflater,container) + return binding.root + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/db/ObjectBoxManager.kt b/app/src/main/java/com/ux/video/file/filerecovery/db/ObjectBoxManager.kt new file mode 100644 index 0000000..6aadeb4 --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/db/ObjectBoxManager.kt @@ -0,0 +1,144 @@ +package com.ux.video.file.filerecovery.db + +import android.content.Context +import com.ux.video.file.filerecovery.utils.Common + +import io.objectbox.Box +import io.objectbox.BoxStore +import io.objectbox.config.DebugFlags +import io.objectbox.reactive.DataSubscription +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlin.jvm.java + +object ObjectBoxManager { + val pageSize = 10 + + lateinit var objectboxStore: BoxStore + + + var AllRecoveryBox: Box? = null + + + val observer: DataSubscription? = null + + + fun initObjectBoxDb(context: Context) { + objectboxStore = MyObjectBox.builder().androidContext(context) + .debugFlags(DebugFlags.LOG_QUERIES or DebugFlags.LOG_QUERY_PARAMETERS) + .build() + + } + + private fun getDataBox(): Box { + AllRecoveryBox = + AllRecoveryBox ?: objectboxStore.boxFor(ResultDataFiles::class.java) + + return AllRecoveryBox!! + } + + // fun getLikeBox(): Box? { +// likeWallpaperBox = likeWallpaperBox ?: boxStore?.boxFor(ResultPhotosFiles::class.java) +// return likeWallpaperBox +// } +// +// fun setLikeUpdateListener(queryAllLike:(List)->Unit): DataSubscription { +// val likeBox: Box? = getLikeBox() +// val build: Query = likeBox!!.query() +// .build() +// return build.subscribe(DataSubscriptionList()) +// .on(AndroidScheduler.mainThread()) +// .observer { data -> +// Helper.showMyLog("---OnLikeUpdateListener-------------" + data.size) +// queryAllLike(data) +// } +// } +// + fun addRecoveryFile(resultData: ResultDataFiles) { + val objectBox: Box = getDataBox() + val first = objectBox.query(ResultDataFiles_.path.equal(resultData.path)) + .build().findFirst() + if (first == null) { + objectBox.put(resultData) + Common.showLog("----------addRecoveryFile----${resultData.path}") + } + } + + // +// +// fun insertLike(favoriteData: LikeWallpaper) { +// val likeBox: Box? = getLikeBox() +// val first: LikeWallpaper? = likeBox!!.query() +// .equal(LikeWallpaper_.id, favoriteData.id) +// .build() +// .findFirst() +// if (first == null) { +// Helper.showMyLog("---insertLike-----------------id=" + favoriteData.id) +// likeBox.put(favoriteData) +// } else { +// Helper.showMyLog("---insertLike-----------------id=" + favoriteData.id) +// } +// } +// +// + fun deleteRecoveryFile(resultData: ResultDataFiles) { + val objectBox = getDataBox() + val first = + objectBox.query(ResultDataFiles_.path.equal(resultData.path)).build().findFirst() + + if (first != null) { + val remove = objectBox.remove(first.id) + Common.showLog("----------addRecoveryFile---删除${remove}-${resultData.path}") + } + } + + // +// fun queryIsLike(id: Long): Boolean { +// val likeBox: Box? = getLikeBox() +// val first: LikeWallpaper? = likeBox!!.query() +// .equal(LikeWallpaper_.id, id) +// .build() +// .findFirst() +// return first != null +// } +// +// +// + fun queryRecoveryFile(type: Int): List { + val dataBox = getDataBox() + val list: List = dataBox.query(ResultDataFiles_.fileType.equal(type)) + .build() + .find() + + return list + } + + suspend fun queryRecoveryFileAsync(type: Int): List = + withContext(Dispatchers.IO) { + val dataBox = getDataBox() + dataBox.query(ResultDataFiles_.fileType.equal(type)) + .build() + .find() + } + +// +// fun queryLike(currentPage: Int): List { +// val offset: Int = (currentPage - 1) * pageSize +// val likeBox: Box? = getLikeBox() +// val data: List = likeBox!!.query() +// .build() +// .find(offset.toLong(), pageSize.toLong()) +// +// return data +// } +// +// fun queryAllData(wallpaperType: Long): List { +// val objectBoxLike: Box? = getDataBox() +// val data: List = objectBoxLike!!.query() +// .equal(VideoWallpaper_.wallpapertype, wallpaperType) +// .build() +// .find() +// +// return data +// } +} \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/ResultPhotos.kt b/app/src/main/java/com/ux/video/file/filerecovery/db/ResultData.kt similarity index 50% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/ResultPhotos.kt rename to app/src/main/java/com/ux/video/file/filerecovery/db/ResultData.kt index 001e03e..ba4f55b 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/ResultPhotos.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/db/ResultData.kt @@ -1,11 +1,11 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.db import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize -data class ResultPhotos( +data class ResultData( val dirName: String, - val allFiles: ArrayList + val allFiles: ArrayList ): Parcelable diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/ResultPhotosFiles.kt b/app/src/main/java/com/ux/video/file/filerecovery/db/ResultDataFiles.kt similarity index 77% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/ResultPhotosFiles.kt rename to app/src/main/java/com/ux/video/file/filerecovery/db/ResultDataFiles.kt index 9e7ee9c..0aebcde 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/ResultPhotosFiles.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/db/ResultDataFiles.kt @@ -1,15 +1,22 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.db import java.io.File import android.os.Parcelable import com.ux.video.file.filerecovery.utils.Common +import io.objectbox.annotation.Entity +import io.objectbox.annotation.Id import kotlinx.parcelize.Parcelize +@Entity @Parcelize -data class ResultPhotosFiles( +data class ResultDataFiles( + @Id + var id: Long = 0, + // 0-3 photo\video\audio\documents + var fileType: Int, val name: String, - val path: String? = null, + val path: String, val size: Long, // 字节 val sizeString: String, val lastModified: Long, // 时间戳 @@ -36,4 +43,5 @@ data class ResultPhotosFiles( val duration: Long get() { return Common.getMediaDuration(path.toString()) } + } diff --git a/app/src/main/java/com/ux/video/file/filerecovery/documents/DocumentsScanResultAdapter.kt b/app/src/main/java/com/ux/video/file/filerecovery/documents/DocumentsScanResultAdapter.kt index 9128a53..40773b7 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/documents/DocumentsScanResultAdapter.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/documents/DocumentsScanResultAdapter.kt @@ -5,10 +5,10 @@ import android.view.LayoutInflater import android.view.ViewGroup import com.ux.video.file.filerecovery.base.BaseAdapter import com.ux.video.file.filerecovery.databinding.DocumentsScanResultAdapterBinding -import com.ux.video.file.filerecovery.photo.ResultPhotos +import com.ux.video.file.filerecovery.db.ResultData class DocumentsScanResultAdapter(mContext: Context) : - BaseAdapter(mContext) { + BaseAdapter(mContext) { override fun getViewBinding(parent: ViewGroup): DocumentsScanResultAdapterBinding = DocumentsScanResultAdapterBinding.inflate( LayoutInflater.from(parent.context), @@ -18,7 +18,7 @@ class DocumentsScanResultAdapter(mContext: Context) : override fun bindItem( holder: VHolder, - item: ResultPhotos + item: ResultData ) { holder.vb.run { diff --git a/app/src/main/java/com/ux/video/file/filerecovery/main/MainActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/main/MainActivity.kt index c598897..de8567c 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/main/MainActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/main/MainActivity.kt @@ -1,7 +1,6 @@ package com.ux.video.file.filerecovery.main import android.Manifest -import android.app.Activity import android.content.Context import android.content.Intent import android.content.pm.PackageManager @@ -20,9 +19,8 @@ import androidx.core.view.isVisible import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.BaseActivity import com.ux.video.file.filerecovery.databinding.ActivityMainBinding -import com.ux.video.file.filerecovery.main.ScanSelectTypeActivity -import com.ux.video.file.filerecovery.photo.DateFilterPopupWindows -import com.ux.video.file.filerecovery.photo.DatePickerDialogFragment +import com.ux.video.file.filerecovery.recovery.RecoveryActivity +import com.ux.video.file.filerecovery.sort.DatePickerDialogFragment import com.ux.video.file.filerecovery.utils.ScanManager class MainActivity : BaseActivity() { @@ -95,6 +93,9 @@ class MainActivity : BaseActivity() { currentGoType = ScanSelectTypeActivity.Companion.VALUE_DOCUMENT intentCheck() } + layoutRecovery.setOnClickListener { + startActivity(Intent(this@MainActivity,RecoveryActivity::class.java)) + } } binding.tvTitle.setOnClickListener { diff --git a/app/src/main/java/com/ux/video/file/filerecovery/recovery/RecoveryActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/recovery/RecoveryActivity.kt new file mode 100644 index 0000000..738a14f --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/recovery/RecoveryActivity.kt @@ -0,0 +1,74 @@ +package com.ux.video.file.filerecovery.recovery + +import android.view.LayoutInflater +import androidx.lifecycle.lifecycleScope +import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayout.OnTabSelectedListener +import com.google.android.material.tabs.TabLayoutMediator +import com.ux.video.file.filerecovery.R +import com.ux.video.file.filerecovery.base.BaseActivity +import com.ux.video.file.filerecovery.databinding.ActivityRecoveryBinding +import com.ux.video.file.filerecovery.db.ObjectBoxManager +import com.ux.video.file.filerecovery.recovery.ui.MyViewPage2Adapter +import com.ux.video.file.filerecovery.recovery.ui.recoveryphoto.RecoveryPhotoFragment +import com.ux.video.file.filerecovery.utils.CustomTextView +import kotlinx.coroutines.launch + +class RecoveryActivity : BaseActivity() { + override fun inflateBinding(inflater: LayoutInflater): ActivityRecoveryBinding = ActivityRecoveryBinding.inflate(inflater) + + + override fun initView() { + super.initView() + binding.run { + + viewPage2.adapter = MyViewPage2Adapter(this@RecoveryActivity,listOf(RecoveryPhotoFragment(),RecoveryPhotoFragment(),RecoveryPhotoFragment(),RecoveryPhotoFragment())) + TabLayoutMediator(tabLayout,viewPage2){tab,position-> + val tabView = LayoutInflater.from(this@RecoveryActivity).inflate(R.layout.tab_layout_item, null) + val tvTitle = tabView.findViewById(R.id.tab_item_title) + val tvCount = tabView.findViewById(R.id.tab_item_count) + tvCount.text = getString(R.string.text_counts, 0) + when(position){ + 0->{tvTitle.text = getString(R.string.text_photos)} + 1->{tvTitle.text = getString(R.string.text_videos)} + 2->{tvTitle.text = getString(R.string.text_audios)} + 3->{tvTitle.text = getString(R.string.text_documents)} + } + + tab.customView = tabView + }.attach() + tabLayout.addOnTabSelectedListener(object :OnTabSelectedListener{ + override fun onTabSelected(tab: TabLayout.Tab?) { + + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + + }) + + } + } + + override fun initData() { + super.initData() + lifecycleScope.launch{ + val recoveryFilePhoto = ObjectBoxManager.queryRecoveryFileAsync(0) + val recoveryFileVideo = ObjectBoxManager.queryRecoveryFileAsync(1) + val recoveryFileAudio = ObjectBoxManager.queryRecoveryFileAsync(2) + val recoveryFileDocuments = ObjectBoxManager.queryRecoveryFileAsync(3) + binding.tabLayout.run { + getTabAt(0)?.customView?.findViewById(R.id.tab_item_count)?.text = getString(R.string.text_counts,recoveryFilePhoto.size) + getTabAt(1)?.customView?.findViewById(R.id.tab_item_count)?.text = getString(R.string.text_counts,recoveryFileVideo.size) + getTabAt(2)?.customView?.findViewById(R.id.tab_item_count)?.text = getString(R.string.text_counts,recoveryFileAudio.size) + getTabAt(3)?.customView?.findViewById(R.id.tab_item_count)?.text = getString(R.string.text_counts,recoveryFileDocuments.size) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/MyViewPage2Adapter.kt b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/MyViewPage2Adapter.kt new file mode 100644 index 0000000..d004dff --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/MyViewPage2Adapter.kt @@ -0,0 +1,14 @@ +package com.ux.video.file.filerecovery.recovery.ui + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter + + +class MyViewPage2Adapter( + fragmentActivity: FragmentActivity, + private val fragments: List +) : FragmentStateAdapter(fragmentActivity) { + override fun getItemCount(): Int = fragments.size + override fun createFragment(position: Int): Fragment = fragments[position] +} diff --git a/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoFragment.kt b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoFragment.kt new file mode 100644 index 0000000..c1bb2c8 --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoFragment.kt @@ -0,0 +1,32 @@ +package com.ux.video.file.filerecovery.recovery.ui.recoveryphoto + +import androidx.fragment.app.viewModels +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.ux.video.file.filerecovery.R +import com.ux.video.file.filerecovery.base.BaseFragment +import com.ux.video.file.filerecovery.databinding.FragmentRecoveryPhotoBinding + + +class RecoveryPhotoFragment : BaseFragment() { + + companion object { + fun newInstance() = RecoveryPhotoFragment() + } + + private val viewModel: RecoveryPhotoViewModel by viewModels() + + override fun initBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentRecoveryPhotoBinding = + FragmentRecoveryPhotoBinding.inflate(inflater, container, false) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoViewModel.kt b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoViewModel.kt new file mode 100644 index 0000000..8c76495 --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoViewModel.kt @@ -0,0 +1,7 @@ +package com.ux.video.file.filerecovery.recovery.ui.recoveryphoto + +import androidx.lifecycle.ViewModel + +class RecoveryPhotoViewModel : ViewModel() { + +} \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDisplayActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDisplayActivity.kt index 3537692..48f83bf 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDisplayActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDisplayActivity.kt @@ -7,9 +7,9 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.BaseActivity import com.ux.video.file.filerecovery.databinding.ActivityScanResultDisplayBinding -import com.ux.video.file.filerecovery.photo.PhotoSortingActivity -import com.ux.video.file.filerecovery.photo.ResultPhotos -import com.ux.video.file.filerecovery.photo.ResultPhotosFiles +import com.ux.video.file.filerecovery.sort.PhotoSortingActivity +import com.ux.video.file.filerecovery.db.ResultData +import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.utils.Common.KEY_SCAN_TYPE import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_audio import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_deleted_audio @@ -28,7 +28,7 @@ class ScanResultDisplayActivity : BaseActivity private var scanType: Int = VALUE_SCAN_TYPE_photo private var exitDialog: ExitDialogFragment? = null - private var list: ArrayList? = null + private var list: ArrayList? = null companion object { val KEY_SCAN_RESULT = "scan_result" @@ -136,7 +136,7 @@ class ScanResultDisplayActivity : BaseActivity } - private fun goSort(list: ArrayList) { + private fun goSort(list: ArrayList) { startActivity( Intent( this@ScanResultDisplayActivity, diff --git a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDocumentsAdapter.kt b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDocumentsAdapter.kt index 73d146b..e24d83e 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDocumentsAdapter.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDocumentsAdapter.kt @@ -4,20 +4,12 @@ import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup -import android.widget.ImageView -import com.bumptech.glide.Glide -import com.bumptech.glide.load.resource.bitmap.CenterCrop -import com.bumptech.glide.load.resource.bitmap.RoundedCorners -import com.bumptech.glide.request.RequestOptions import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.BaseAdapter -import com.ux.video.file.filerecovery.databinding.ScanResultAdapterBinding import com.ux.video.file.filerecovery.databinding.ScanResultDocumentsAdapterBinding -import com.ux.video.file.filerecovery.photo.ResultPhotos -import com.ux.video.file.filerecovery.photo.ResultPhotosFiles +import com.ux.video.file.filerecovery.db.ResultData +import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.utils.Common -import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx -import java.io.File /** * 文件或者音频的扫描结果汇总适配器 @@ -25,9 +17,9 @@ import java.io.File class ScanResultDocumentsAdapter( mContext: Context, var type: Int, - var onClickItem: (allFiles: ArrayList) -> Unit + var onClickItem: (allFiles: ArrayList) -> Unit ) : - BaseAdapter(mContext) { + BaseAdapter(mContext) { override fun getViewBinding(parent: ViewGroup): ScanResultDocumentsAdapterBinding = ScanResultDocumentsAdapterBinding.inflate( LayoutInflater.from(parent.context), @@ -38,7 +30,7 @@ class ScanResultDocumentsAdapter( @SuppressLint("SetTextI18n") override fun bindItem( holder: VHolder, - item: ResultPhotos + item: ResultData ) { holder.vb.run { diff --git a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultPhotoAdapter.kt b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultPhotoAdapter.kt index 6f6adc5..9619eaf 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultPhotoAdapter.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultPhotoAdapter.kt @@ -11,17 +11,17 @@ import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions import com.ux.video.file.filerecovery.base.BaseAdapter import com.ux.video.file.filerecovery.databinding.ScanResultAdapterBinding -import com.ux.video.file.filerecovery.photo.ResultPhotos -import com.ux.video.file.filerecovery.photo.ResultPhotosFiles +import com.ux.video.file.filerecovery.db.ResultData +import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx import java.io.File class ScanResultPhotoAdapter( mContext: Context, var type: Int, - var onClickItem: (allFiles: ArrayList) -> Unit + var onClickItem: (allFiles: ArrayList) -> Unit ) : - BaseAdapter(mContext) { + BaseAdapter(mContext) { override fun getViewBinding(parent: ViewGroup): ScanResultAdapterBinding = ScanResultAdapterBinding.inflate( LayoutInflater.from(parent.context), @@ -32,7 +32,7 @@ class ScanResultPhotoAdapter( @SuppressLint("SetTextI18n") override fun bindItem( holder: VHolder, - item: ResultPhotos + item: ResultData ) { holder.vb.run { diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/ConfirmDeleteDialogFragment.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/ConfirmDeleteDialogFragment.kt similarity index 96% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/ConfirmDeleteDialogFragment.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/ConfirmDeleteDialogFragment.kt index ef0dcc7..c5ba3cf 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/ConfirmDeleteDialogFragment.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/ConfirmDeleteDialogFragment.kt @@ -1,4 +1,4 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import android.graphics.Color import android.os.Bundle diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/DateFilterPopupWindows.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/DateFilterPopupWindows.kt similarity index 99% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/DateFilterPopupWindows.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/DateFilterPopupWindows.kt index 75cbb9d..b9fb7df 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/DateFilterPopupWindows.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/DateFilterPopupWindows.kt @@ -1,4 +1,4 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import android.content.Context diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/DatePickerDialogFragment.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/DatePickerDialogFragment.kt similarity index 99% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/DatePickerDialogFragment.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/DatePickerDialogFragment.kt index 29f9742..4559edf 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/DatePickerDialogFragment.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/DatePickerDialogFragment.kt @@ -1,4 +1,4 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import android.annotation.SuppressLint import android.content.Context diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/DeletingDialogFragment.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/DeletingDialogFragment.kt similarity index 93% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/DeletingDialogFragment.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/DeletingDialogFragment.kt index 82d3ee6..71c42c3 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/DeletingDialogFragment.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/DeletingDialogFragment.kt @@ -1,4 +1,4 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.BaseIngDialogFragment diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/FilterPopupWindows.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/FilterPopupWindows.kt similarity index 98% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/FilterPopupWindows.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/FilterPopupWindows.kt index f69fa5e..11d1e6a 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/FilterPopupWindows.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/FilterPopupWindows.kt @@ -1,4 +1,4 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import android.content.Context import android.graphics.Color @@ -9,7 +9,6 @@ import android.view.View import android.view.ViewGroup import android.widget.PopupWindow import android.widget.RelativeLayout -import androidx.core.view.forEach import com.ux.video.file.filerecovery.databinding.CommonLayoutFilterItemBinding import com.ux.video.file.filerecovery.databinding.PopwindowsFilterBinding import com.ux.video.file.filerecovery.utils.Common diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateAdapter.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoDisplayDateAdapter.kt similarity index 81% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateAdapter.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoDisplayDateAdapter.kt index cb82f29..15ca6ea 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateAdapter.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoDisplayDateAdapter.kt @@ -1,18 +1,18 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup -import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import com.ux.video.file.filerecovery.base.BaseAdapter -import com.ux.video.file.filerecovery.base.DiffBaseAdapter import com.ux.video.file.filerecovery.databinding.PhotoDisplayDateAdapterBinding +import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.utils.Common -import com.ux.video.file.filerecovery.utils.GridSpacingItemDecoration +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_deleted_documents +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_documents import com.ux.video.file.filerecovery.utils.ScanRepository class PhotoDisplayDateAdapter( @@ -20,10 +20,10 @@ class PhotoDisplayDateAdapter( var scanType: Int, var mColumns: Int, var viewModel: ScanRepository, - var onSelectedUpdate: (resultPhotosFiles: ResultPhotosFiles, isAdd: Boolean) -> Unit, - var clickItem: (item: ResultPhotosFiles) -> Unit + var onSelectedUpdate: (resultDataFiles: ResultDataFiles, isAdd: Boolean) -> Unit, + var clickItem: (item: ResultDataFiles) -> Unit ) : - BaseAdapter>, PhotoDisplayDateAdapterBinding>(mContext) { + BaseAdapter>, PhotoDisplayDateAdapterBinding>(mContext) { private var allSelected: Boolean? = null @@ -75,7 +75,7 @@ class PhotoDisplayDateAdapter( @SuppressLint("SetTextI18n") override fun bindItem( holder: VHolder, - item: Pair> + item: Pair> ) { holder.vb.run { item.run { @@ -109,9 +109,10 @@ class PhotoDisplayDateAdapter( recyclerChild.apply { layoutManager = when (scanType) { - Common.VALUE_SCAN_TYPE_audio, Common.VALUE_SCAN_TYPE_deleted_audio -> { + Common.VALUE_SCAN_TYPE_audio, Common.VALUE_SCAN_TYPE_deleted_audio, VALUE_SCAN_TYPE_documents, VALUE_SCAN_TYPE_deleted_documents -> { LinearLayoutManager(context) } + else -> { GridLayoutManager(context, mColumns) } @@ -125,17 +126,17 @@ class PhotoDisplayDateAdapter( } } - object ItemDiffCallback : DiffUtil.ItemCallback>>() { + object ItemDiffCallback : DiffUtil.ItemCallback>>() { override fun areItemsTheSame( - oldItem: Pair>, - newItem: Pair> + oldItem: Pair>, + newItem: Pair> ): Boolean { return oldItem.first == newItem.first } override fun areContentsTheSame( - oldItem: Pair>, - newItem: Pair> + oldItem: Pair>, + newItem: Pair> ): Boolean { return oldItem == newItem } diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateChildAdapter.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoDisplayDateChildAdapter.kt similarity index 65% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateChildAdapter.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoDisplayDateChildAdapter.kt index b703131..bf3b4fe 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateChildAdapter.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoDisplayDateChildAdapter.kt @@ -1,4 +1,4 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import android.content.Context import android.graphics.drawable.Drawable @@ -7,7 +7,6 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.RelativeLayout -import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource @@ -22,7 +21,9 @@ import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.NewBaseAdapter import com.ux.video.file.filerecovery.databinding.FileSpanCountThreeAdapterBinding import com.ux.video.file.filerecovery.databinding.FileSpanCountTwoAdapterBinding -import com.ux.video.file.filerecovery.databinding.OneAudioDocumentsItemBinding +import com.ux.video.file.filerecovery.databinding.OneAudioItemBinding +import com.ux.video.file.filerecovery.databinding.OneDocumentsItemBinding +import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.CustomTextView import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx @@ -40,23 +41,25 @@ class PhotoDisplayDateChildAdapter( * @param addOrRemove 选中还是取消选中 * @param dateAllSelected 这组数据是否全部选中(某一天) */ - var onSelectedUpdate: (resultPhotosFiles: ResultPhotosFiles, addOrRemove: Boolean, dateAllSelected: Boolean) -> Unit, + var onSelectedUpdate: (resultDataFiles: ResultDataFiles, addOrRemove: Boolean, dateAllSelected: Boolean) -> Unit, var hideThumbnailsUpdate: (dateAllSelected: Boolean) -> Unit, - var clickItem: (item: ResultPhotosFiles) -> Unit + var clickItem: (item: ResultDataFiles) -> Unit ) : - NewBaseAdapter(mContext) { + NewBaseAdapter(mContext) { //日期组某一天的数据选择状态维护 - val dateSelectedMap = mutableSetOf() + val dateSelectedMap = mutableSetOf() companion object { - //音频或者文档 - private const val TYPE_ONE = 1 + //视频和图片支持布局切换 2/3/4列 private const val TYPE_TWO = 2 private const val TYPE_THREE = 3 private const val TYPE_FOUR = 4 + + private const val TYPE_AUDIO = 5 + private const val TYPE_DOCUMENTS = 6 } fun setAllSelected(isAdd: Boolean) { @@ -69,7 +72,11 @@ class PhotoDisplayDateChildAdapter( override fun getItemViewType(position: Int): Int { when (scanType) { Common.VALUE_SCAN_TYPE_audio, Common.VALUE_SCAN_TYPE_deleted_audio -> { - return TYPE_ONE + return TYPE_AUDIO + } + + Common.VALUE_SCAN_TYPE_documents, Common.VALUE_SCAN_TYPE_deleted_documents -> { + return TYPE_DOCUMENTS } else -> { @@ -110,8 +117,16 @@ class PhotoDisplayDateChildAdapter( ): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) return when (viewType) { - TYPE_ONE -> OneHolder( - OneAudioDocumentsItemBinding.inflate( + TYPE_AUDIO -> AudioHolder( + OneAudioItemBinding.inflate( + inflater, + parent, + false + ) + ) + + TYPE_DOCUMENTS -> DocumentsHolder( + OneDocumentsItemBinding.inflate( inflater, parent, false @@ -139,32 +154,36 @@ class PhotoDisplayDateChildAdapter( override fun onBind( holder: RecyclerView.ViewHolder, - item: ResultPhotosFiles, + item: ResultDataFiles, viewType: Int ) { when (holder) { is TwoHolder -> holder.vb.run { initDateView(rootLayout, imageSelect, textSize, imageThumbnail, item, imageType) } + is ThreeHolder -> holder.vb.run { initDateView(rootLayout, imageSelect, textSize, imageThumbnail, item, imageType) } - is OneHolder -> { + + is AudioHolder -> { item.run { holder.vb.let { it.textName.text = name it.textDuration.text = Common.formatDuration(duration) it.textSize.text = sizeString - viewModel.checkIsSelect(this).let { isSelected -> - it.imageSelect.isSelected = isSelected - addOrRemove(this, isSelected) - } - it.imageSelect.setOnClickListener { - it.isSelected = !it.isSelected - it.isSelected.let { newStatus -> - addOrRemove(this, newStatus) - } - } + + initAudioDocuments(it.imageSelect,this) +// viewModel.checkIsSelect(this).let { isSelected -> +// it.imageSelect.isSelected = isSelected +// addOrRemove(this, isSelected) +// } +// it.imageSelect.setOnClickListener { +// it.isSelected = !it.isSelected +// it.isSelected.let { newStatus -> +// addOrRemove(this, newStatus) +// } +// } it.constraintLayout.setOnClickListener { clickItem(this) } @@ -172,6 +191,28 @@ class PhotoDisplayDateChildAdapter( } } } + + is DocumentsHolder -> { + item.run { + holder.vb.let { + it.textName.text = name + it.textDate.text = Common.getItemMonthDay(lastModified) + it.textSize.text = sizeString + targetFile?.let { file-> + it.imageIcon.setImageResource(Common.getFileIconRes(file)) + } + + initAudioDocuments(it.imageSelect,this) + + it.constraintLayout.setOnClickListener { + clickItem(this) + } + } + + + } + + } } } @@ -182,29 +223,45 @@ class PhotoDisplayDateChildAdapter( class TwoHolder(val vb: FileSpanCountTwoAdapterBinding) : RecyclerView.ViewHolder(vb.root) - class OneHolder(val vb: OneAudioDocumentsItemBinding) : + class AudioHolder(val vb: OneAudioItemBinding) : RecyclerView.ViewHolder(vb.root) + class DocumentsHolder(val vb: OneDocumentsItemBinding) : + RecyclerView.ViewHolder(vb.root) + + + private fun initAudioDocuments(imageSelect: ImageView,item: ResultDataFiles){ + viewModel.checkIsSelect(item).let { isSelected -> + imageSelect.isSelected = isSelected + addOrRemove(item, isSelected) + } + imageSelect.setOnClickListener { + it.isSelected = !it.isSelected + it.isSelected.let { newStatus -> + addOrRemove(item, newStatus) + } + } + } private fun initDateView( rootLayout: RelativeLayout, imageSelectStatus: ImageView, textSize: CustomTextView, imageThumbnail: ImageView, - item: ResultPhotosFiles, + item: ResultDataFiles, imageType: ImageView ) { item.run { - - viewModel.checkIsSelect(this).let { - imageSelectStatus.isSelected = it - addOrRemove(this, it) - } - imageSelectStatus.setOnClickListener { - it.isSelected = !it.isSelected - it.isSelected.let { newStatus -> - addOrRemove(this, newStatus) - } - } + initAudioDocuments(imageSelectStatus,this) +// viewModel.checkIsSelect(this).let { +// imageSelectStatus.isSelected = it +// addOrRemove(this, it) +// } +// imageSelectStatus.setOnClickListener { +// it.isSelected = !it.isSelected +// it.isSelected.let { newStatus -> +// addOrRemove(this, newStatus) +// } +// } textSize.text = sizeString imageType.setImageResource( @@ -254,13 +311,13 @@ class PhotoDisplayDateChildAdapter( } - private fun addOrRemove(resultPhotosFiles: ResultPhotosFiles, boolean: Boolean) { + private fun addOrRemove(resultDataFiles: ResultDataFiles, boolean: Boolean) { if (boolean) { - dateSelectedMap.add(resultPhotosFiles) + dateSelectedMap.add(resultDataFiles) } else { - dateSelectedMap.remove(resultPhotosFiles) + dateSelectedMap.remove(resultDataFiles) } - onSelectedUpdate.invoke(resultPhotosFiles, boolean, dateSelectedMap.size == data.size) + onSelectedUpdate.invoke(resultDataFiles, boolean, dateSelectedMap.size == data.size) } diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoInfoActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoInfoActivity.kt similarity index 87% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoInfoActivity.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoInfoActivity.kt index 96f46eb..8dc9506 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoInfoActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoInfoActivity.kt @@ -1,17 +1,13 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import android.content.Intent import android.graphics.drawable.Drawable -import android.net.Uri import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup import android.widget.ImageView import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope -import androidx.media3.common.MediaItem -import androidx.media3.common.Player -import androidx.media3.exoplayer.ExoPlayer import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException @@ -23,6 +19,7 @@ import com.bumptech.glide.request.target.Target import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.BaseActivity import com.ux.video.file.filerecovery.databinding.ActivityPhotoInfoBinding +import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.success.RecoverySuccessActivity import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.Common.KEY_SCAN_TYPE @@ -46,15 +43,15 @@ class PhotoInfoActivity : BaseActivity() { } private var scanType: Int = VALUE_SCAN_TYPE_photo - private var myData: ResultPhotosFiles? = null - private lateinit var player: ExoPlayer + private var myData: ResultDataFiles? = null + override fun inflateBinding(inflater: LayoutInflater): ActivityPhotoInfoBinding = ActivityPhotoInfoBinding.inflate(inflater) override fun initView() { super.initView() myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - intent.getParcelableExtra(KEY_CLICK_ITEM, ResultPhotosFiles::class.java) + intent.getParcelableExtra(KEY_CLICK_ITEM, ResultDataFiles::class.java) } else { @Suppress("DEPRECATION") intent.getParcelableExtra(KEY_CLICK_ITEM) @@ -77,6 +74,9 @@ class PhotoInfoActivity : BaseActivity() { tvDate.text = Common.getFormatDate(resultPhotosFiles.lastModified) tvResolution.text = resultPhotosFiles.resolution tvDuration.text = Common.formatDuration(resultPhotosFiles.duration) + resultPhotosFiles.targetFile?.let { + tvType.text = Common.getMimeTypeParts(it) + } layoutBottom.tvLeft.run { text = resources.getString(R.string.delete) setOnClickListener { @@ -161,14 +161,8 @@ class PhotoInfoActivity : BaseActivity() { layoutSeekbar.isVisible = true imPlay.isVisible = true frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8) - image.setImageResource(R.drawable.image_info_music) - val params = image.layoutParams ?: ViewGroup.LayoutParams( - 180.dpToPx(this@PhotoInfoActivity), - 180.dpToPx(this@PhotoInfoActivity) - ) - params.width = 180.dpToPx(this@PhotoInfoActivity) - params.height = 180.dpToPx(this@PhotoInfoActivity) - image.layoutParams = params + + loadCenterImage(image,R.drawable.image_info_music) initPlayAudio() layoutResolution.isVisible = false @@ -182,15 +176,29 @@ class PhotoInfoActivity : BaseActivity() { layoutSize.isVisible = true layoutDate.isVisible = true - layoutDuration.isVisible = false + frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8) + myData?.targetFile?.let { + loadCenterImage(image, Common.getFileIconRes(it)) + } + imPlay.isVisible = false + layoutSeekbar.isVisible = false + layoutResolution.isVisible = false layoutDuration.isVisible = false } } - } - } + private fun loadCenterImage(image: ImageView,drawableId: Int){ + image.setImageResource(drawableId) + val params = image.layoutParams ?: ViewGroup.LayoutParams( + 180.dpToPx(this@PhotoInfoActivity), + 180.dpToPx(this@PhotoInfoActivity) + ) + params.width = 180.dpToPx(this@PhotoInfoActivity) + params.height = 180.dpToPx(this@PhotoInfoActivity) + image.layoutParams = params + } private fun loadImage(image: ImageView,file: File){ Glide.with(this@PhotoInfoActivity) .load(file) diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoSortingActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoSortingActivity.kt similarity index 96% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoSortingActivity.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoSortingActivity.kt index 9e27c9a..60eee68 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoSortingActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/PhotoSortingActivity.kt @@ -1,4 +1,4 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import android.content.Intent import android.text.Editable @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.BaseActivity import com.ux.video.file.filerecovery.databinding.ActivityPhotoSortingBinding +import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.success.RecoverySuccessActivity import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.Common.KEY_SCAN_TYPE @@ -97,21 +98,21 @@ class PhotoSortingActivity : BaseActivity() { private var filterLayoutPopupWindows: FilterPopupWindows? = null - private lateinit var sortBySizeBigToSmall: List - private lateinit var sortBySizeSmallToBig: List - private lateinit var sortByDateReverse: List>> - private lateinit var sortedByDatePositive: List>> + private lateinit var sortBySizeBigToSmall: List + private lateinit var sortBySizeSmallToBig: List + private lateinit var sortByDateReverse: List>> + private lateinit var sortedByDatePositive: List>> //最新显示的数据集合(包含缩略图 ,只保存当前筛选后或者排序后显示的数据,不受switch切换影响) - private var currentDateList: List>>? = null - private var currentSizeList: List? = null + private var currentDateList: List>>? = null + private var currentSizeList: List? = null //选中的所有数据集合(实际选中) - private lateinit var allSelectedSetList: Set + private lateinit var allSelectedSetList: Set //选中的所有数据集合(筛选后的数据实际显示的所有选中) - private lateinit var filterSelectedSetList: Set + private lateinit var filterSelectedSetList: Set private lateinit var mItemDecoration: GridSpacingItemDecoration @@ -125,7 +126,7 @@ class PhotoSortingActivity : BaseActivity() { override fun initData() { super.initData() scanType = intent.getIntExtra(KEY_SCAN_TYPE, VALUE_SCAN_TYPE_photo) - val list: ArrayList? = + val list: ArrayList? = intent.getParcelableArrayListExtraCompat(KEY_PHOTO_FOLDER_FILE) mItemDecoration = GridSpacingItemDecoration(columns, Common.itemSpacing, Common.horizontalSpacing) @@ -338,7 +339,7 @@ class PhotoSortingActivity : BaseActivity() { is PhotoDisplayDateAdapter -> { dateAdapter?.setAllSelected(it.isSelected) dateAdapter?.getCurrentData()?.let { - it as List>> + it as List>> if (it.size > 0) Common.showLog("------------全选按钮 日期-${it.size} ${it[0].second[0].path}") } @@ -348,7 +349,7 @@ class PhotoSortingActivity : BaseActivity() { is PhotoDisplayDateChildAdapter -> { sizeSortAdapter?.setAllSelected(it.isSelected) sizeSortAdapter?.getCurrentData()?.let { - it as List + it as List if (it.size > 0) Common.showLog("------------全选按钮 大小-${it.size} ${it[0].path}") } @@ -437,12 +438,12 @@ class PhotoSortingActivity : BaseActivity() { } - private fun initGetCurrentSizeList(): List { + private fun initGetCurrentSizeList(): List { currentSizeList = currentSizeList ?: currentDateList?.flatMap { it.second } return currentSizeList!! } - private fun resetCurrentSizeList(currentList: List) { + private fun resetCurrentSizeList(currentList: List) { currentSizeList = currentList currentDateList = null @@ -451,12 +452,12 @@ class PhotoSortingActivity : BaseActivity() { } - private fun initGetCurrentDateList(): List>> { + private fun initGetCurrentDateList(): List>> { currentDateList = currentDateList ?: Common.getSortByDayNewToOldInit(currentSizeList!!) return currentDateList!! } - private fun resetCurrentDateList(currentList: List>>) { + private fun resetCurrentDateList(currentList: List>>) { currentDateList = currentList currentSizeList = null val totalSelectedCount = currentList.sumOf { pair -> @@ -484,7 +485,7 @@ class PhotoSortingActivity : BaseActivity() { val aPx = 16.dpToPx(context) val bottom = 70.dpToPx(context) when (scanType) { - VALUE_SCAN_TYPE_audio, VALUE_SCAN_TYPE_deleted_audio -> { + VALUE_SCAN_TYPE_audio, VALUE_SCAN_TYPE_deleted_audio,VALUE_SCAN_TYPE_documents, VALUE_SCAN_TYPE_deleted_documents -> { layoutManager = LinearLayoutManager(context) setPadding(aPx, 0, 0, bottom) } @@ -713,8 +714,8 @@ class PhotoSortingActivity : BaseActivity() { * 数据筛选或者缩略图切换显示后,对比刷新实际显示的选中数据 */ private fun checkRefreshDisPlaySelected( - list1: List>>? = null, - list2: List? = null + list1: List>>? = null, + list2: List? = null ) { lifecycleScope.launch { list1?.let { @@ -887,13 +888,13 @@ class PhotoSortingActivity : BaseActivity() { //选中集合的更新 viewModel.afterDeleted() deferredResults["sizeList"]?.let { list -> - list as List + list as List Common.showLog("---------更新 sizeList = ${list.size}") sizeSortAdapter?.setData(list) resetCurrentSizeList(list) } deferredResults["dateList"]?.let { list -> - list as List>> + list as List>> Common.showLog("---------更新 dateList = ${list.size}") dateAdapter?.setData(list) resetCurrentDateList(list) @@ -932,13 +933,13 @@ class PhotoSortingActivity : BaseActivity() { //选中集合的更新 viewModel.afterSingleDeleted(deletedData) deferredResults["sizeList"]?.let { list -> - list as List + list as List Common.showLog("---------更新 sizeList = ${list.size}") sizeSortAdapter?.setData(list) resetCurrentSizeList(list) } deferredResults["dateList"]?.let { list -> - list as List>> + list as List>> Common.showLog("---------更新 dateList = ${list.size}") dateAdapter?.setData(list) resetCurrentDateList(list) diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/RecoverOrDeleteManager.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/RecoverOrDeleteManager.kt similarity index 71% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/RecoverOrDeleteManager.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/RecoverOrDeleteManager.kt index 579f545..b1873cf 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/RecoverOrDeleteManager.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/RecoverOrDeleteManager.kt @@ -1,9 +1,9 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort -import android.app.Activity import androidx.fragment.app.FragmentManager +import com.ux.video.file.filerecovery.db.ObjectBoxManager +import com.ux.video.file.filerecovery.db.ResultDataFiles -import androidx.lifecycle.lifecycleScope import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.ScanManager import com.ux.video.file.filerecovery.utils.ScanManager.copySelectedFilesAsync @@ -18,9 +18,9 @@ object RecoverOrDeleteManager { private var dialogConfirmDelete: ConfirmDeleteDialogFragment? = null //详情页面进行删除操作的监听 - private var onSingleDeletedCompleteListener: ((ResultPhotosFiles) -> Unit)? = null + private var onSingleDeletedCompleteListener: ((ResultDataFiles) -> Unit)? = null - fun setOnSingleDeleteCompleteListener(listener: (ResultPhotosFiles) -> Unit) { + fun setOnSingleDeleteCompleteListener(listener: (ResultDataFiles) -> Unit) { onSingleDeletedCompleteListener = listener } @@ -31,21 +31,10 @@ object RecoverOrDeleteManager { fun showRecoveringDialog( fragmentManager: FragmentManager, scope: CoroutineScope, - selectedSetList: Set, + selectedSetList: Set, onComplete: (number: Int) -> Unit ) { - scope.copySelectedFilesAsync( - selectedSet = selectedSetList, - folder = Common.recoveryPhotoDir, - onProgress = { currentCounts: Int, fileName: String, success: Boolean -> - ScanManager.showLog("--------恢复图片 ", "----------${currentCounts} ${fileName}") - dialogRecovering?.updateProgress(currentCounts) - }) { counts -> - dialogRecovering?.updateProgress(counts) - ScanManager.showLog("--------恢复图片 ", "----------恢复完成 ${counts}") - - } dialogRecovering = dialogRecovering ?: RecoveringDialogFragment() dialogRecovering?.run { total = selectedSetList.size @@ -55,6 +44,21 @@ object RecoverOrDeleteManager { } show(fragmentManager, "") } + scope.copySelectedFilesAsync( + selectedSet = selectedSetList, + folder = Common.recoveryPhotoDir, + onProgress = { currentCounts: Int, data: ResultDataFiles, fileName: String, success: Boolean -> + if(success){ + ScanManager.showLog("--------恢复图片 ", "----------${currentCounts} ${fileName}") + dialogRecovering?.updateProgress(currentCounts) + ObjectBoxManager.addRecoveryFile(data) + } + + }) { counts -> + dialogRecovering?.updateProgress(counts) + ScanManager.showLog("--------恢复图片 ", "----------恢复完成 ${counts}") + + } } /** @@ -64,7 +68,7 @@ object RecoverOrDeleteManager { isInfoDelete: Boolean = false, fragmentManager: FragmentManager, scope: CoroutineScope, - selectedSetList: Set, + selectedSetList: Set, onComplete: (number: Int) -> Unit ) { dialogConfirmDelete = dialogConfirmDelete ?: ConfirmDeleteDialogFragment() @@ -86,18 +90,10 @@ object RecoverOrDeleteManager { isInfoDelete: Boolean = false, fragmentManager: FragmentManager, scope: CoroutineScope, - selectedSetList: Set, + selectedSetList: Set, onComplete: (number: Int) -> Unit ) { - scope.deleteFilesAsync( - selectedSet = selectedSetList, - onProgress = { currentCounts: Int, path: String, success: Boolean -> - ScanManager.showLog("--------删除图片 ", "----------${currentCounts} ${path}") - dialogDeleting?.updateProgress(currentCounts) - }) { counts -> - dialogDeleting?.updateProgress(counts) - ScanManager.showLog("--------恢复图片 ", "----------恢复完成 ${counts}") - } + dialogDeleting = dialogDeleting ?: DeletingDialogFragment() dialogDeleting?.run { total = selectedSetList.size @@ -110,5 +106,18 @@ object RecoverOrDeleteManager { } show(fragmentManager, "") } + scope.deleteFilesAsync( + selectedSet = selectedSetList, + onProgress = { currentCounts: Int, data: ResultDataFiles, path: String, success: Boolean -> + if (success){ + ScanManager.showLog("--------删除图片 ", "----------${currentCounts} ${path}") + dialogDeleting?.updateProgress(currentCounts) + ObjectBoxManager.deleteRecoveryFile(data) + } + + }) { counts -> + dialogDeleting?.updateProgress(counts) + ScanManager.showLog("--------恢复图片 ", "----------恢复完成 ${counts}") + } } } \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/RecoveringDialogFragment.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/RecoveringDialogFragment.kt similarity index 93% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/RecoveringDialogFragment.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/RecoveringDialogFragment.kt index 1a7ea4f..1b8a1ba 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/RecoveringDialogFragment.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/RecoveringDialogFragment.kt @@ -1,4 +1,4 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.BaseIngDialogFragment diff --git a/app/src/main/java/com/ux/video/file/filerecovery/photo/SortDialogFragment.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/SortDialogFragment.kt similarity index 98% rename from app/src/main/java/com/ux/video/file/filerecovery/photo/SortDialogFragment.kt rename to app/src/main/java/com/ux/video/file/filerecovery/sort/SortDialogFragment.kt index 14dabe3..72f5009 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/SortDialogFragment.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/SortDialogFragment.kt @@ -1,4 +1,4 @@ -package com.ux.video.file.filerecovery.photo +package com.ux.video.file.filerecovery.sort import android.graphics.Color import android.os.Bundle diff --git a/app/src/main/java/com/ux/video/file/filerecovery/utils/Common.kt b/app/src/main/java/com/ux/video/file/filerecovery/utils/Common.kt index 60e2243..80ea31a 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/utils/Common.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/utils/Common.kt @@ -9,14 +9,13 @@ import android.os.Environment import android.util.Log import android.view.View import android.view.ViewGroup +import android.webkit.MimeTypeMap import androidx.core.content.ContextCompat -import androidx.lifecycle.MutableLiveData -import com.ux.video.file.filerecovery.App import com.ux.video.file.filerecovery.R -import com.ux.video.file.filerecovery.photo.ResultPhotosFiles -import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx +import com.ux.video.file.filerecovery.db.ResultDataFiles import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import java.io.File import java.util.Date import java.util.Locale import kotlin.collections.sortedBy @@ -40,24 +39,25 @@ object Common { val rootDir = Environment.getExternalStorageDirectory() val dateFormat = SimpleDateFormat("MMMM d,yyyy", Locale.ENGLISH) val chineseFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINESE) + val itemDateFormat = SimpleDateFormat("MM-dd", Locale.CHINESE) val recoveryPhotoDir = "MyAllRecovery/Photo" /** * 默认按照日期分类,将最新的排前面 降序 */ - fun getSortByDayNewToOldInit(list: List): List>> { + fun getSortByDayNewToOldInit(list: List): List>> { val grouped = list.groupBy { dateFormat.format(Date(it.lastModified)) } - val parentData: List>> = grouped + val parentData: List>> = grouped .map { it.key to it.value } .sortedByDescending { dateFormat.parse(it.first)?.time ?: 0L } return parentData } fun getSortByDayNewToOld( - list: List>> - ): List>> { + list: List>> + ): List>> { return list.sortedByDescending { pair -> dateFormat.parse(pair.first)?.time ?: 0L } @@ -68,28 +68,28 @@ object Common { * 按照日期排序, 时间最早的排前面 升序 * */ - fun getSortByDayOldToNew(list: List>>) = + fun getSortByDayOldToNew(list: List>>) = list.sortedBy { dateFormat.parse(it.first)?.time ?: 0L } /** * 按照文件大小排序,将最大的排前面 降序 */ - fun getSortBySizeBigToSmall(list: List) = list.sortedByDescending { + fun getSortBySizeBigToSmall(list: List) = list.sortedByDescending { it.size } /** * 按照文件大小排序,将最小的排前面 升序 */ - fun getSortBySizeSmallToBig(list: List) = list.sortedBy { + fun getSortBySizeSmallToBig(list: List) = list.sortedBy { it.size } fun searchByName( - data: List>>, + data: List>>, keyword: String - ): List>> { + ): List>> { if (keyword.isBlank()) return data return data.mapNotNull { (key, files) -> @@ -98,9 +98,9 @@ object Common { } } fun searchByNameList( - list: List, + list: List, keyword: String - ): List { + ): List { if (keyword.isBlank()) return list return list.filter { it.name.contains(keyword, ignoreCase = true) } } @@ -135,8 +135,8 @@ object Common { * @param months 筛选months月之内的数据 */ fun filterWithinOneMonthByDay( - grouped: List>>, months: Int - ): List>> { + grouped: List>>, months: Int + ): List>> { val today = Calendar.getInstance() val oneMonthAgo = Calendar.getInstance().apply { add(Calendar.MONTH, -months) // 1 个月前 @@ -151,7 +151,7 @@ object Common { /** * @param months 筛选months月之内的数据 */ - fun filterWithinOneMonth(list: List, months: Int): List { + fun filterWithinOneMonth(list: List, months: Int): List { val today = Calendar.getInstance() val oneMonthAgo = Calendar.getInstance().apply { add(Calendar.MONTH, -months) @@ -184,10 +184,10 @@ object Common { * @return 显示的选中数量和选中集合 */ fun checkSelectListContainDate( - list: List>>, - selected: Set - ): Pair> { - val currentSelected = mutableSetOf() + list: List>>, + selected: Set + ): Pair> { + val currentSelected = mutableSetOf() val totalSelectedCount = list.sumOf { pair -> pair.second.count { @@ -202,10 +202,10 @@ object Common { } suspend fun checkSelectListContainDateAsync( - list: List>>, - selected: Set - ): Pair> = withContext(Dispatchers.Default) { - val currentSelected = mutableSetOf() + list: List>>, + selected: Set + ): Pair> = withContext(Dispatchers.Default) { + val currentSelected = mutableSetOf() var totalSelectedCount = 0 // 高效遍历外层 + 内层列表 @@ -238,10 +238,10 @@ object Common { suspend fun checkSelectListContainSize( - list: List, - selected: Set - ): Pair> = withContext(Dispatchers.Default) { - val currentSelected = mutableSetOf() + list: List, + selected: Set + ): Pair> = withContext(Dispatchers.Default) { + val currentSelected = mutableSetOf() var totalSelectedCount = 0 // 高效遍历外层 + 内层列表 @@ -259,8 +259,8 @@ object Common { * 去掉缩略图的集合 */ suspend fun filterThumbnailsAsync( - originalList: MutableList>> - ): List>> = withContext(Dispatchers.Default) { + originalList: MutableList>> + ): List>> = withContext(Dispatchers.Default) { originalList.asSequence() .map { (key, files) -> key to files.asSequence().filter { !it.isThumbnail }.toList() @@ -271,9 +271,9 @@ object Common { fun removeSelectedFromList( - list: List>>, - selectedLiveData: Set - ): List>> { + list: List>>, + selectedLiveData: Set + ): List>> { return list.mapNotNull { (key, files) -> val filtered = files.filterNot { it in selectedLiveData } if (filtered.isNotEmpty()) key to filtered else null @@ -281,9 +281,9 @@ object Common { } fun removeSelectedFromSizeList( - list: List, - selectedLiveData: Set - ): List { + list: List, + selectedLiveData: Set + ): List { return list.filterNot { it in selectedLiveData } } @@ -304,6 +304,7 @@ object Common { } + @SuppressLint("DefaultLocale") fun formatDuration(ms: Long): String { val totalSeconds = ms / 1000 val hours = totalSeconds / 3600 @@ -316,11 +317,66 @@ object Common { String.format("%02d:%02d", minutes, seconds) } } + fun getFileMIME(file: File): String { + val ext = file.extension.lowercase() + val mimeTypeFromExtension = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext) + val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext) ?: return "unknown" + return mime + return when { + mime.startsWith("image/") -> "image" + mime.startsWith("video/") -> "video" + mime.startsWith("audio/") -> "audio" + mime.startsWith("text/") -> "document" + mime == "application/pdf" -> "document" + mime.startsWith("application/vnd.openxmlformats") -> "document" + mime.startsWith("application/ms") -> "document" + mime == "application/zip" || + mime == "application/x-rar-compressed" || + mime == "application/x-7z-compressed" -> "archive" + else -> "other" + } + } + + val customMimeMap = mapOf( + "xapk" to "application/zip", + // 可以继续添加其他自定义扩展名 + ) + fun getMimeTypeParts(file: File): String { + val extension = file.extension.lowercase() + val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)?:customMimeMap[extension] + showLog("-----------ext=$extension mimeType=${mimeType}") + return if (mimeType != null && mimeType.contains("/")) { + val parts = mimeType.split("/") + val mainType = parts[0] + val subType = parts.getOrNull(1) + "$mainType/$subType" + } else { + "unknown" + } + + } + + fun getFileIconRes(file: File): Int { + val ext = file.extension.lowercase() + + return when (ext) { + "doc", "docx" -> R.drawable.icon_doc + "xls", "xlsx" -> R.drawable.icon_xls + "ppt", "pptx" -> R.drawable.icon_ppt + "pdf" -> R.drawable.icon_pdf + "txt" -> R.drawable.icon_txt + "apk", "xapk" -> R.drawable.icon_apk + else -> R.drawable.icon_unknow + } + } fun getFormatDate(time: Long): String { return dateFormat.format(Date(time)) } + fun getItemMonthDay(time: Long): String{ + return itemDateFormat.format(time) + } fun getChineseFormatDate(date: Date): String { return chineseFormat.format(date) diff --git a/app/src/main/java/com/ux/video/file/filerecovery/utils/ExtendFunctions.kt b/app/src/main/java/com/ux/video/file/filerecovery/utils/ExtendFunctions.kt index 5a60590..1a16505 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/utils/ExtendFunctions.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/utils/ExtendFunctions.kt @@ -7,7 +7,7 @@ import android.os.Build import android.os.Parcelable import android.util.TypedValue import androidx.recyclerview.widget.RecyclerView -import com.ux.video.file.filerecovery.photo.ResultPhotosFiles +import com.ux.video.file.filerecovery.db.ResultDataFiles import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.util.Date @@ -40,11 +40,11 @@ object ExtendFunctions { } - fun List.filterWithinDateRangeList( + fun List.filterWithinDateRangeList( months: Int = -1, startDate: Date? = null, endDate: Date? = null - ): List { + ): List { val today = Calendar.getInstance() @@ -79,11 +79,11 @@ object ExtendFunctions { - fun List>>.filterWithinDateRange( + fun List>>.filterWithinDateRange( months: Int = -1, startDate: Date? = null, endDate: Date? = null - ): List>> { + ): List>> { val sdf = Common.dateFormat val today = Calendar.getInstance() @@ -118,10 +118,10 @@ object ExtendFunctions { /** * 按文件大小筛选:区间 [minSize, maxSize] */ - fun List.filterBySizeList( + fun List.filterBySizeList( minSize: Long, maxSize: Long - ): List { + ): List { if (minSize == -1L) return this return this.filter { it.size in minSize..maxSize } } @@ -129,10 +129,10 @@ object ExtendFunctions { /** * 按文件大小筛选:区间 [minSize, maxSize] */ - fun List.filterByDurationList( + fun List.filterByDurationList( minSize: Long, maxSize: Long - ): List { + ): List { if (minSize == -1L) return this return this.filter { it.duration in minSize..maxSize } } @@ -140,10 +140,10 @@ object ExtendFunctions { /** * 分组数据:按大小筛选 ,图片和文件筛选文件大小 */ - fun List>>.filterBySize( + fun List>>.filterBySize( minSize: Long, maxSize: Long - ): List>> { + ): List>> { if (minSize == -1L) return this return this.mapNotNull { (date, files) -> val filtered = files.filter { it.size in minSize..maxSize } @@ -154,10 +154,10 @@ object ExtendFunctions { /** * 分组数据:按大小筛选 ,音视频筛选时长 */ - fun List>>.filterByDuration( + fun List>>.filterByDuration( minSize: Long, maxSize: Long - ): List>> { + ): List>> { if (minSize == -1L) return this return this.mapNotNull { (date, files) -> val filtered = files.filter { it.duration in minSize..maxSize } @@ -181,7 +181,7 @@ object ExtendFunctions { /** * 移除掉缩略图后的数据 */ - suspend fun List>>.filterThumbnailsAsync(): List>> = + suspend fun List>>.filterThumbnailsAsync(): List>> = withContext(Dispatchers.Default) { this@filterThumbnailsAsync.asSequence() .mapNotNull { (key, files) -> @@ -195,7 +195,7 @@ object ExtendFunctions { /** * 移除掉缩略图后的数据 */ - suspend fun List.filterRemoveThumbnailsAsync(): List = + suspend fun List.filterRemoveThumbnailsAsync(): List = withContext(Dispatchers.Default) { this@filterRemoveThumbnailsAsync.asSequence() .filter { !it.isThumbnail } // 去掉 isThumbnail = true 的项 @@ -203,9 +203,9 @@ object ExtendFunctions { } - fun List>>.removeItem( - target: ResultPhotosFiles - ): List>> { + fun List>>.removeItem( + target: ResultDataFiles + ): List>> { return this.mapNotNull { (key, files) -> val updatedFiles = files.filterNot { it == target } if (updatedFiles.isNotEmpty()) key to updatedFiles else null diff --git a/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanManager.kt b/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanManager.kt index 8e7dc8b..bd4c1f9 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanManager.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanManager.kt @@ -5,14 +5,11 @@ import android.content.Context import android.graphics.BitmapFactory import android.media.MediaMetadataRetriever import android.net.Uri -import android.os.Build -import android.os.Environment import android.provider.OpenableColumns +import android.text.format.Formatter import android.util.Log -import androidx.annotation.RequiresApi -import com.ux.video.file.filerecovery.photo.ResultPhotos -import com.ux.video.file.filerecovery.photo.ResultPhotosFiles -import com.ux.video.file.filerecovery.result.ScanningActivity +import com.ux.video.file.filerecovery.db.ResultData +import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_audio import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_deleted_audio import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_deleted_documents @@ -27,7 +24,6 @@ import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File @@ -108,20 +104,21 @@ object ScanManager { scanDocuments(root, depth = 0) val map = result.map { (dir, files) -> - val resultPhotosFilesList = files.map { file -> - ResultPhotosFiles( + val resultDataFilesList = files.map { file -> + ResultDataFiles( name = file.name, path = file.absolutePath, size = file.length(), - sizeString = android.text.format.Formatter.formatFileSize( + sizeString = Formatter.formatFileSize( context, file.length() ), lastModified = file.lastModified(), - resolution = getResolution(type,file) + resolution = getResolution(type,file), + fileType = getFileType(type) ) } - ResultPhotos(dir, ArrayList(resultPhotosFilesList)) + ResultData(dir, ArrayList(resultDataFilesList)) } emit(ScanState.Complete(ArrayList(map))) } @@ -168,7 +165,7 @@ object ScanManager { val result = mutableMapOf>() var fileCount = 0 - @RequiresApi(Build.VERSION_CODES.R) + suspend fun scanDir(dir: File, depth: Int, insideHidden: Boolean = false) { if (!dir.exists() || !dir.isDirectory) return if (depth > maxDepth || fileCount >= maxFiles) return @@ -211,28 +208,40 @@ object ScanManager { } } scanDir(root, depth = 0) - ScanManager.showLog("HiddenScan", " 3333") val map = result.map { (dir, files) -> - val resultPhotosFilesList = files.map { file -> - ResultPhotosFiles( + val resultDataFilesList = files.map { file -> + ResultDataFiles( name = file.name, path = file.absolutePath, size = file.length(), - sizeString = android.text.format.Formatter.formatFileSize( + sizeString = Formatter.formatFileSize( context, file.length() ), lastModified = file.lastModified(), - resolution = getResolution(type,file) + resolution = getResolution(type,file), + fileType = getFileType(type) ) } - ResultPhotos(dir, ArrayList(resultPhotosFilesList)) + ResultData(dir, ArrayList(resultDataFilesList)) } emit(ScanState.Complete(ArrayList(map))) } + + private fun getFileType(scanType: Int): Int { + return when (scanType) { + VALUE_SCAN_TYPE_deleted_photo -> 0 + + VALUE_SCAN_TYPE_deleted_video -> 1 + + VALUE_SCAN_TYPE_deleted_audio -> 2 + + else -> 3 + } + } private fun getFileSizeByMediaStore(context: Context, file: File): Long { val uri = Uri.fromFile(file) context.contentResolver.query(uri, arrayOf(OpenableColumns.SIZE), null, null, null) @@ -291,13 +300,14 @@ object ScanManager { * @param folder "AllRecovery/Photo" */ fun CoroutineScope.copySelectedFilesAsync( - selectedSet: Set, + selectedSet: Set, rootDir: File = Common.rootDir, folder: String, - onProgress: (currentCounts: Int, fileName: String, success: Boolean) -> Unit, + onProgress: (currentCounts: Int, data:ResultDataFiles,fileName: String, success: Boolean) -> Unit, onComplete: (currentCounts: Int) -> Unit ) { launch(Dispatchers.IO) { + var recoveryCount = 0 val targetDir = File(rootDir, folder) if (!targetDir.exists()) targetDir.mkdirs() selectedSet.forEachIndexed { index, resultPhotosFiles -> @@ -312,17 +322,19 @@ object ScanManager { } } success = true + recoveryCount++ + withContext(Dispatchers.Main) { + onProgress(index + 1,resultPhotosFiles, srcFile.name, success) + } } catch (e: Exception) { e.printStackTrace() } - withContext(Dispatchers.Main) { - onProgress(index + 1, srcFile.name, success) - } + } } withContext(Dispatchers.Main) { - onComplete(selectedSet.size) + onComplete(recoveryCount) } } } @@ -333,8 +345,8 @@ object ScanManager { * */ fun CoroutineScope.deleteFilesAsync( - selectedSet: Set, - onProgress: (currentCounts: Int, fileName: String, success: Boolean) -> Unit, + selectedSet: Set, + onProgress: (currentCounts: Int, data:ResultDataFiles,fileName: String, success: Boolean) -> Unit, onComplete: (currentCounts: Int) -> Unit ) { launch(Dispatchers.IO) { @@ -346,16 +358,20 @@ object ScanManager { deletedCount++ } withContext(Dispatchers.Main) { - onProgress(index + 1, file.name, true) + onProgress(index + 1, resultPhotosFiles,file.name, true) } } catch (e: Exception) { - onProgress(index + 1, resultPhotosFiles.path!!, false) + onProgress(index + 1,resultPhotosFiles, resultPhotosFiles.path!!, false) } } withContext(Dispatchers.Main) { - onComplete(selectedSet.size) + onComplete(deletedCount) } } } + + + + } diff --git a/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanRepository.kt b/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanRepository.kt index 6401932..d333fd2 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanRepository.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanRepository.kt @@ -1,13 +1,9 @@ package com.ux.video.file.filerecovery.utils -import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import com.ux.video.file.filerecovery.photo.ResultPhotos -import com.ux.video.file.filerecovery.photo.ResultPhotosFiles -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow +import com.ux.video.file.filerecovery.db.ResultDataFiles class ScanRepository : ViewModel() { @@ -20,17 +16,17 @@ class ScanRepository : ViewModel() { - private val _selectedLiveData = MutableLiveData>(emptySet()) - val selectedLiveData: LiveData> = _selectedLiveData + private val _selectedLiveData = MutableLiveData>(emptySet()) + val selectedLiveData: LiveData> = _selectedLiveData // 当前筛选显示的选中项 - private val _selectedDisplayLiveData = MutableLiveData>(emptySet()) - val selectedDisplayLiveData: LiveData> = _selectedDisplayLiveData + private val _selectedDisplayLiveData = MutableLiveData>(emptySet()) + val selectedDisplayLiveData: LiveData> = _selectedDisplayLiveData - fun toggleSelection(isAdd: Boolean, resultPhotosFiles: ResultPhotosFiles) { + fun toggleSelection(isAdd: Boolean, resultDataFiles: ResultDataFiles) { val current = _selectedLiveData.value?.toMutableSet() ?: mutableSetOf() val currentDisplay = _selectedDisplayLiveData.value?.toMutableSet() ?: mutableSetOf() - resultPhotosFiles.let { + resultDataFiles.let { if (isAdd) { current.add(it) currentDisplay.add(it) @@ -52,7 +48,7 @@ class ScanRepository : ViewModel() { /** * 数据筛选后或者缩略图显示开关切换后 重置当前显示的选中集合 */ - fun filterResetDisplayFlow(list: MutableSet){ + fun filterResetDisplayFlow(list: MutableSet){ _selectedDisplayLiveData.value = list.toSet() Common.showLog( "筛选后重置 _selectedDisplayFlow=${_selectedDisplayLiveData.value?.size} _selectedFlow=${_selectedLiveData.value?.size} ") @@ -75,7 +71,7 @@ class ScanRepository : ViewModel() { /** * 详情页删除完毕,移除删除掉的数据 */ - fun afterSingleDeleted(deletedItem:ResultPhotosFiles){ + fun afterSingleDeleted(deletedItem:ResultDataFiles){ val selected = _selectedLiveData.value.orEmpty().toMutableSet() val display = _selectedDisplayLiveData.value.orEmpty().toMutableSet() @@ -88,9 +84,9 @@ class ScanRepository : ViewModel() { - fun checkIsSelect(resultPhotosFiles: ResultPhotosFiles): Boolean { + fun checkIsSelect(resultDataFiles: ResultDataFiles): Boolean { val current = _selectedLiveData.value - return current?.contains(resultPhotosFiles) == true + return current?.contains(resultDataFiles) == true } diff --git a/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanState.kt b/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanState.kt index 2d792b7..c8dc346 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanState.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/utils/ScanState.kt @@ -1,9 +1,9 @@ package com.ux.video.file.filerecovery.utils -import com.ux.video.file.filerecovery.photo.ResultPhotos +import com.ux.video.file.filerecovery.db.ResultData sealed class ScanState { data class Progress(val scannedCount: Int,val filePath: String) : ScanState() - data class Complete(val result: ArrayList) : ScanState() + data class Complete(val result: ArrayList) : ScanState() } \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt index 1cf9ebc..c79ec6a 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt @@ -3,27 +3,18 @@ package com.ux.video.file.filerecovery.video import android.content.Intent import android.net.Uri import android.os.Build -import android.os.Bundle import android.os.Handler import android.os.Looper import android.view.LayoutInflater -import android.widget.SeekBar -import androidx.activity.enableEdgeToEdge -import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import androidx.media3.common.MediaItem import androidx.media3.common.Player import androidx.media3.exoplayer.ExoPlayer import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.BaseActivity -import com.ux.video.file.filerecovery.databinding.ActivityScanSelectTypeBinding import com.ux.video.file.filerecovery.databinding.ActivityVideoPlayBinding -import com.ux.video.file.filerecovery.photo.PhotoInfoActivity -import com.ux.video.file.filerecovery.photo.PhotoInfoActivity.Companion.KEY_CLICK_ITEM -import com.ux.video.file.filerecovery.photo.RecoverOrDeleteManager -import com.ux.video.file.filerecovery.photo.ResultPhotosFiles +import com.ux.video.file.filerecovery.sort.RecoverOrDeleteManager +import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.success.RecoverySuccessActivity import com.ux.video.file.filerecovery.utils.Common @@ -34,7 +25,7 @@ class VideoPlayActivity : BaseActivity() { } private lateinit var player: ExoPlayer - private var myData: ResultPhotosFiles? = null + private var myData: ResultDataFiles? = null private val updateHandler = Handler(Looper.getMainLooper()) override fun inflateBinding(inflater: LayoutInflater): ActivityVideoPlayBinding = ActivityVideoPlayBinding.inflate(inflater) @@ -48,7 +39,7 @@ class VideoPlayActivity : BaseActivity() { override fun initData() { super.initData() myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - intent.getParcelableExtra(KEY_DATA, ResultPhotosFiles::class.java) + intent.getParcelableExtra(KEY_DATA, ResultDataFiles::class.java) } else { @Suppress("DEPRECATION") intent.getParcelableExtra(KEY_DATA) diff --git a/app/src/main/res/color/selector_recovery_file_tab_layout_title.xml b/app/src/main/res/color/selector_recovery_file_tab_layout_title.xml new file mode 100644 index 0000000..c3b76b2 --- /dev/null +++ b/app/src/main/res/color/selector_recovery_file_tab_layout_title.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_apk.png b/app/src/main/res/drawable/icon_apk.png new file mode 100644 index 0000000000000000000000000000000000000000..8123e3f079958b0612b9178c9256863a2a9bc190 GIT binary patch literal 26160 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_ppt.png b/app/src/main/res/drawable/icon_ppt.png new file mode 100644 index 0000000000000000000000000000000000000000..a962032b46a6ffce6602431f861356dd7b779385 GIT binary patch literal 20853 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 WIcR=c`z#Z#;H)g{%nQsskN$tyimLDc literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_xls.png b/app/src/main/res/drawable/icon_xls.png new file mode 100644 index 0000000000000000000000000000000000000000..d53e56e2a5f1b0bb84a509b972e19a0776fefa6f GIT binary patch literal 26358 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_photo_info.xml b/app/src/main/res/layout/activity_photo_info.xml index 85094a3..6ced089 100644 --- a/app/src/main/res/layout/activity_photo_info.xml +++ b/app/src/main/res/layout/activity_photo_info.xml @@ -7,7 +7,7 @@ android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical" - tools:context=".photo.PhotoInfoActivity"> + tools:context=".sort.PhotoInfoActivity"> + tools:context=".sort.PhotoSortingActivity"> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_recovery_photo.xml b/app/src/main/res/layout/fragment_recovery_photo.xml new file mode 100644 index 0000000..f56348d --- /dev/null +++ b/app/src/main/res/layout/fragment_recovery_photo.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/one_audio_documents_item.xml b/app/src/main/res/layout/one_audio_item.xml similarity index 100% rename from app/src/main/res/layout/one_audio_documents_item.xml rename to app/src/main/res/layout/one_audio_item.xml diff --git a/app/src/main/res/layout/one_documents_item.xml b/app/src/main/res/layout/one_documents_item.xml new file mode 100644 index 0000000..8ff3843 --- /dev/null +++ b/app/src/main/res/layout/one_documents_item.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_layout_item.xml b/app/src/main/res/layout/tab_layout_item.xml new file mode 100644 index 0000000..97a87ce --- /dev/null +++ b/app/src/main/res/layout/tab_layout_item.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dfe6ec8..bfbdea8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,6 +86,8 @@ wait.. View Sorry!No %s found! Search + Recovered files + (%d) diff --git a/build.gradle.kts b/build.gradle.kts index 922f551..d3798e1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,4 +2,10 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false +} +buildscript { + + dependencies { + classpath("io.objectbox:objectbox-gradle-plugin:4.0.3") + } } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0227ce2..0d3cf20 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,6 +10,9 @@ appcompat = "1.7.1" material = "1.12.0" activity = "1.10.1" constraintlayout = "2.2.1" +lifecycleLivedataKtx = "2.9.4" +lifecycleViewmodelKtx = "2.9.4" +fragmentKtx = "1.8.9" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -22,6 +25,9 @@ androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version material = { group = "com.google.android.material", name = "material", version.ref = "material" } androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } +androidx-lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycleLivedataKtx" } +androidx-lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" } +androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragmentKtx" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }