From 063540eb587e0ced4984d4b43c59f61c76cdb6f3 Mon Sep 17 00:00:00 2001 From: litingting Date: Wed, 22 Oct 2025 18:35:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 + app/src/main/AndroidManifest.xml | 3 + .../file/filerecovery/base/BaseActivity.kt | 6 +- .../main/ScanSelectTypeActivity.kt | 4 + .../photo/DatePickerDialogFragment.kt | 3 + .../photo/PhotoDisplayDateAdapter.kt | 22 +- .../photo/PhotoDisplayDateChildAdapter.kt | 90 +++- .../filerecovery/photo/PhotoInfoActivity.kt | 129 ++++- .../photo/PhotoSortingActivity.kt | 494 +++++++++++------- .../filerecovery/photo/ResultPhotosFiles.kt | 9 +- .../result/ScanResultDisplayActivity.kt | 115 ++-- .../result/ScanResultDocumentsAdapter.kt | 65 +++ ...ltAdapter.kt => ScanResultPhotoAdapter.kt} | 3 +- .../filerecovery/result/ScanningActivity.kt | 108 ++-- .../video/file/filerecovery/utils/Common.kt | 32 ++ .../filerecovery/utils/ExtendFunctions.kt | 103 ++-- .../file/filerecovery/utils/ScanManager.kt | 60 ++- .../filerecovery/video/VideoPlayActivity.kt | 183 +++++++ app/src/main/res/drawable/back_white.png | Bin 0 -> 497 bytes app/src/main/res/drawable/icon_finished.png | Bin 0 -> 7138 bytes .../main/res/drawable/icon_folder_audio.png | Bin 0 -> 2069 bytes .../res/drawable/icon_folder_documents.png | Bin 0 -> 1328 bytes app/src/main/res/drawable/icon_info_pause.png | Bin 0 -> 13154 bytes app/src/main/res/drawable/icon_info_play.png | Bin 0 -> 8596 bytes .../res/drawable/icon_item_audio_play.png | Bin 0 -> 2964 bytes .../main/res/drawable/icon_small_audio.png | Bin 0 -> 2018 bytes app/src/main/res/drawable/icon_type_photo.png | Bin 0 -> 1732 bytes app/src/main/res/drawable/icon_type_video.png | Bin 0 -> 2121 bytes .../res/drawable/im_audio_center_image.png | Bin 0 -> 18110 bytes .../drawable/im_documents_center_image.png | Bin 0 -> 16902 bytes .../res/drawable/im_video_center_image.png | Bin 0 -> 18824 bytes app/src/main/res/drawable/seekbar_thumb.xml | 7 + .../main/res/drawable/seekbar_video_play.xml | 25 + .../res/drawable/selector_play_button.xml | 6 + .../main/res/layout/activity_photo_info.xml | 104 +++- .../res/layout/activity_photo_sorting.xml | 77 +-- .../layout/activity_scan_result_display.xml | 33 +- app/src/main/res/layout/activity_scanning.xml | 152 ++++-- .../main/res/layout/activity_video_play.xml | 88 ++++ .../layout/file_span_count_three_adapter.xml | 40 +- .../layout/file_span_count_two_adapter.xml | 33 +- .../res/layout/one_audio_documents_item.xml | 81 +++ .../layout/scan_result_documents_adapter.xml | 52 ++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 25 +- 45 files changed, 1629 insertions(+), 526 deletions(-) create mode 100644 app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDocumentsAdapter.kt rename app/src/main/java/com/ux/video/file/filerecovery/result/{ScanResultAdapter.kt => ScanResultPhotoAdapter.kt} (98%) create mode 100644 app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt create mode 100644 app/src/main/res/drawable/back_white.png create mode 100644 app/src/main/res/drawable/icon_finished.png create mode 100644 app/src/main/res/drawable/icon_folder_audio.png create mode 100644 app/src/main/res/drawable/icon_folder_documents.png create mode 100644 app/src/main/res/drawable/icon_info_pause.png create mode 100644 app/src/main/res/drawable/icon_info_play.png create mode 100644 app/src/main/res/drawable/icon_item_audio_play.png create mode 100644 app/src/main/res/drawable/icon_small_audio.png create mode 100644 app/src/main/res/drawable/icon_type_photo.png create mode 100644 app/src/main/res/drawable/icon_type_video.png create mode 100644 app/src/main/res/drawable/im_audio_center_image.png create mode 100644 app/src/main/res/drawable/im_documents_center_image.png create mode 100644 app/src/main/res/drawable/im_video_center_image.png create mode 100644 app/src/main/res/drawable/seekbar_thumb.xml create mode 100644 app/src/main/res/drawable/seekbar_video_play.xml create mode 100644 app/src/main/res/drawable/selector_play_button.xml create mode 100644 app/src/main/res/layout/activity_video_play.xml create mode 100644 app/src/main/res/layout/one_audio_documents_item.xml create mode 100644 app/src/main/res/layout/scan_result_documents_adapter.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1ed77ce..67dfffd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -55,4 +55,6 @@ dependencies { implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") implementation ("com.google.android.material:material:1.13.0") implementation(project(":pickerview")) + implementation ("androidx.media3:media3-exoplayer:1.8.0") + implementation ("androidx.media3:media3-ui:1.8.0") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 65ac6bf..13ce729 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,9 @@ android:supportsRtl="true" android:theme="@style/Theme.FileRecovery" tools:targetApi="31"> + diff --git a/app/src/main/java/com/ux/video/file/filerecovery/base/BaseActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/base/BaseActivity.kt index 4196ef7..757f4c4 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/base/BaseActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/base/BaseActivity.kt @@ -20,13 +20,15 @@ abstract class BaseActivity : AppCompatActivity() { setContentView(binding.root) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + if(addPadding()){ + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + } insets } initView() initData() } - + protected open fun addPadding() = true protected abstract fun inflateBinding(inflater: LayoutInflater): VB protected open fun initView() {} diff --git a/app/src/main/java/com/ux/video/file/filerecovery/main/ScanSelectTypeActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/main/ScanSelectTypeActivity.kt index 3d45b83..b4f1d3b 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/main/ScanSelectTypeActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/main/ScanSelectTypeActivity.kt @@ -17,6 +17,10 @@ import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_photo import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_video import kotlin.properties.Delegates + +/** + * 选择扫描所有文件还是扫描删除过的文件 + */ class ScanSelectTypeActivity : BaseActivity() { companion object { 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/photo/DatePickerDialogFragment.kt index d791f76..29f9742 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/DatePickerDialogFragment.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/photo/DatePickerDialogFragment.kt @@ -23,6 +23,9 @@ import org.jaaksi.pickerview.picker.TimePicker.OnTimeSelectListener import org.jaaksi.pickerview.widget.DefaultCenterDecoration import java.util.Date +/** + * 自定义日期筛选,选择日期弹窗 + */ class DatePickerDialogFragment( var mContext: Context, var title: String, 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/photo/PhotoDisplayDateAdapter.kt index 20420bd..cb82f29 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateAdapter.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateAdapter.kt @@ -7,6 +7,7 @@ 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 @@ -16,6 +17,7 @@ import com.ux.video.file.filerecovery.utils.ScanRepository class PhotoDisplayDateAdapter( mContext: Context, + var scanType: Int, var mColumns: Int, var viewModel: ScanRepository, var onSelectedUpdate: (resultPhotosFiles: ResultPhotosFiles, isAdd: Boolean) -> Unit, @@ -34,14 +36,13 @@ class PhotoDisplayDateAdapter( ) - /** * 返回所有嵌套的数据量总数 */ fun getTotalChildCount(hideThumbnails: Boolean): Int { - if(hideThumbnails){ + if (hideThumbnails) { return data.sumOf { it.second.filter { !it.isThumbnail }.size } - }else{ + } else { return data.sumOf { it.second.size } } @@ -81,17 +82,18 @@ class PhotoDisplayDateAdapter( val (date, files) = item val childAdapter = PhotoDisplayDateChildAdapter( mContext, + scanType, mColumns, viewModel, { resultPhotosFiles, addOrRemove, isDateAllSelected -> //点击当前Adapter某一天的全选或者子Item上的选中都会回调到这里 tvDayAllSelect.isSelected = isDateAllSelected onSelectedUpdate(resultPhotosFiles, addOrRemove) - }, { updateHideThumbnails-> + }, { updateHideThumbnails -> tvDayAllSelect.isSelected = updateHideThumbnails - },clickItem + }, clickItem ).apply { setData(files) } allSelected?.let { @@ -106,7 +108,15 @@ class PhotoDisplayDateAdapter( textChildCounts.text = "(${files.size})" recyclerChild.apply { - layoutManager = GridLayoutManager(context, mColumns) + layoutManager = when (scanType) { + Common.VALUE_SCAN_TYPE_audio, Common.VALUE_SCAN_TYPE_deleted_audio -> { + LinearLayoutManager(context) + } + else -> { + GridLayoutManager(context, mColumns) + } + } + adapter = childAdapter isNestedScrollingEnabled = false } 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/photo/PhotoDisplayDateChildAdapter.kt index 30b3bfd..8dd7577 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateChildAdapter.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoDisplayDateChildAdapter.kt @@ -18,9 +18,11 @@ import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.Target import com.ux.video.file.filerecovery.App +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.utils.Common import com.ux.video.file.filerecovery.utils.CustomTextView import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx @@ -29,6 +31,7 @@ import com.ux.video.file.filerecovery.utils.ScanRepository class PhotoDisplayDateChildAdapter( mContext: Context, + var scanType: Int, var mColumns: Int, var viewModel: ScanRepository, /** @@ -38,8 +41,8 @@ class PhotoDisplayDateChildAdapter( * @param dateAllSelected 这组数据是否全部选中(某一天) */ var onSelectedUpdate: (resultPhotosFiles: ResultPhotosFiles, addOrRemove: Boolean, dateAllSelected: Boolean) -> Unit, - var hideThumbnailsUpdate:(dateAllSelected: Boolean)-> Unit, - var clickItem:(item:ResultPhotosFiles)-> Unit + var hideThumbnailsUpdate: (dateAllSelected: Boolean) -> Unit, + var clickItem: (item: ResultPhotosFiles) -> Unit ) : NewBaseAdapter(mContext) { @@ -49,10 +52,13 @@ class PhotoDisplayDateChildAdapter( companion object { + //音频或者文档 + private const val TYPE_ONE = 1 private const val TYPE_TWO = 2 private const val TYPE_THREE = 3 private const val TYPE_FOUR = 4 } + fun setAllSelected(isAdd: Boolean) { data.forEach { addOrRemove(it, isAdd) @@ -61,12 +67,22 @@ class PhotoDisplayDateChildAdapter( } override fun getItemViewType(position: Int): Int { - return when (mColumns) { - 2 -> TYPE_TWO - 3 -> TYPE_THREE - 4 -> TYPE_FOUR - else -> TYPE_THREE + when (scanType) { + Common.VALUE_SCAN_TYPE_audio, Common.VALUE_SCAN_TYPE_deleted_audio -> { + return TYPE_ONE + } + + else -> { + return when (mColumns) { + 2 -> TYPE_TWO + 3 -> TYPE_THREE + 4 -> TYPE_FOUR + else -> TYPE_THREE + } + } } + + } fun setColumns(int: Int) { @@ -82,7 +98,7 @@ class PhotoDisplayDateChildAdapter( val screenWidth = view.context.resources.displayMetrics.widthPixels val i = (Common.itemSpacing).dpToPx(App.mAppContext) * (mColumns - 1) val itemSize = - (screenWidth - i - 2 * Common.horizontalSpacing.dpToPx(App.mAppContext) )/ mColumns + (screenWidth - i - 2 * Common.horizontalSpacing.dpToPx(App.mAppContext)) / mColumns view.layoutParams = layoutParams.apply { height = itemSize } @@ -94,6 +110,14 @@ class PhotoDisplayDateChildAdapter( ): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) return when (viewType) { + TYPE_ONE -> OneHolder( + OneAudioDocumentsItemBinding.inflate( + inflater, + parent, + false + ) + ) + TYPE_TWO -> TwoHolder( FileSpanCountTwoAdapterBinding.inflate( inflater, @@ -121,13 +145,34 @@ class PhotoDisplayDateChildAdapter( when (holder) { is TwoHolder -> holder.vb.run { - - initDateView(rootLayout, imageSelect, textSize, imageThumbnail, item) + initDateView(rootLayout, imageSelect, textSize, imageThumbnail, item, imageType) } is ThreeHolder -> holder.vb.run { + initDateView(rootLayout, imageSelect, textSize, imageThumbnail, item, imageType) + } - initDateView(rootLayout, imageSelect, textSize, imageThumbnail, item) + is OneHolder -> { + 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) + } + } + + } + } } } @@ -139,15 +184,19 @@ class PhotoDisplayDateChildAdapter( class TwoHolder(val vb: FileSpanCountTwoAdapterBinding) : RecyclerView.ViewHolder(vb.root) + class OneHolder(val vb: OneAudioDocumentsItemBinding) : + RecyclerView.ViewHolder(vb.root) private fun initDateView( rootLayout: RelativeLayout, imageSelectStatus: ImageView, textSize: CustomTextView, imageThumbnail: ImageView, - item: ResultPhotosFiles + item: ResultPhotosFiles, + imageType: ImageView ) { item.run { + viewModel.checkIsSelect(this).let { imageSelectStatus.isSelected = it addOrRemove(this, it) @@ -160,6 +209,13 @@ class PhotoDisplayDateChildAdapter( } textSize.text = sizeString + imageType.setImageResource( + when (scanType) { + Common.VALUE_SCAN_TYPE_photo, Common.VALUE_SCAN_TYPE_deleted_photo -> R.drawable.icon_type_photo + Common.VALUE_SCAN_TYPE_video, Common.VALUE_SCAN_TYPE_deleted_video -> R.drawable.icon_type_video + else -> R.drawable.icon_type_photo + } + ) Glide.with(mContext) .load(targetFile) .apply( @@ -211,14 +267,4 @@ class PhotoDisplayDateChildAdapter( } - - fun getVisibleCount(list: MutableList = data, hideThumbnails: Boolean): Int { - if(hideThumbnails){ - return list.filter { !it.isThumbnail }.size - }else{ - return list.size - } - - } - } \ No newline at end of file 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/photo/PhotoInfoActivity.kt index f767c95..9d25a72 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoInfoActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoInfoActivity.kt @@ -3,12 +3,8 @@ package com.ux.video.file.filerecovery.photo import android.content.Intent import android.graphics.drawable.Drawable import android.os.Build -import android.os.Bundle import android.view.LayoutInflater -import androidx.activity.enableEdgeToEdge -import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat +import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource @@ -21,12 +17,19 @@ 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.databinding.ActivityPhotoSortingBinding -import com.ux.video.file.filerecovery.photo.PhotoSortingActivity 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 +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 +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_deleted_photo +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_deleted_video +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_documents +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_photo +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_video import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx -import com.ux.video.file.filerecovery.utils.ScanManager +import com.ux.video.file.filerecovery.video.VideoPlayActivity class PhotoInfoActivity : BaseActivity() { @@ -34,6 +37,7 @@ class PhotoInfoActivity : BaseActivity() { val KEY_CLICK_ITEM = "click_item" } + private var scanType: Int = VALUE_SCAN_TYPE_photo private var myData: ResultPhotosFiles? = null override fun inflateBinding(inflater: LayoutInflater): ActivityPhotoInfoBinding = @@ -45,31 +49,34 @@ class PhotoInfoActivity : BaseActivity() { intent.getParcelableExtra(KEY_CLICK_ITEM, ResultPhotosFiles::class.java) } else { @Suppress("DEPRECATION") - intent.getParcelableExtra("MY_KEY") + intent.getParcelableExtra(KEY_CLICK_ITEM) } + scanType = intent.getIntExtra(KEY_SCAN_TYPE, VALUE_SCAN_TYPE_photo) + setView() + + } + + + override fun initData() { + super.initData() binding.run { imageViewBack.setOnClickListener { finish() } - myData?.let { resultPhotosFiles-> + myData?.let { resultPhotosFiles -> tvName.text = resultPhotosFiles.name tvPath.text = resultPhotosFiles.path tvDate.text = Common.getFormatDate(resultPhotosFiles.lastModified) tvResolution.text = resultPhotosFiles.resolution + tvDuration.text = Common.formatDuration(resultPhotosFiles.duration) Glide.with(this@PhotoInfoActivity) .load(resultPhotosFiles.targetFile) - .apply( - RequestOptions() - .transform( - CenterCrop(), - RoundedCorners(8.dpToPx(this@PhotoInfoActivity)) - ) - ) + .apply(RequestOptions().transform(CenterCrop(), RoundedCorners(8.dpToPx(this@PhotoInfoActivity)))) .listener(object : RequestListener { override fun onLoadFailed( e: GlideException?, model: Any?, - target: com.bumptech.glide.request.target.Target, + target: Target, isFirstResource: Boolean ): Boolean { return false @@ -92,8 +99,13 @@ class PhotoInfoActivity : BaseActivity() { layoutBottom.tvLeft.run { text = resources.getString(R.string.delete) setOnClickListener { - RecoverOrDeleteManager.showConfirmDeleteDialog(true,supportFragmentManager,lifecycleScope,setOf(resultPhotosFiles)){count-> - complete(count,1) + RecoverOrDeleteManager.showConfirmDeleteDialog( + true, + supportFragmentManager, + lifecycleScope, + setOf(resultPhotosFiles) + ) { count -> + complete(count, 1) } } } @@ -101,8 +113,12 @@ class PhotoInfoActivity : BaseActivity() { layoutBottom.tvRight.run { text = resources.getString(R.string.recover) setOnClickListener { - RecoverOrDeleteManager.showRecoveringDialog(supportFragmentManager,lifecycleScope,setOf(resultPhotosFiles)){count-> - complete(count,0) + RecoverOrDeleteManager.showRecoveringDialog( + supportFragmentManager, + lifecycleScope, + setOf(resultPhotosFiles) + ) { count -> + complete(count, 0) } } } @@ -110,11 +126,74 @@ class PhotoInfoActivity : BaseActivity() { } } - private fun complete(number: Int,type: Int) { + private fun setView() { + binding.run { + when (scanType) { + VALUE_SCAN_TYPE_photo, VALUE_SCAN_TYPE_deleted_photo -> { + layoutName.isVisible = true + layoutPath.isVisible = true + layoutResolution.isVisible = true + layoutDate.isVisible = true + + layoutType.isVisible = false + layoutSize.isVisible = false + layoutDuration.isVisible = false + + imPlay.isVisible = false + } + + VALUE_SCAN_TYPE_video, VALUE_SCAN_TYPE_deleted_video -> { + layoutName.isVisible = true + layoutPath.isVisible = true + layoutResolution.isVisible = true + layoutDate.isVisible = true + layoutDuration.isVisible = true + + layoutType.isVisible = false + layoutSize.isVisible = false + + imPlay.isVisible = true + myData?.let { data-> + frameImage.setOnClickListener { + startActivity(Intent(this@PhotoInfoActivity, VideoPlayActivity::class.java).apply { + putExtra(VideoPlayActivity.KEY_DATA, data) + }) + } + } + } + + VALUE_SCAN_TYPE_audio, VALUE_SCAN_TYPE_deleted_audio -> { + layoutName.isVisible = true + layoutPath.isVisible = true + layoutSize.isVisible = true + layoutDate.isVisible = true + layoutDuration.isVisible = true + + layoutResolution.isVisible = false + layoutType.isVisible = false + } + + VALUE_SCAN_TYPE_documents, VALUE_SCAN_TYPE_deleted_documents -> { + layoutName.isVisible = true + layoutType.isVisible = true + layoutPath.isVisible = true + layoutSize.isVisible = true + layoutDate.isVisible = true + + layoutDuration.isVisible = false + layoutDuration.isVisible = false + } + } + + } + + } + + private fun complete(number: Int, type: Int) { finish() startActivity(Intent(this@PhotoInfoActivity, RecoverySuccessActivity::class.java).apply { - putExtra(RecoverySuccessActivity.KEY_SUCCESS_COUNT,number) - putExtra(RecoverySuccessActivity.KEY_SUCCESS_TYPE,type) + putExtra(RecoverySuccessActivity.KEY_SUCCESS_COUNT, number) + putExtra(RecoverySuccessActivity.KEY_SUCCESS_TYPE, type) }) } } \ No newline at end of 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/photo/PhotoSortingActivity.kt index e5c5439..c77a4ec 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoSortingActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/photo/PhotoSortingActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.util.Log import android.view.LayoutInflater import android.widget.LinearLayout +import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager @@ -13,8 +14,19 @@ import com.ux.video.file.filerecovery.base.BaseActivity import com.ux.video.file.filerecovery.databinding.ActivityPhotoSortingBinding 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 +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 +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_deleted_photo +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_deleted_video +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_documents +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_photo +import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_video import com.ux.video.file.filerecovery.utils.Common.setItemSelect import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx +import com.ux.video.file.filerecovery.utils.ExtendFunctions.filterByDuration +import com.ux.video.file.filerecovery.utils.ExtendFunctions.filterByDurationList import com.ux.video.file.filerecovery.utils.ExtendFunctions.filterBySize import com.ux.video.file.filerecovery.utils.ExtendFunctions.filterBySizeList import com.ux.video.file.filerecovery.utils.ExtendFunctions.filterRemoveThumbnailsAsync @@ -22,12 +34,11 @@ import com.ux.video.file.filerecovery.utils.ExtendFunctions.filterThumbnailsAsyn import com.ux.video.file.filerecovery.utils.ExtendFunctions.filterWithinDateRange import com.ux.video.file.filerecovery.utils.ExtendFunctions.filterWithinDateRangeList import com.ux.video.file.filerecovery.utils.ExtendFunctions.getParcelableArrayListExtraCompat +import com.ux.video.file.filerecovery.utils.ExtendFunctions.kbToBytes import com.ux.video.file.filerecovery.utils.ExtendFunctions.mbToBytes +import com.ux.video.file.filerecovery.utils.ExtendFunctions.minutesToMillisecond import com.ux.video.file.filerecovery.utils.ExtendFunctions.removeItem import com.ux.video.file.filerecovery.utils.GridSpacingItemDecoration -import com.ux.video.file.filerecovery.utils.ScanManager -import com.ux.video.file.filerecovery.utils.ScanManager.copySelectedFilesAsync -import com.ux.video.file.filerecovery.utils.ScanManager.deleteFilesAsync import com.ux.video.file.filerecovery.utils.ScanRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -57,6 +68,8 @@ class PhotoSortingActivity : BaseActivity() { val SORT_DESC_DATE = 3 } + private var scanType: Int = VALUE_SCAN_TYPE_photo + private var sortDialogFragment: SortDialogFragment? = null private var columns = 3 private var dateAdapter: PhotoDisplayDateAdapter? = null @@ -76,7 +89,7 @@ class PhotoSortingActivity : BaseActivity() { private var filterDate = FILTER_DATE_ALL //筛选大小,默认全部-1 - private var filterSize = FILTER_SIZE_ALL + private var filterSize: String = "All" private var filterDatePopupWindows: DateFilterPopupWindows? = null private var filterStartDate: Date? = null @@ -103,6 +116,8 @@ class PhotoSortingActivity : BaseActivity() { private lateinit var mItemDecoration: GridSpacingItemDecoration + private lateinit var sizeFilterItemArray: Array + private lateinit var viewModel: ScanRepository override fun inflateBinding(inflater: LayoutInflater): ActivityPhotoSortingBinding = @@ -110,13 +125,12 @@ class PhotoSortingActivity : BaseActivity() { override fun initData() { super.initData() - + scanType = intent.getIntExtra(KEY_SCAN_TYPE, VALUE_SCAN_TYPE_photo) val list: ArrayList? = intent.getParcelableArrayListExtraCompat(KEY_PHOTO_FOLDER_FILE) mItemDecoration = GridSpacingItemDecoration(columns, Common.itemSpacing, Common.horizontalSpacing) updateButtonCounts(0) - viewModel = ViewModelProvider(this).get(ScanRepository::class.java) viewModel.selectedLiveData.observe(this) { selectedSet -> @@ -129,12 +143,11 @@ class PhotoSortingActivity : BaseActivity() { Common.showLog("当前显示筛选数据 选中状态更新: ${displaySet.size}") updateCurrentIsAllSelectStatus() } - + setScanTypeView() list?.let { binding.tvThumbnailCounts.text = getString(R.string.hide_thumbnails, it.filter { it.isThumbnail }.size) - //降序(最近的在前面) sortByDateReverse = Common.getSortByDayNewToOldInit(it) //升序(时间最远的在前面) @@ -144,6 +157,7 @@ class PhotoSortingActivity : BaseActivity() { sizeSortAdapter = PhotoDisplayDateChildAdapter( this@PhotoSortingActivity, + scanType, columns, viewModel, { resultPhotosFiles, isAdd, allSelected -> viewModel.toggleSelection(isAdd, resultPhotosFiles) @@ -156,6 +170,7 @@ class PhotoSortingActivity : BaseActivity() { this@PhotoSortingActivity, PhotoInfoActivity::class.java ).apply { + putExtra(KEY_SCAN_TYPE,scanType) putExtra(PhotoInfoActivity.KEY_CLICK_ITEM, item) }) @@ -163,6 +178,7 @@ class PhotoSortingActivity : BaseActivity() { dateAdapter = PhotoDisplayDateAdapter( this@PhotoSortingActivity, + scanType, columns, viewModel, { actionPath, isAdd -> @@ -173,6 +189,7 @@ class PhotoSortingActivity : BaseActivity() { this@PhotoSortingActivity, PhotoInfoActivity::class.java ).apply { + putExtra(KEY_SCAN_TYPE,scanType) putExtra(PhotoInfoActivity.KEY_CLICK_ITEM, item) }) }.apply { @@ -182,166 +199,209 @@ class PhotoSortingActivity : BaseActivity() { setDateAdapter() setSingleDelete() setFilter() - binding.run { - imageViewBack.setOnClickListener { finish() } - switchHideThumbnails.setOnCheckedChangeListener { _, isChecked -> - when (recyclerView.adapter) { - is PhotoDisplayDateAdapter -> { - lifecycleScope.launch { - dateAdapter?.run { - initGetCurrentDateList().let { list -> - val filterThumbnailsAsync = - if (isChecked) list.filterThumbnailsAsync() else list - setData(filterThumbnailsAsync) - checkRefreshDisPlaySelected(list1 = filterThumbnailsAsync) - } + setAllClick() - } - } - - } - - is PhotoDisplayDateChildAdapter -> { - lifecycleScope.launch { - sizeSortAdapter?.run { - initGetCurrentSizeList().let { - val filterThumbnailsAsync = - if (isChecked) it.filterRemoveThumbnailsAsync() else it - setData(filterThumbnailsAsync) - checkRefreshDisPlaySelected(list2 = filterThumbnailsAsync) - } - - } - } - - } - } - updateCurrentIsAllSelectStatus() - - } - tvRecover.setOnClickListener { -// showRecoveringDialog() - RecoverOrDeleteManager.showRecoveringDialog( - supportFragmentManager, - lifecycleScope, - filterSelectedSetList - ) { count -> - complete(count, 0) - } - - } - tvDelete.setOnClickListener { -// showConfirmDeleteDialog() - RecoverOrDeleteManager.showConfirmDeleteDialog( - fragmentManager = supportFragmentManager, - scope = lifecycleScope, - selectedSetList = filterSelectedSetList - ) { count -> - complete(count, 1) - } - - } - imSort.setOnClickListener { - sortDialogFragment = sortDialogFragment ?: SortDialogFragment { - when (it) { - SORT_ASC_DATE -> { - setDateAdapter() - lifecycleScope.launch { - initGetCurrentDateList().let { - val filterThumbnailsAsync = - if (switchHideThumbnails.isChecked) it.filterThumbnailsAsync() else it - val sortByDayOldToNew = - Common.getSortByDayOldToNew(filterThumbnailsAsync) - dateAdapter?.setData(sortByDayOldToNew) - resetCurrentDateList(sortByDayOldToNew) - } - sortReverse = false - } - - } - - SORT_DESC_DATE -> { - setDateAdapter() - lifecycleScope.launch { - initGetCurrentDateList().let { - val filterThumbnailsAsync = - if (switchHideThumbnails.isChecked) it.filterThumbnailsAsync() else it - val sortByDayNewToOld = - Common.getSortByDayNewToOld(filterThumbnailsAsync) - dateAdapter?.setData(sortByDayNewToOld) - resetCurrentDateList(sortByDayNewToOld) - } - sortReverse = true - } - } - - SORT_DESC_SIZE -> { - setSizeAdapter() - lifecycleScope.launch { - initGetCurrentSizeList().let { - val filterThumbnailsAsync = - if (switchHideThumbnails.isChecked) it.filterRemoveThumbnailsAsync() else it - val sortBySizeBigToSmall = - Common.getSortBySizeBigToSmall(filterThumbnailsAsync) - sizeSortAdapter?.setData(sortBySizeBigToSmall) - resetCurrentSizeList(sortBySizeBigToSmall) - } - sortReverse = true - } - - } - - SORT_ASC_SIZE -> { - setSizeAdapter() - lifecycleScope.launch { - initGetCurrentSizeList().let { - val filterThumbnailsAsync = - if (switchHideThumbnails.isChecked) it.filterRemoveThumbnailsAsync() else it - val sortBySizeSmallToBig = - Common.getSortBySizeSmallToBig(filterThumbnailsAsync) - sizeSortAdapter?.setData(sortBySizeSmallToBig) - resetCurrentSizeList(sortBySizeSmallToBig) - } - sortReverse = false - } - } - } - } - sortDialogFragment?.show(supportFragmentManager, "") - } - - //全选按钮 只对当前显示的数据有效 - tvSelectAll.setOnClickListener { - it.isSelected = !it.isSelected - when (binding.recyclerView.adapter) { - is PhotoDisplayDateAdapter -> { - dateAdapter?.setAllSelected(it.isSelected) - dateAdapter?.getCurrentData()?.let { - it as List>> - - if (it.size > 0) - Common.showLog("------------全选按钮 日期-${it.size} ${it[0].second[0].path}") - } - - } - is PhotoDisplayDateChildAdapter -> { - sizeSortAdapter?.setAllSelected(it.isSelected) - sizeSortAdapter?.getCurrentData()?.let { - it as List - if (it.size > 0) - Common.showLog("------------全选按钮 大小-${it.size} ${it[0].path}") - } - } - } - - - - } - } } } + private fun setAllClick() { + binding.run { + imageViewBack.setOnClickListener { finish() } + switchHideThumbnails.setOnCheckedChangeListener { _, isChecked -> + when (recyclerView.adapter) { + is PhotoDisplayDateAdapter -> { + lifecycleScope.launch { + dateAdapter?.run { + initGetCurrentDateList().let { list -> + val filterThumbnailsAsync = + if (isChecked) list.filterThumbnailsAsync() else list + setData(filterThumbnailsAsync) + checkRefreshDisPlaySelected(list1 = filterThumbnailsAsync) + } + + } + } + + } + + is PhotoDisplayDateChildAdapter -> { + lifecycleScope.launch { + sizeSortAdapter?.run { + initGetCurrentSizeList().let { + val filterThumbnailsAsync = + if (isChecked) it.filterRemoveThumbnailsAsync() else it + setData(filterThumbnailsAsync) + checkRefreshDisPlaySelected(list2 = filterThumbnailsAsync) + } + + } + } + + } + } + updateCurrentIsAllSelectStatus() + + } + tvRecover.setOnClickListener { + RecoverOrDeleteManager.showRecoveringDialog( + supportFragmentManager, + lifecycleScope, + filterSelectedSetList + ) { count -> + complete(count, 0) + } + + } + tvDelete.setOnClickListener { + RecoverOrDeleteManager.showConfirmDeleteDialog( + fragmentManager = supportFragmentManager, + scope = lifecycleScope, + selectedSetList = filterSelectedSetList + ) { count -> + complete(count, 1) + } + + } + imSort.setOnClickListener { + sortDialogFragment = sortDialogFragment ?: SortDialogFragment { + when (it) { + SORT_ASC_DATE -> { + setDateAdapter() + lifecycleScope.launch { + initGetCurrentDateList().let { + val filterThumbnailsAsync = + if (switchHideThumbnails.isChecked) it.filterThumbnailsAsync() else it + val sortByDayOldToNew = + Common.getSortByDayOldToNew(filterThumbnailsAsync) + dateAdapter?.setData(sortByDayOldToNew) + resetCurrentDateList(sortByDayOldToNew) + } + sortReverse = false + } + + } + + SORT_DESC_DATE -> { + setDateAdapter() + lifecycleScope.launch { + initGetCurrentDateList().let { + val filterThumbnailsAsync = + if (switchHideThumbnails.isChecked) it.filterThumbnailsAsync() else it + val sortByDayNewToOld = + Common.getSortByDayNewToOld(filterThumbnailsAsync) + dateAdapter?.setData(sortByDayNewToOld) + resetCurrentDateList(sortByDayNewToOld) + } + sortReverse = true + } + } + + SORT_DESC_SIZE -> { + setSizeAdapter() + lifecycleScope.launch { + initGetCurrentSizeList().let { + val filterThumbnailsAsync = + if (switchHideThumbnails.isChecked) it.filterRemoveThumbnailsAsync() else it + val sortBySizeBigToSmall = + Common.getSortBySizeBigToSmall(filterThumbnailsAsync) + sizeSortAdapter?.setData(sortBySizeBigToSmall) + resetCurrentSizeList(sortBySizeBigToSmall) + } + sortReverse = true + } + + } + + SORT_ASC_SIZE -> { + setSizeAdapter() + lifecycleScope.launch { + initGetCurrentSizeList().let { + val filterThumbnailsAsync = + if (switchHideThumbnails.isChecked) it.filterRemoveThumbnailsAsync() else it + val sortBySizeSmallToBig = + Common.getSortBySizeSmallToBig(filterThumbnailsAsync) + sizeSortAdapter?.setData(sortBySizeSmallToBig) + resetCurrentSizeList(sortBySizeSmallToBig) + } + sortReverse = false + } + } + } + } + sortDialogFragment?.show(supportFragmentManager, "") + } + + //全选按钮 只对当前显示的数据有效 + tvSelectAll.setOnClickListener { + it.isSelected = !it.isSelected + when (binding.recyclerView.adapter) { + is PhotoDisplayDateAdapter -> { + dateAdapter?.setAllSelected(it.isSelected) + dateAdapter?.getCurrentData()?.let { + it as List>> + if (it.size > 0) + Common.showLog("------------全选按钮 日期-${it.size} ${it[0].second[0].path}") + } + + } + + is PhotoDisplayDateChildAdapter -> { + sizeSortAdapter?.setAllSelected(it.isSelected) + sizeSortAdapter?.getCurrentData()?.let { + it as List + if (it.size > 0) + Common.showLog("------------全选按钮 大小-${it.size} ${it[0].path}") + } + } + } + + + } + } + } + + + /** + * 不同类型下的ui和功能点区分 + */ + private fun setScanTypeView() { + binding.run { + when (scanType) { + VALUE_SCAN_TYPE_photo, VALUE_SCAN_TYPE_deleted_photo -> { + titleSize.text = getString(R.string.size) + filterLayoutLinearlayout.isVisible = true + relativeThumbnails.isVisible = true + sizeFilterItemArray = resources.getStringArray(R.array.filter_size_photo) + } + + VALUE_SCAN_TYPE_video, VALUE_SCAN_TYPE_deleted_video -> { + titleSize.text = getString(R.string.duration) + filterLayoutLinearlayout.isVisible = true + relativeThumbnails.isVisible = false + sizeFilterItemArray = + resources.getStringArray(R.array.filter_duration_video_audio) + } + + VALUE_SCAN_TYPE_audio, VALUE_SCAN_TYPE_deleted_audio -> { + titleSize.text = getString(R.string.duration) + filterLayoutLinearlayout.isVisible = false + relativeThumbnails.isVisible = false + sizeFilterItemArray = + resources.getStringArray(R.array.filter_duration_video_audio) + } + + VALUE_SCAN_TYPE_documents, VALUE_SCAN_TYPE_deleted_documents -> { + titleSize.text = getString(R.string.size) + filterLayoutLinearlayout.isVisible = false + relativeThumbnails.isVisible = false + sizeFilterItemArray = resources.getStringArray(R.array.filter_documents_size) + } + } + + } + } + private fun updateCurrentIsAllSelectStatus() { filterSelectedSetList.size.let { binding.tvSelectCounts.text = it.toString() @@ -498,19 +558,20 @@ class PhotoSortingActivity : BaseActivity() { //大小筛选 filterSizeLayout.setOnClickListener { setItemSelect(it as LinearLayout, true) - resources.getStringArray(R.array.filter_size).let { data -> + sizeFilterItemArray.let { data -> filterSizePopupWindows = filterSizePopupWindows ?: FilterPopupWindows( this@PhotoSortingActivity, data, 0, { clickValue -> titleSize.text = clickValue - when (clickValue) { - data[0] -> filterSize = FILTER_SIZE_ALL - data[1] -> filterSize = FILTER_SIZE_1 - data[2] -> filterSize = FILTER_SIZE_5 - data[3] -> filterSize = FILTER_SIZE_OVER_5 - } + filterSize = clickValue +// when (clickValue) { +// data[0] -> filterSize = clickValue +// data[1] -> filterSize = FILTER_SIZE_1 +// data[2] -> filterSize = FILTER_SIZE_5 +// data[3] -> filterSize = FILTER_SIZE_OVER_5 +// } startFilter() }) { setItemSelect(it, false) @@ -578,48 +639,61 @@ class PhotoSortingActivity : BaseActivity() { } /** - * 执行筛选结果 + * 执行筛选结果 todo */ private fun startFilter() { Common.showLog("--------------开始筛选") + + val filterSizeCovert = filterSizeCovert(scanType, filterSize) when (binding.recyclerView.adapter) { //当前是时间排序 is PhotoDisplayDateAdapter -> { //确定当前排序 val list = if (sortReverse) sortByDateReverse else sortedByDatePositive - val filterSizeCovert = filterSizeCovert(filterSize) list.filterWithinDateRange( filterDate, startDate = if (filterDate == FILTER_DATE_CUSTOMER) filterStartDate else null, endDate = if (filterDate == FILTER_DATE_CUSTOMER) filterEndDate else null - ) - .filterBySize(filterSizeCovert.first, filterSizeCovert.second) - .let { currentList -> - checkRefreshDisPlaySelected(list1 = currentList) - dateAdapter?.resetAllValue(null) - dateAdapter?.setData(currentList) - resetCurrentDateList(currentList) + ).run { + when (scanType) { + VALUE_SCAN_TYPE_photo, VALUE_SCAN_TYPE_deleted_photo, VALUE_SCAN_TYPE_documents, VALUE_SCAN_TYPE_deleted_documents -> { + filterBySize(filterSizeCovert.first, filterSizeCovert.second) + } + else -> { + filterByDuration(filterSizeCovert.first, filterSizeCovert.second) + } } + }.let { currentList -> + checkRefreshDisPlaySelected(list1 = currentList) + dateAdapter?.resetAllValue(null) + dateAdapter?.setData(currentList) + resetCurrentDateList(currentList) + } + } //当前是大小排序 is PhotoDisplayDateChildAdapter -> { val list = if (sortReverse) sortBySizeBigToSmall else sortBySizeSmallToBig - val filterSizeCovert = filterSizeCovert(filterSize) list.filterWithinDateRangeList( filterDate, startDate = if (filterDate == FILTER_DATE_CUSTOMER) filterStartDate else null, endDate = if (filterDate == FILTER_DATE_CUSTOMER) filterEndDate else null - ) - .filterBySizeList(filterSizeCovert.first, filterSizeCovert.second) - .let { currentList -> - checkRefreshDisPlaySelected(list2 = currentList) - sizeSortAdapter?.setData(currentList) - resetCurrentSizeList(currentList) - - + ).run { + when (scanType) { + VALUE_SCAN_TYPE_photo, VALUE_SCAN_TYPE_deleted_photo, VALUE_SCAN_TYPE_documents, VALUE_SCAN_TYPE_deleted_documents -> { + filterBySizeList(filterSizeCovert.first, filterSizeCovert.second) + } + else -> { + filterByDurationList(filterSizeCovert.first, filterSizeCovert.second) + } } + }.let { currentList -> + checkRefreshDisPlaySelected(list2 = currentList) + sizeSortAdapter?.setData(currentList) + resetCurrentSizeList(currentList) + } } } } @@ -651,15 +725,44 @@ class PhotoSortingActivity : BaseActivity() { } - private fun filterSizeCovert(filterSize: Int): Pair { - return when (filterSize) { - FILTER_SIZE_ALL -> Pair(-1L, -1L) - FILTER_SIZE_1 -> Pair(0L, 1.mbToBytes()) - FILTER_SIZE_5 -> Pair(1.mbToBytes(), 5.mbToBytes()) - FILTER_SIZE_OVER_5 -> Pair(5.mbToBytes(), Long.MAX_VALUE) - else -> Pair(-1L, -1L) + private fun filterSizeCovert(scanType: Int, filterSize: String): Pair { + when (scanType) { + VALUE_SCAN_TYPE_photo, VALUE_SCAN_TYPE_deleted_photo -> { + val stringArray = resources.getStringArray(R.array.filter_size_photo) + return when (filterSize) { + stringArray[0] -> Pair(-1L, -1L) + stringArray[1] -> Pair(0L, 1.mbToBytes()) + stringArray[2] -> Pair(1.mbToBytes(), 5.mbToBytes()) + stringArray[3] -> Pair(5.mbToBytes(), Long.MAX_VALUE) + else -> Pair(-1L, -1L) + } + } + + VALUE_SCAN_TYPE_video, VALUE_SCAN_TYPE_deleted_video, VALUE_SCAN_TYPE_audio, VALUE_SCAN_TYPE_deleted_audio -> { + val stringArray = resources.getStringArray(R.array.filter_duration_video_audio) + return when (filterSize) { + stringArray[0] -> Pair(-1L, -1L) + stringArray[1] -> Pair(0L, 5.minutesToMillisecond()) + stringArray[2] -> Pair(5.minutesToMillisecond(), 20.minutesToMillisecond()) + stringArray[3] -> Pair(20.minutesToMillisecond(), 60.minutesToMillisecond()) + stringArray[4] -> Pair(60.minutesToMillisecond(), Long.MAX_VALUE) + else -> Pair(-1L, -1L) + } + } + + VALUE_SCAN_TYPE_documents, VALUE_SCAN_TYPE_deleted_documents -> { + val stringArray = resources.getStringArray(R.array.filter_documents_size) + return when (filterSize) { + stringArray[0] -> Pair(-1L, -1L) + stringArray[1] -> Pair(0L, 500.kbToBytes()) + stringArray[2] -> Pair(500.kbToBytes(), 1.mbToBytes()) + stringArray[3] -> Pair(1.mbToBytes(), Long.MAX_VALUE) + else -> Pair(-1L, -1L) + } + } } + return Pair(-1L, -1L) } /** @@ -727,7 +830,6 @@ class PhotoSortingActivity : BaseActivity() { } - /** * 删除或者恢复完成 * @param type 0 恢复 1 删除 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/photo/ResultPhotosFiles.kt index 79a9838..9e7ee9c 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/photo/ResultPhotosFiles.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/photo/ResultPhotosFiles.kt @@ -3,6 +3,7 @@ package com.ux.video.file.filerecovery.photo import java.io.File import android.os.Parcelable +import com.ux.video.file.filerecovery.utils.Common import kotlinx.parcelize.Parcelize @Parcelize @@ -17,7 +18,7 @@ data class ResultPhotosFiles( val targetFile: File? get() = path?.let { File(it) } - //是否为缩略图文件(宽高任一小于 256) + //是否为缩略图文件(宽高任一小于 256) val isThumbnail: Boolean get() { val parts = resolution.lowercase().split("*").mapNotNull { @@ -29,4 +30,10 @@ data class ResultPhotosFiles( } return false } + + + //音视频时长 + val duration: Long + get() { + return Common.getMediaDuration(path.toString()) } } 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 2fec3f1..3537692 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 @@ -2,16 +2,14 @@ package com.ux.video.file.filerecovery.result import android.content.Intent import android.view.LayoutInflater -import android.view.View import androidx.activity.OnBackPressedCallback -import androidx.core.view.isVisible 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.result.ScanningActivity +import com.ux.video.file.filerecovery.photo.ResultPhotosFiles 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 @@ -22,17 +20,16 @@ import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_documents import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_photo import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_video import com.ux.video.file.filerecovery.utils.ExtendFunctions.getParcelableArrayListExtraCompat -import com.ux.video.file.filerecovery.utils.ScanManager -import com.ux.video.file.filerecovery.utils.ScanRepository /** * 扫描结果汇总展示 */ class ScanResultDisplayActivity : BaseActivity() { - private var scanResultAdapter: ScanResultAdapter? = null private var scanType: Int = VALUE_SCAN_TYPE_photo private var exitDialog: ExitDialogFragment? = null + private var list: ArrayList? = null + companion object { val KEY_SCAN_RESULT = "scan_result" @@ -43,50 +40,16 @@ class ScanResultDisplayActivity : BaseActivity override fun initView() { super.initView() - val list: ArrayList? = - intent.getParcelableArrayListExtraCompat(KEY_SCAN_RESULT) - scanResultAdapter = ScanResultAdapter(this@ScanResultDisplayActivity) { folderLists -> - startActivity( - Intent( - this@ScanResultDisplayActivity, - PhotoSortingActivity::class.java - ).apply { - putParcelableArrayListExtra( - PhotoSortingActivity.KEY_PHOTO_FOLDER_FILE, - folderLists - ) - }) - } - binding.recyclerResult.run { - adapter = scanResultAdapter - layoutManager = LinearLayoutManager(this@ScanResultDisplayActivity) - } - list?.let { - binding.run { - textDirCount.text = it.size.toString() - val sumOf = it.sumOf { it.allFiles.size } - textAllCounts.text = sumOf.toString() - } - scanResultAdapter?.setData(it) - } + list = intent.getParcelableArrayListExtraCompat(KEY_SCAN_RESULT) + scanType = intent.getIntExtra(KEY_SCAN_TYPE, VALUE_SCAN_TYPE_photo) + setSelectTypeTitle(scanType) -// ScanRepository.instance.photoResults.observe(this@ScanResultDisplayActivity) { -// binding.run { -// textDirCount.text = it.size.toString() -// val sumOf = it.sumOf { it.allFiles.size } -// textAllCounts.text = sumOf.toString() -// } -// scanResultAdapter?.setData(it) -// } } override fun initData() { super.initData() - scanType = intent.getIntExtra(KEY_SCAN_TYPE, VALUE_SCAN_TYPE_photo) - setSelectTypeTitle(scanType) binding.imageViewBack.setOnClickListener { dealExit() } - onBackPressedDispatcher.addCallback( this, object : OnBackPressedCallback(true) { @@ -94,36 +57,96 @@ class ScanResultDisplayActivity : BaseActivity dealExit() } }) + + binding.run { + val myAdapter = when (scanType) { + VALUE_SCAN_TYPE_audio, VALUE_SCAN_TYPE_deleted_audio, VALUE_SCAN_TYPE_documents, VALUE_SCAN_TYPE_deleted_documents -> { + bottomLayout.setBackgroundResource(R.drawable.bg_rectangle_white_top_20) + ScanResultDocumentsAdapter( + this@ScanResultDisplayActivity, + scanType + ) { folderLists -> + goSort(folderLists) + } + } + + else -> { + bottomLayout.setBackgroundResource(0) + ScanResultPhotoAdapter( + this@ScanResultDisplayActivity, + scanType + ) { folderLists -> + goSort(folderLists) + } + + } + + + }.apply { + list?.let { + textDirCount.text = it.size.toString() + val sumOf = it.sumOf { it.allFiles.size } + textAllCounts.text = sumOf.toString() + setData(it) + } + } + recyclerResult.run { + adapter = myAdapter + layoutManager = LinearLayoutManager(this@ScanResultDisplayActivity) + } + + + } } - private fun dealExit(){ - exitDialog = exitDialog?:ExitDialogFragment(){ + private fun dealExit() { + exitDialog = exitDialog ?: ExitDialogFragment() { finish() } - exitDialog?.show(supportFragmentManager,"") + exitDialog?.show(supportFragmentManager, "") } + private fun setSelectTypeTitle(fileType: Int) { binding.run { when (fileType) { VALUE_SCAN_TYPE_photo, VALUE_SCAN_TYPE_deleted_photo -> { title.text = getString(R.string.photo_title) + textFileType.text = getString(R.string.text_photos) } VALUE_SCAN_TYPE_video, VALUE_SCAN_TYPE_deleted_video -> { title.text = getString(R.string.video_title) + textFileType.text = getString(R.string.text_videos) } VALUE_SCAN_TYPE_audio, VALUE_SCAN_TYPE_deleted_audio -> { title.text = getString(R.string.audio_title) + textFileType.text = getString(R.string.text_audios) } VALUE_SCAN_TYPE_documents, VALUE_SCAN_TYPE_deleted_documents -> { title.text = getString(R.string.document_title) + textFileType.text = getString(R.string.text_documents) } } } } + + + private fun goSort(list: ArrayList) { + startActivity( + Intent( + this@ScanResultDisplayActivity, + PhotoSortingActivity::class.java + ).apply { + putExtra(KEY_SCAN_TYPE, scanType) + putParcelableArrayListExtra( + PhotoSortingActivity.KEY_PHOTO_FOLDER_FILE, + list + ) + }) + } } \ No newline at end of file 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 new file mode 100644 index 0000000..73d146b --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultDocumentsAdapter.kt @@ -0,0 +1,65 @@ +package com.ux.video.file.filerecovery.result + +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.utils.Common +import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx +import java.io.File + +/** + * 文件或者音频的扫描结果汇总适配器 + */ +class ScanResultDocumentsAdapter( + mContext: Context, + var type: Int, + var onClickItem: (allFiles: ArrayList) -> Unit +) : + BaseAdapter(mContext) { + override fun getViewBinding(parent: ViewGroup): ScanResultDocumentsAdapterBinding = + ScanResultDocumentsAdapterBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + + @SuppressLint("SetTextI18n") + override fun bindItem( + holder: VHolder, + item: ResultPhotos + ) { + + holder.vb.run { + item.run { + relativeLayout.setOnClickListener { onClickItem(allFiles) } + textDirName.text = dirName + textFileCounts.text = allFiles.size.toString() + when(type){ + Common.VALUE_SCAN_TYPE_audio, Common.VALUE_SCAN_TYPE_deleted_audio->{ + icon.setImageResource(R.drawable.icon_folder_audio) + } + Common.VALUE_SCAN_TYPE_documents, Common.VALUE_SCAN_TYPE_deleted_documents->{ + icon.setImageResource(R.drawable.icon_folder_documents) + } + } + + } + } + + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultAdapter.kt b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultPhotoAdapter.kt similarity index 98% rename from app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultAdapter.kt rename to app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultPhotoAdapter.kt index 3951f76..6f6adc5 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultAdapter.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanResultPhotoAdapter.kt @@ -16,8 +16,9 @@ import com.ux.video.file.filerecovery.photo.ResultPhotosFiles import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx import java.io.File -class ScanResultAdapter( +class ScanResultPhotoAdapter( mContext: Context, + var type: Int, var onClickItem: (allFiles: ArrayList) -> Unit ) : BaseAdapter(mContext) { diff --git a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanningActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanningActivity.kt index 09595f4..3f29c7d 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/result/ScanningActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/result/ScanningActivity.kt @@ -1,8 +1,11 @@ package com.ux.video.file.filerecovery.result +import android.annotation.SuppressLint import android.content.Intent import android.os.Environment import android.view.LayoutInflater +import androidx.core.view.isVisible +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import com.ux.video.file.filerecovery.R import com.ux.video.file.filerecovery.base.BaseActivity @@ -26,20 +29,10 @@ import com.ux.video.file.filerecovery.utils.ScanState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch +import androidx.lifecycle.repeatOnLifecycle class ScanningActivity : BaseActivity() { - companion object { -// val KEY_SCAN_TYPE = "scan_type" -// val VALUE_SCAN_TYPE_photo = 0 -// val VALUE_SCAN_TYPE_deleted_photo = 1 -// val VALUE_SCAN_TYPE_video = 2 -// val VALUE_SCAN_TYPE_deleted_video = 3 -// val VALUE_SCAN_TYPE_audio = 4 -// val VALUE_SCAN_TYPE_deleted_audio = 5 -// val VALUE_SCAN_TYPE_documents = 6 -// val VALUE_SCAN_TYPE_deleted_documents = 7 - } private var scanType: Int = VALUE_SCAN_TYPE_photo override fun inflateBinding(inflater: LayoutInflater): ActivityScanningBinding = @@ -53,7 +46,7 @@ class ScanningActivity : BaseActivity() { VALUE_SCAN_TYPE_photo, VALUE_SCAN_TYPE_video, VALUE_SCAN_TYPE_audio, VALUE_SCAN_TYPE_documents -> scanAll() VALUE_SCAN_TYPE_deleted_photo, VALUE_SCAN_TYPE_deleted_video, VALUE_SCAN_TYPE_deleted_audio, VALUE_SCAN_TYPE_deleted_documents -> scanDeleted() } - binding.scanProgress.setCenterImage(R.drawable.im_photo_center_image) + binding.imageViewBack.setOnClickListener { finish() } } @@ -65,41 +58,49 @@ class ScanningActivity : BaseActivity() { VALUE_SCAN_TYPE_photo -> { title.text = getString(R.string.photo_title) tvScanDescribe.text = getString(R.string.describe_photos) + scanProgress.setCenterImage(R.drawable.im_photo_center_image) } VALUE_SCAN_TYPE_deleted_photo -> { title.text = getString(R.string.photo_title) tvScanDescribe.text = getString(R.string.describe_delete_photos) + scanProgress.setCenterImage(R.drawable.im_photo_center_image) } VALUE_SCAN_TYPE_video -> { title.text = getString(R.string.video_title) tvScanDescribe.text = getString(R.string.describe_videos) + scanProgress.setCenterImage(R.drawable.im_video_center_image) } VALUE_SCAN_TYPE_deleted_video -> { title.text = getString(R.string.video_title) tvScanDescribe.text = getString(R.string.describe_delete_videos) + scanProgress.setCenterImage(R.drawable.im_video_center_image) } VALUE_SCAN_TYPE_audio -> { title.text = getString(R.string.audio_title) tvScanDescribe.text = getString(R.string.describe_audios) + scanProgress.setCenterImage(R.drawable.im_audio_center_image) } VALUE_SCAN_TYPE_deleted_audio -> { title.text = getString(R.string.audio_title) tvScanDescribe.text = getString(R.string.describe_delete_audios) + scanProgress.setCenterImage(R.drawable.im_audio_center_image) } VALUE_SCAN_TYPE_documents -> { title.text = getString(R.string.document_title) tvScanDescribe.text = getString(R.string.describe_documents) + scanProgress.setCenterImage(R.drawable.im_documents_center_image) } VALUE_SCAN_TYPE_deleted_documents -> { title.text = getString(R.string.document_title) tvScanDescribe.text = getString(R.string.describe_delete_documents) + scanProgress.setCenterImage(R.drawable.im_documents_center_image) } } } @@ -110,15 +111,18 @@ class ScanningActivity : BaseActivity() { private fun scanAll() { val total = 800 lifecycleScope.launch { - val root = Environment.getExternalStorageDirectory() - ScanManager.scanAllDocuments(this@ScanningActivity,root, type = scanType).flowOn(Dispatchers.IO).collect { - when (it) { - is ScanState.Progress -> { - updateProgress(it) - } + repeatOnLifecycle(Lifecycle.State.STARTED) { + val root = Environment.getExternalStorageDirectory() + ScanManager.scanAllDocuments(this@ScanningActivity, root, type = scanType) + .flowOn(Dispatchers.IO).collect { + when (it) { + is ScanState.Progress -> { + updateProgress(it) + } - is ScanState.Complete -> { - updateComplete(it) + is ScanState.Complete -> { + updateComplete(it) + } } } } @@ -129,20 +133,23 @@ class ScanningActivity : BaseActivity() { private fun scanDeleted() { lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + val root = Environment.getExternalStorageDirectory() + ScanManager.scanHiddenPhotoAsync(this@ScanningActivity, root, type = scanType) + .flowOn(Dispatchers.IO).collect { + when (it) { + is ScanState.Progress -> { + updateProgress(it) - val root = Environment.getExternalStorageDirectory() - ScanManager.scanHiddenPhotoAsync(this@ScanningActivity,root, type = scanType).flowOn(Dispatchers.IO).collect { - when (it) { - is ScanState.Progress -> { - updateProgress(it) + } - } - - is ScanState.Complete -> { - updateComplete(it) + is ScanState.Complete -> { + updateComplete(it) + } } } } + } } @@ -166,27 +173,32 @@ class ScanningActivity : BaseActivity() { } + @SuppressLint("SetTextI18n") private fun updateComplete(scanState: ScanState.Complete) { - binding.scanProgress.setProgress(100) - scanState.let { - startActivity( - Intent( - this@ScanningActivity, - ScanResultDisplayActivity::class.java - ).apply { - putParcelableArrayListExtra( - ScanResultDisplayActivity.KEY_SCAN_RESULT, - it.result - ) - }) - ScanManager.showLog( - "HiddenScan", - "完成: ${it.result.size}" - ) - + binding.run { + scanProgress.setProgress(100) + scanState.let { + val size = it.result.size + if (size == 0) { + tvScanDescribe.text.let { + tvEmptyTypeFile.text = "0 $it" + tvSorry.text = getString(R.string.not_found,it) + } + relativeScanFinishedEmpty.isVisible = true + linearCounts.isVisible = false + }else{ + finish() + startActivity(Intent(this@ScanningActivity, ScanResultDisplayActivity::class.java).apply { + putParcelableArrayListExtra( + ScanResultDisplayActivity.KEY_SCAN_RESULT, + it.result + ) + putExtra(KEY_SCAN_TYPE, scanType) + }) + } + ScanManager.showLog("HiddenScan", "完成: ${it.result.size}") + } } - finish() - } } \ No newline at end of file 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 673230b..a927d39 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 @@ -1,8 +1,10 @@ package com.ux.video.file.filerecovery.utils +import android.annotation.SuppressLint import android.content.Context import android.icu.text.SimpleDateFormat import android.icu.util.Calendar +import android.media.MediaMetadataRetriever import android.os.Environment import android.util.Log import android.view.View @@ -265,6 +267,36 @@ object Common { } + + fun getMediaDuration(filePath: String): Long { + val retriever = MediaMetadataRetriever() + return try { + retriever.setDataSource(filePath) + val durationStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION) + durationStr?.toLongOrNull() ?: 0L // 单位:毫秒 + } catch (e: Exception) { + e.printStackTrace() + 0L + } finally { + retriever.release() + } + } + + + fun formatDuration(ms: Long): String { + val totalSeconds = ms / 1000 + val hours = totalSeconds / 3600 + val minutes = (totalSeconds % 3600) / 60 + val seconds = totalSeconds % 60 + + return if (hours > 0) { + String.format("%02d:%02d:%02d", hours, minutes, seconds) + } else { + String.format("%02d:%02d", minutes, seconds) + } + } + + fun getFormatDate(time: Long): String { return dateFormat.format(Date(time)) } 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 cb07409..5a60590 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 @@ -40,21 +40,6 @@ object ExtendFunctions { } - /** - * 按时间筛选:最近 N 个月 - */ -// fun List.filterWithinMonthsList(months: Int): List { -// if (months == -1) return this -// val today = Calendar.getInstance() -// val monthsAgo = Calendar.getInstance().apply { -// add(Calendar.MONTH, -months) -// } -// return this.filter { -// val cal = Calendar.getInstance().apply { timeInMillis = it.lastModified } -// !cal.before(monthsAgo) && !cal.after(today) -// } -// } - fun List.filterWithinDateRangeList( months: Int = -1, startDate: Date? = null, @@ -64,10 +49,9 @@ object ExtendFunctions { val today = Calendar.getInstance() return when { - // ✅ 1. -1 表示不过滤,返回全部 + months == -1 -> this - // ✅ 2. 0 表示仅根据 startDate / endDate 筛选 months == 0 -> this.filter { file -> val date = Date(file.lastModified) when { @@ -78,7 +62,6 @@ object ExtendFunctions { } } - // ✅ 3. 其他情况:按“最近 N 个月”筛选 else -> { val monthsAgo = Calendar.getInstance().apply { add(Calendar.MONTH, -months) @@ -95,32 +78,7 @@ object ExtendFunctions { - /** - * 按文件大小筛选:区间 [minSize, maxSize] - */ - fun List.filterBySizeList( - minSize: Long, - maxSize: Long - ): List { - if (minSize == -1L) return this - return this.filter { it.size in minSize..maxSize } - } - /** - * 按时间筛选:最近 N 个月 - */ -// fun List>>.filterWithinMonths(months: Int): List>> { -// if (months == -1) return this -// val sdf = Common.dateFormat -// val today = Calendar.getInstance() -// val monthsAgo = Calendar.getInstance().apply { -// add(Calendar.MONTH, -months) -// } -// return this.filter { (dayStr, _) -> -// val day = sdf.parse(dayStr) -// day != null && !day.before(monthsAgo.time) && !day.after(today.time) -// } -// } fun List>>.filterWithinDateRange( months: Int = -1, startDate: Date? = null, @@ -136,10 +94,10 @@ object ExtendFunctions { } return when { - // -1 表示不过滤,返回全部 + months == -1 -> this - // 0 表示只用日期范围过滤 + months == 0 -> this.filter { (dayStr, _) -> val day = sdf.parse(dayStr) ?: return@filter false when { @@ -150,22 +108,37 @@ object ExtendFunctions { } } - // 其他情况:按“最近 N 个月”过滤 + else -> this.filter { (dayStr, _) -> val day = sdf.parse(dayStr) ?: return@filter false !day.before(monthsAgo.time) && !day.after(today.time) } } } - - - - - - + /** + * 按文件大小筛选:区间 [minSize, maxSize] + */ + fun List.filterBySizeList( + minSize: Long, + maxSize: Long + ): List { + if (minSize == -1L) return this + return this.filter { it.size in minSize..maxSize } + } /** - * 分组数据:按大小筛选 + * 按文件大小筛选:区间 [minSize, maxSize] + */ + fun List.filterByDurationList( + minSize: Long, + maxSize: Long + ): List { + if (minSize == -1L) return this + return this.filter { it.duration in minSize..maxSize } + } + + /** + * 分组数据:按大小筛选 ,图片和文件筛选文件大小 */ fun List>>.filterBySize( minSize: Long, @@ -177,10 +150,34 @@ object ExtendFunctions { if (filtered.isNotEmpty()) date to filtered else null } } + + /** + * 分组数据:按大小筛选 ,音视频筛选时长 + */ + fun List>>.filterByDuration( + minSize: Long, + maxSize: Long + ): List>> { + if (minSize == -1L) return this + return this.mapNotNull { (date, files) -> + val filtered = files.filter { it.duration in minSize..maxSize } + if (filtered.isNotEmpty()) date to filtered else null + } + } + + fun Int.mbToBytes(): Long { return this * 1000L * 1000L } + fun Int.kbToBytes(): Long { + return this * 1000L + } + + fun Int.minutesToMillisecond(): Long { + return this * 60 * 1000L + } + /** * 移除掉缩略图后的数据 */ 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 d4eb704..8e7dc8b 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 @@ -3,6 +3,7 @@ package com.ux.video.file.filerecovery.utils import android.content.Context import android.graphics.BitmapFactory +import android.media.MediaMetadataRetriever import android.net.Uri import android.os.Build import android.os.Environment @@ -22,6 +23,8 @@ import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_photo import com.ux.video.file.filerecovery.utils.Common.VALUE_SCAN_TYPE_video import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn @@ -63,9 +66,12 @@ object ScanManager { val result = mutableMapOf>() var fileCount = 0 suspend fun scanDocuments(dir: File, depth: Int) { + val context = currentCoroutineContext() + if (!dir.exists() || !dir.isDirectory) return if (depth > maxDepth || fileCount >= maxFiles) return dir.listFiles()?.forEach { file -> + context.ensureActive() if (file.isDirectory) { scanDocuments(file, depth + 1) } else { @@ -107,11 +113,12 @@ object ScanManager { name = file.name, path = file.absolutePath, size = file.length(), - sizeString = android.text.format.Formatter.formatFileSize(context, file.length()), + sizeString = android.text.format.Formatter.formatFileSize( + context, + file.length() + ), lastModified = file.lastModified(), - resolution = getImageSize(file).run { - "$first*$second" - } + resolution = getResolution(type,file) ) } ResultPhotos(dir, ArrayList(resultPhotosFilesList)) @@ -128,6 +135,25 @@ object ScanManager { return Pair(width, height) } + + fun getVideoResolution(filePath: String): Pair { + val retriever = MediaMetadataRetriever() + return try { + retriever.setDataSource(filePath) + val width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH) + ?.toIntOrNull() ?: 0 + val height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT) + ?.toIntOrNull() ?: 0 + width to height + } catch (e: Exception) { + e.printStackTrace() + 0 to 0 + } finally { + retriever.release() + } + } + + /** * 递归扫描隐藏目录下的有效图片(删除的图片) * @param maxDepth // 最大递归深度 @@ -141,6 +167,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 @@ -192,11 +219,12 @@ object ScanManager { name = file.name, path = file.absolutePath, size = file.length(), - sizeString = android.text.format.Formatter.formatFileSize(context, file.length()), + sizeString = android.text.format.Formatter.formatFileSize( + context, + file.length() + ), lastModified = file.lastModified(), - resolution = getImageSize(file).run { - "$first*$second" - } + resolution = getResolution(type,file) ) } @@ -217,6 +245,22 @@ object ScanManager { return file.length() // fallback } + private fun getResolution(type: Int,file: File): String { + return when (type) { + VALUE_SCAN_TYPE_photo, VALUE_SCAN_TYPE_deleted_photo -> { + getImageSize(file).run { + "$first*$second" + } + } + + VALUE_SCAN_TYPE_video, VALUE_SCAN_TYPE_deleted_video -> getVideoResolution(file.path).run { + "$first*$second" + } + + else -> "" + } + } + private fun isFormatFile(file: File, types: List): Boolean { val ext = file.extension.lowercase() return types.contains(ext) 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 new file mode 100644 index 0000000..7231b0f --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt @@ -0,0 +1,183 @@ +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.success.RecoverySuccessActivity +import com.ux.video.file.filerecovery.utils.Common + +class VideoPlayActivity : BaseActivity() { + + companion object { + val KEY_DATA = "key_data" + } + + private lateinit var player: ExoPlayer + private var myData: ResultPhotosFiles? = null + private val updateHandler = Handler(Looper.getMainLooper()) + override fun inflateBinding(inflater: LayoutInflater): ActivityVideoPlayBinding = + ActivityVideoPlayBinding.inflate(inflater) + + override fun initView() { + super.initView() + } + + override fun addPadding(): Boolean = false + + override fun initData() { + super.initData() + myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(KEY_DATA, ResultPhotosFiles::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(KEY_DATA) + } + initPlayer() + binding.run { + myData?.let { resultPhotosFiles-> + imageBack.setOnClickListener { finish() } + playImage.setOnClickListener { + if (player.playbackState == Player.STATE_ENDED) { + player.seekTo(0) + } + if (!player.isPlaying) { + player.play() + it.isSelected = true + } else { + player.pause() + it.isSelected = false + } + } + seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged( + seekBar: SeekBar?, + progress: Int, + fromUser: Boolean + ) { + if (fromUser) { + val newPosition = progress * player.duration / 100 + player.seekTo(newPosition) + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + + } + + }) + startProgressUpdater() + layoutBottom.tvLeft.run { + text = resources.getString(R.string.delete) + setOnClickListener { + RecoverOrDeleteManager.showConfirmDeleteDialog( + true, + supportFragmentManager, + lifecycleScope, + setOf(resultPhotosFiles) + ) { count -> + complete(count, 1) + } + } + } + + layoutBottom.tvRight.run { + text = resources.getString(R.string.recover) + setOnClickListener { + RecoverOrDeleteManager.showRecoveringDialog( + supportFragmentManager, + lifecycleScope, + setOf(resultPhotosFiles) + ) { count -> + complete(count, 0) + } + } + } + } + } + } + + private fun startProgressUpdater() { + updateHandler.post(object : Runnable { + override fun run() { + if (player.isPlaying || player.isLoading) { + val pos = player.currentPosition + val dur = player.duration.takeIf { it > 0 } ?: 1L + val progress = (pos * 100 / dur).toInt() + binding.seekBar.progress = progress + + binding.textTimeCurrent.text = Common.formatDuration(pos) + binding.textTimeTotal.text = Common.formatDuration(dur) + } + updateHandler.postDelayed(this, 500) + } + }) + } + + private fun initPlayer() { + myData?.let { + player = ExoPlayer.Builder(this).build() + binding.playerView.player = player + val mediaItem = MediaItem.fromUri(Uri.fromFile(it.targetFile)) + player.addListener(object : Player.Listener { + override fun onPlaybackStateChanged(playbackState: Int) { + super.onPlaybackStateChanged(playbackState) + when (playbackState) { + Player.STATE_IDLE -> { + + } + + Player.STATE_BUFFERING -> { + + } + + Player.STATE_READY -> { + + } + + Player.STATE_ENDED -> { + binding.playImage.isSelected = false + } + } + + } + }) + player.setMediaItem(mediaItem) + player.prepare() + } + + } + + + private fun complete(number: Int, type: Int) { + finish() + startActivity(Intent(this@VideoPlayActivity, RecoverySuccessActivity::class.java).apply { + putExtra(RecoverySuccessActivity.KEY_SUCCESS_COUNT, number) + putExtra(RecoverySuccessActivity.KEY_SUCCESS_TYPE, type) + }) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/back_white.png b/app/src/main/res/drawable/back_white.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7a0d9763dcb33f0c55933c0bb102a459e2bc3d GIT binary patch literal 497 zcmVA>0bfJY2i*3aIF(SgPW?>9CN zr_rW!c#Y#YppK|t6vqeN21c6$5VS+k3H5~9qBx%McEY*A6o3GR9}#v9#&jM$_HG7P z3BM|KCV<3nBDQisMmPaqQb1<-9|W&5KtcGS@B6a^P#FHx;Z+T&2}gcc1*i?L0w}_Z z0jlsKfHFKApbpOhScE47tiqE3mf@=a>+mSRBYY9y75)(58GZ-w4!;4k2%iD1!Y2U2 zxjMz3}}V80klBe0lX0p z0iK9OfEOYP@Ib5rtPx27OGGlj3Xuh{Kx6~dh$4UzQ4CNassIW^HJ}zD0aPHg`vnC} zjefr%6JfJokb%(e7x4eUNM3WCc3-F`tB9L_I@J&t{%I2inm$sXs<{{R30 n|Nok9beaGF00v1!K~w_(GpIWXU+^~H00000NkvXXu0mjfFgn87 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_finished.png b/app/src/main/res/drawable/icon_finished.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7b43ecf4b4f0f93e0c09f29680f632abdc6934 GIT binary patch literal 7138 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_info_pause.png b/app/src/main/res/drawable/icon_info_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..1a537556509c07b03ea799eadeef3321ee2affec GIT binary patch literal 13154 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_info_play.png b/app/src/main/res/drawable/icon_info_play.png new file mode 100644 index 0000000000000000000000000000000000000000..e293c449dae9be178970435baf7ff38d4a5bcf29 GIT binary patch literal 8596 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_item_audio_play.png b/app/src/main/res/drawable/icon_item_audio_play.png new file mode 100644 index 0000000000000000000000000000000000000000..baf4e3ba9a8c9cc1ecb66f8e3dc910480f2198f4 GIT binary patch literal 2964 zcmV;F3v2X=P)-4hs20Dednj31bN8MZ19W={Y<0h<%xoB(nH zoTrTe7f#iBt88XQ(N~=|y`cX8PwJ6s#E5SF{eAlPlUhZ^8 zpy$o=8tef(B7whMuVepu8^a$)7+#;?;N}bmw^!N^Z|^X?k)L{XjOT|p7b@;Kn1*Q& zes~GyC({BalicdKy3*$tRlLxEDT!LutR(^05xDpc)LE;WH;c8p+hr7pG$e0}?+ z?Xc|xynnNagX>c)P8C!oP%YSUOd3qJ4k=GV*taLPg0>5=2CMqL0Ot_m%f?J^?bPMA z22D%DHq@Sf`3&s}aY>jH-(R7Wb;(mHw8f zWxlGo0T!ofO;-4J5URhoeubMMin~y$65LROG-eX(7kbf zz`SzU*_W(W1Id0;dA`QS4@(#?3qWo_%5T-Net*b-EONFoKj4B_PR{bnMU(P-%qANO z>zP8qfai6HoMYZ zJ=l7mI;)rtSWI5J($+%t?2|SJL8_S!G6a)p0y5IueYy|YEQ7zK2{{??=xzX-fV9+o zI2UQN#8;|0;iQQQIP)Q+lvSo=z`so0A3YbLbhLb|?wi$gC%%JgZt*^`D@_J0X7dG@ zP_;HMZ^1Qfo*{7{oD5isKVx2CkWwRyb!O3i|GG}S4MN|^u{#>nt4TLKbY zZT2%VO9GtTkU5G`sHwkuc3CKX!;wAUx&=I1vTDiE1Fjozfu|1YF4~k|5@4&YLQ}=9 zJ*MB?)Jg4(%n|?#W8_Y%?Mk8CRWZChLuU`ho0%m5c15a|)RS*UTby1gxQRO}8n3C8 zMx{&wY}H7xap9CLAktdC4zK&Ug93o%^uJ}>JU8iv*W2h?YvaNe()ci*S%U?Pk>MTm zPa5f$iii_sl8uuK-H1v4+f=R@Fhm}}ru_PSZ203Yg6Rcp+|DExE=YF_t0u4!$& z{XZ`xTH9p6T=q(_?eYAb4!f$gkUl3hCBFkPw%2%|XgmoM!a z-l*w3i)W(>i&3bVwe&>UfIojmGi_XoO3&J&v%{N1=yxfiU(a0S_{G0$zWzGS6&sHekk*Dl>lD;un9-ex*QPwKiffyU(@%Iv?OS%indkV?Sz9 z{5#my>$34fQJA|LhqqVi-yUkMY85{m_;LWuaE8wZn3+iAx?&i$1wT;hvghEdYnFD_bj-5Tj-Zw7+YAR2oDEq4>b#z)g|Pkl{LW6cp-9}q5AmqR+-hID2u$`%>#~VGJdfKiLcbZ zs?Sk>=kufPag_`>Lv_5?iX7SlOrV@soy}>#%;iLf!zB$y| zqvcjiGDRHs?E{WV=an1|zYo#TNQ6|m+)6}P@f;Xd_owPyc>bME!?c9SyvEB*pygm0v?45%sT}ie0yYVmllFu@ z{=-PE&g`gr&n*q;=*61)CM==8<9-P|N6$BwjaPQSw1mmLOl3HDEO4;SzRCq8-~ks9 zmWxq6U>B(ssB>$83)IO+tx*F10{{U3|Df9h$^ZZW21!IgR09AdwFNEOv!JN}0000< KMNUMnLSTZ#rkIQX literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_small_audio.png b/app/src/main/res/drawable/icon_small_audio.png new file mode 100644 index 0000000000000000000000000000000000000000..3922693c1e01ffb86ed92445a9b84f0f21012fe9 GIT binary patch literal 2018 zcmV<82Oao{P)Vhj8=HVlz%C$BVIi7W#tpFvC~@p!Z0Fsc-<=QV&AfT@KIemWGRHUf-gD1Azu!IQ zzV{AMVLpFivB}WH#B|TZ#O={&bb3A-op}>v;TyeULrlXEu7Iln<*E-)re(bWhT^~tddq&vizm~UtZ5Gm7}vDoxvEH=|Y z^F050MgZ+rGdVd#yZtT@2rLo^047kbeGUo1dV~;*Q5iY2VOq-zyV5b&1duZlcrX~) zBqxVCXU)vN4*}PvXf34C2(3+RcZ<0qfWrI+Ia3MXI+Pib2Pj1-DrUpFL7NRn1b}%8 zM}+xk#u=N-dZtbhpiPl4oAAkrRoet)cKr!0=F6c(cAb1f6b(p=0lSlJ5kO3jaL%i} z>!mQ_>>0s9TuQ;H-!cJox=)e;+YHm3ihgkrXMDA^t|bDZ^zgzt>tS{Bfv@n{io0bA zNV6#)P^{RiAsull?Yp^4rUW3Lz^1v0+8u@O(dhJunTI6_z-f0;57!AmD{c;@F%_#C57L>qutODWG7A>XI)+2v1`|Ulyc@w8$-Vfe~=2z`SW!IP?&i23Y))% z<=+685BlucHg@#rXA(5VT3e5^&d#qb+cQvX4h9w7fv9Aau={lCBmA>n6}dJw9boP4 zCv!WU1zl?KmXZrB5Y}82h;WXB~HWMHNfF&PxI~*L=}xCPB~6&a>s^RkpSDC)?hB=hh9~d`g2ZbSQKp zBJ?3>S4Fl6^wQEQo1Oicfd9%?SJxzHpPdQeZx+hFefvAZ2+K*jd*<%_cHg@fzx;X|^{ckI|# z?8uQrrdC6t&rQb*2X}V7sSOCBJyUvnBRB&fh3i;uBYfS|><=Dnw7eE-2j09)i8!!R z3NR*wxNq5m0!18HZo~Ke`ws-hmlNzFK$g>k&K6aH zVRwg4dyj!*`Ca-mz;E~g$q_I(7(oiyjsomX!lam)q!3rOKkG-1 z0CYHsf+VE?@^fivg=+Voa(sLHt*q~(0J^re0rM3R^F>6Qiom1!IywRn1)TGn`3hEk zgM{_<4K_FT3yZ~Oq~JHA17lWfR7htyfA_JbjsSG1YBw>IzDJ_HcSOWhH7sv^`Iw3b zz#!-UL?~BqCZJjO0xWd!bs7ONBmiN;9i)QM0=3WwEWl*siy;9}R4EmRIoo#y%&jFM z3^#$LlusoIz=XcO@PMX?qP)RaJqUa!47rCMBcDwPz=Z49!}$L?p4ALsvoa!{!uN7( zl_dZMh{e-j6Tj<0;H#>JPh0WT5&Wd$`xBBF<+h4WMkIe!s5N8|VCiiawrb0eM^y9dCCCd^gU?v~!(@IZfm zMAq=ghVJXO@h<=X0RR88Gg(*w000I_L_t&o06OszFJ=041poj507*qoM6N<$f+6jv AYXATM literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_type_photo.png b/app/src/main/res/drawable/icon_type_photo.png new file mode 100644 index 0000000000000000000000000000000000000000..bad1d06b9b5b2a3574783b2d91f67f97889dc73d GIT binary patch literal 1732 zcmb7F`#YNl8-Cx{8n7&=VrP!+bI{npMY4iP$QwQ;7EIiE@#S|KfomDXXkZ&Xtn zY3HjN!sdMH54u3 zQMrV_%RzW(Xsa~JS?dxL9>8bv<^-4zCI{Zo4K;dXY%USS0*KQ0S1lMQUlw6;sfNza z;pJM=al4=Gn%b{uGf+vCZG6DAE9j>z=2^P0ckj_#s_fF8K^9-xGkj3pHhK4aW#|*g zvMlfnB#$HNzMjj4Zb=&=DowQ{ z#8zCG3ducYlzTI1Lg~kX)i`kPXc8`ufx>`4(R9|pd~-ZFMq&({ycjQ?QbManLM$L3 zrSsWBHeU}x2?-sN0LDIBVLHpMGIBmW{Yd^=c%Qt{i9k(x=3F1(I1+mWD5C?zEEQf1 zXX(}QStdVPo8ZgbyLc~qYku~Sk#xZ_XL;3EUuxLViZTgm%N9!#%a;vSXLfE_Lv<&^ z(f`+%7v)f!%crWUoo-Z5ko3U8L2XUIxL*KGkSzDS;na@N_u<#aY5w9x5=ZW#=1Wsgj?gE=2aaX zIQPiq_%Z%Y)OhsVyWH||_Wq?ia?@S^;Buq@s>9DYI9tq$3Rm^Mvf#HRFzne-RPw3Q z$r~TLr6qauSNYwrm{Pk9>DhDBkXji9Wl9;$8hw`BH#;a)`}sq*(OS#~PJKY;8J6&v|8nV`HSE|RYU$W+ z%8t@zK(LNxP~Wbr=&~EIe?b})*@Kqr(x#UJXX zN&WUcBaH}-En8a>VdL!Bwhm3Ievfg9YOEa!Cl;^B;p)YL*Zl9;{pMK#RsM`dQsr^` z{!DI;E_pH5oFTTK!luY%9T|EM($W2p*kEl<_WAzxEePqH`P2P4gX|(D4Gqdmg%mPN zk>AV*{_-RkggIG<3)sZuy4w0~Z-x5G=WTLrTCnxSHlThoq4$@XN0AxFME+qBJCiAysn|2)5O#XZk;6z$ynrNRfHU(zLu2b}; zAB$BL*DO1=vKpLcpyn4tXz>S1{30DBV6Yu^%`FBAak7RuH8Re{A9xn&s_U*b&v{4m z5npUr(P|A+8u6de0Z%CdVXA01;Zao8Q^nWc8(m}yygPsY@_`>1c8O1d$25ZJ9zb>X z{W8NfqdMWZIb-xL&MX@qJ#mU;QX;~>3lx6-#{Ri*=?j&G{t+96`%u6(9ZWsGf<_3_GqDwWgic@})XH2)sIaoEe8#ae*9U{>YaKjeES5MEqa(f_J|{HJ)(hcN)7 zu_;b`*wW_#Rr-xa&L$IMgnO#7pVVOdDl&BH^~YUnS=V8(S$5(Kfy9{^^4 zp4-YhTD76*NZOKPe^*S0s2{K(49kZfZvzh{ndhO&*6;Omqwi0+2v)c^W3X5}1I6Xt zPTbs$1C`U;kTpmaP(yuFngprg+4LP3MFbrjNIDDc6h!&25K;mJmlHP3Z!P>+u>rh^ LXFZzSD0zPZZl)DS literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_type_video.png b/app/src/main/res/drawable/icon_type_video.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f7ca09ac4260d56f8950362b1cf45ee47a3182 GIT binary patch literal 2121 zcmV-P2)6f$P)NSFaa<@!UVtsq!U0VfKC9N0GI%nAe?_917tpLD~015yB7=V5iB%dT7B(IH}DL*yxNcjUJ z_mtl;V$a!}`cG6w+n37UNZv`ls!xQzAQOTZLpEYoBR~_sC1J8yCLjYgpa2kn0q7b) z&Q3^&8U^>L*jOuiUjc`dAWb)LK38>%) zF&;%i5&;6AYvXG9K@LtJfw&m1(JF~1K;RQ}xW;d(s2^JhaH|EZTBo}|MiZdsSbnr( z)j!rmVCHs4)cm6ekoEHgBxz|y^}gRq+)l?}2WJ>XfV7-RYDzgEKbJtnRhK&cEa7VGu1;){ z2#vd$JkR10pxQYeuwMvh+>W~Ulgca+_f`5?vekqkIb-i4Ajg-lDC-sxA0XYyie7Xdk3&?rzu1aDSzc^9>UMs+f8 zqy8YQ089mB-fkDvCK7CXU`3Qp1n-L)TML zmRlM}PXHEXNO;BZ3exL>oWd0bQ&Jc2a}1`gfS;&miGOVZ@P|K#bX-Skt$qjNN`Q>a z+y!3iHOyWDG@Ro~27G>cwblx706yv!An^IoAwM+d!M_8{S|8d3d>`NOc3KK}_AO%T z9Dd8Sw&gqDH`)Yj2gMO174W>91L%P7J)a$+a!eD)$lC-s?2OS~VjBU^qd~y4(FI;PLY%0dK)%O!nB@H#GQm+D(hX4-D}5 zcx3GW8-vc5W~FuvaF$22V(G^MzJvf91C!(C9RhS$kit!oAmB?1utNlV6UGj{4gsb$ zB$&gpGl9<*nE2FE0_+fAo{R4y;Qt{l3zR4MY5{KpEN?uNaAgwq)ixGZ_~s=&%1OH;8jZOWK8ulf$O|6)>NW00xZvO0X~YXX8VGUJ>%{o zAj^{>fyB<|Je$?wbrSH+0K56^auk3)Y&`;0i71_872wO+fslQhA%oind)k5510OT< z2;ijTUrDY65xAM4OUgB{iT(c9)jmYP+pfy>+$02&Rsg{QS2U@|+V}{o*Aq{<<9wN0%#@0JQRs$mo`Tx&xKLajm#th08sQD4yDjZluTFWE?=v5@}jgMcLY;_|&rja68JuV0EC$Ij=1lW;_2)=xU^@^IY`zK+dsz`z7O(l;*4*&-vl`dz1ZbdFNrSa3!p4YM2Y%Jb za{mCG2U1*Qu$3}K#ktvgT#NuaQW5c9aw=g}Kn5;~$=NEUBR}K9g%A?kbyNZxr5F@2)DbLIHW8(S@lPv55UHs(>H+QUa<718sp-iGYBiI5@0*E zxh4xCuaq-!NV%;tggtx!27p*G5CmY5WQEH>fV5)IlT#O=Ejoxt=mca7HvXKxR|Q=2 zb5d3UoROFhB7+|>u%i{g01zt%f&dJXtZ+2~pjPa8a_SQ_00v1!K~w_(;!B_3R&LpB00000NkvXXu0mjfnRmpv literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/im_audio_center_image.png b/app/src/main/res/drawable/im_audio_center_image.png new file mode 100644 index 0000000000000000000000000000000000000000..5b6561c10e5a5926de7c7ee64772ea326da77430 GIT binary patch literal 18110 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 IM6N<$f{d@C=l}o! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/im_documents_center_image.png b/app/src/main/res/drawable/im_documents_center_image.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa07087da152785f2e40df19de232808af54658 GIT binary patch literal 16902 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 Vjea{XB=`iPuB@X}s$d=Ze*hc$z~=w} literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/im_video_center_image.png b/app/src/main/res/drawable/im_video_center_image.png new file mode 100644 index 0000000000000000000000000000000000000000..08ef0fc5a666aa27fcbe27ccad543bfeae6c9f90 GIT binary patch literal 18824 zcmYIw1ys}T_y0Bqj8H}+-Keyrf-t&7P^4>g3rhDUl2TIAASm4p5|b85=^h~6-S8iN zzQ6N72hQQVpT70nd!N@ORQ;vGJ$!0>003}LNm2GS002ba{X%dsUwlWJ;{gCDKuK2W zjR$Zm%`S#kGdU;9`x_60m8{q@FQ?}ro~(YYZbY@98BWY`lsqSu4)71YdNH6J1jh~` zhm``3ql96G!uj-t<+j<-Bux!XL&`O%2$E+(V)Zy&QO>fnqpfuH;A5bbtbAR@q3^)z zf}_tWMg9T~5K{FL?ri6BkX<~qo{|yS?|U%079S-+XL#dbcXXl9a&s`%mEn7S(l?#$ z{%QMgC|G3sl`8O3 zrc}SGsk#3VpAi5I063GtGTDK62_Ib_7m$dA&dBc7u!fup2q+6w#uN4CDD_^hqZ(7p zSGEOJ=M`g)j%N~ocO;~IasHtj`*PrIC_jhluW9r7*(Hbi)i*i9`t6)2x4#Q2^Yn#v z^#6?b=-7|RPud3RnYIY+FZiB+<0Z^k`yD`TcW(cC@jehT!U(Mej03v9z9WuCZ-o{0 z=@i2r#m=OL75@M2yi@}ZDZq0%BpR7Bjsk!F8y;HaQ)?_J+_7l(TNYHzrB~$RLXpBW zCdS*GkZMsqGYSdm|)ioEv^v#;h-eW%G`5ORF|hKYWum^D~4>*KIIST zrG*?<#~b^OiMP9jx4K*80R^s3v|t|&1mKchYKvD6MtNal$q6jeXR7HG&R1r%XDXdg zz0Ns7dVd19pOGI+e!4DtxcMpCbi{O)>>e-|!iahqh-H?{%=l9?=(v14Wdz1-xE3F{ z9ahXw0&45S1BG>PhDDf~x6m$!C7GUvI(${{Ej~-U5<}yG8nt#J>EyBfT3`ar4O2Hki7bX z`5Jl0hx&iy^e8uFKiGxi;5>Lsfah@hdxJCU5v=r3`he%<{Hx6v6VfQgR@0Z@bO zp(TJ8^$fnx8tf~-x(i{;_r>d4mMqtMPC9)GLztHMnWterqqMI)zRa+XFd8=Hc!fmi zmf|s@jDmT6mV{2-gny43=%?H>9D6vu*VNVa1kAqL%E>M;UOf@2Co7n#vf4kh zJF}W?y6^vF_V~ejSr)L{lciq!$s&(fpg{zmYYViCOBO*#pqRJvaC#I?rAqnuVwI|% z);6!{@V8~hY7SPNy`@2T&PhKW;Ykc;4;B+wd>6*G@~b25;@jhx5t3Y8Jt25x+4;p# zP659!>>D8iAMYFN>LA4SLLPguWwNiRNzgQ9*}Jm{q}ZC~7}t(Rt9uH8#I8GRvubA9 zY_m$V2oHg7W|BZ&BPsHeI(v-U%X07axKQ0`<^ciXM^|TfY~-Sj4dUJ~#2~MzKVC zJ3t>^gbK9zEDED>UbBN}6&X{U%(Og)S$&H`pFF|>b+-2bm?Fh)em5#0z6^!_eg07- z2DW5b3WhEk?ThI?1#Ow@H1OL#t9xACXKvm&%a@yQ2H85LVwzK9ox3GQL(C+}=ho2$ z5MuNbuonj(xoI(Du2$aMy;ej&M&Q#}c59`5CvsbVqYM1Zq_&|@pz3yIu{uLgeP*z@ zxxOp_Xe7&CHePL?PC+mjOt)~4tFDd|gdDCU@cM{`N))jp0Hv0HkLgL~)?+@85mVrn zLF;5tCZIs*rhrOiRokn_Hd6(&P_*VpabM%>Mv+>1N1GN zmLwJw4ZyMwJas)jTuG|8t&;+P=139=N3#4UrXf5c;`TtJ9dD;yioU*Dg%mB1`J4=q zy1hm9MsS#=O~k@k$an65X9SozTI+M`Clj56Xuyn6X5_G-N-((=c;e85$L8(Hj6iQN z0K7t+sp~~gE@>=-xDHQwr4c8u{AXs%2Eb1PI)=PR`942hooV!nc9s%jzIYFWHZ;dl z%q=xo*zCwiPriEKB1IvMS(Y~3Wu(DBOguvY-edz&HS)Q?yq@Dz>!cDLDCEYb*=Nx`onJ-q$O5XmgRb!;KwBO~-ClG=&=n~ZKghf-65BlVDP)gC z)VBrG+Z~)YuL7dt2FVFu?QiqyhARlt&O+h1STbXqaCJUB5Iu?Fi;INLh_z(Xx~B>N zpc@x!hR;a{XSkCa*TY0Cpg)AR>`f)xpWd?6W#E(R76jmwA)xicx~&%bgT{d;G1w$G zFaW5J_~FXE`Nrp7cFxW&74@c%^6z6#e7`9uQuA=ow{LT~i6A_~*j4@*ED% zgFm>~Ch?8%0|DR!sJe)D7En)6DMiBZ9)VLv$(crNvj0xuugS#UcN_yC(;<78^&2ixZd2!IIHo~GR7&0K9~Qhmt^ zL)$$N6oFs?huOt6373ak)B>dtVravoQ$LA|!IRU9$EvuE`5+K9PagJLr@~1=$W1d+ z8d0dOzm(`dOP$7f;q81_fp-z)3`M{o;2Z*X>mp^yP2Cn2XvWlKWL~VhH@F7>!kZhs zgIPud9Oh?|^SGLZ7hK2IeCy_Ygmc}*{nNEf=fww@HF$(KHSvi1B2d*%1al2m$@%YY z5B*5uA14%nV2Gbi`tTw!iFZbsj2MkmUNG<%>F~ZkX?~hfGwgi^fFkH6%4oPmLexZJ zM2N@5_{R|u@NG!V%NN&+AA^_khd#pL$nVDw)^C`HFb;J~T?>h4X|5Z@wosS8F^8z_rzZ63p-@c7}x#JsrOF_J+ zkD&A%-P=sj&yFRkLg7f}4f5%R1pvU(%y7B0nE=w2HdWcWH#)><@MZ4ao|AYY} zbR>ykd<1S7r>HR$KuNW7JB0VO#!j`QICUgQ4BX+h1Y}t%!tMU%6cfpLD9ZW z(0O0j86{=}>^Uf8599~gBcy6~$H7rEWJfqa_ab0SttsJ=bEG0*j}K-TH~M{a(&=`~ z(YYRE=8heLFVKP-aVI2l2yUX#U97%Ci>k`+Kj}b`q$qJmJZqODtQEZ7P9k8bS-`KyyKuOV+i*^-|vPKoP`(nII<|< z*9D)+jmO+d-htjdyi>TxV3+M`X4>P@hjN^#i|59Eqj^1DL1q{S93m)#3fmj4_EW1% zvQ2x$rVLCtv+Ohwn7M0%Wom;kE>*|l)*-w--WvH*rsgKUxjfoCYSDv87L4tEucy)} zSX0rrM)8Kl(pIGu>_Z2Ey8zI#R7SzI9WyRqky4)zpAz+aM0!VjFYwH?en5pwpZh??G53KH0(0Yb z{IS@`GoJU2yrV4um;qVSD@E3%0E^<5n*es-IlT|~)_SDTcXphS1eE(j=TV_Uf)PO( z#WehTVT~Gb4@PAf(e%J+2A}h#X=5YTfr?DBw|%`t3!2Mq7h4B!%~-3fXTW9AK7L~Cp5@AMpA*~+E-pWV&B zcmc2OxMRQqzYHk#!^D;3<6C+bQQDxQnj66f9_Ol7nv5O{m@@*v1*F}ihb4kpUU;(% z>+t|0oz?nFfp4YM`FFa9q6UvJh!2GbMQ*rjJA&&H-?u*-xK8IDxjP@mGtuLn%FS0Y zf|Mnb+qdja-|wOuW*lS%_Iv<QOZGQs{AJMMoV%IVOkac)fi%maNhhE~BIe7UM#*3=o zX($jPD~DRnv0er1*gc=FZ2KYfytwb5xqzXhq(w4%|1TE+DiN03B}M!F%3n{aPQQ!* zR?A={8WIb;=v-M@`=-+TlnrH>YFO!%cxcDubjMNvas`t2=;9~d(n!>~C<{t#((yvi zxo(^{l;v(+7^4B`VzM>L@443`IZ+xhT2O$Y0fa5~U)u{%z=)_o_c$Ifov<-$y?*>K zt>=zlAJtHnKUWRTJHE|fd*rTrqTl@RIm>0Fm&R-+Bnd%-RpCVm$1&=-Vsh$o=RyL& zi%jSqM3E7;2gjuaT2nmtdHP*frvQXQSo75BzZO2>-3DU(BE%gn=|JyDs0d$_&So^> zmEjmIhrY8Et^0Rt06?#Z2k~`%Eq^xQ@o^f-xu!31fm7KKChtfUHHP(7?0G>&TjN2g zHVXfI3CtpE@u>BvxBmH>RAM4o&cL|`9vxNL{Vb}1cZ|G`iMoj~j+Ph0rmQ;;iY963 zeXM!QKQ{#kse{3WWBf!v8*Wb}yu{X-bhLcIo8P>Eg9Jbb|FqLiDz3f-)&&zl*Wyt2 z7D`0APPPq=+gDSsz6iah1gA3ck@u4-i1hAFFddF}5v4E?MNv#UtI-Ke8F^g1J9PIy z{CGYY6_w)eaUxrO9W|_$Oqn58|KnQi^7g3dI;!$=y*@H+C;N$JjqvDq2fY^i&#D|n z4hltezqL3rO~Bx1tkG1?6`Ndj0zj>k6n3tLp@nlIqmB(E);=M9VjK_lCl-*O2gv&t`5>Yyj6&-)e+o(nU;HSruK4?R zZsUvyL{A(Yt%P8eCE>P+CwYXIK+k3>S-p74!r4k98k!dQ8S3?Sr6j+?P=auq66>6G z{_oO&-}{+vE8p^Hm|BPKgQ|AVT0lAsB?AiRb*T|m-~bgll9{*Ar-u@!a4~%jQ8r+$ zB1zHxJnG%^nC*4B=^si0yrVa%@lqh+rEjnB?q40AviGc&P>^Cm^?9T2*G~?61(U=iw z-Y2sBZ@-RD~*1 z*InivLh$!%%Aimich@2p{U9TD6qbd7UI@=Xdm*1*QOx{prH#NVBO-8=^=KB|J=oiq2`U;t=fk$h ztT4F<3c$C??Z0wjwzK!_=>&_azNVO4I}+S$c@pv3cVWFNX<*a;VbdXeN~9=!LTrh@ zP8$@eWbF8u;H@ko$;({4uHGywhcf?{ZuXnma(oq2Rz~317g$;>|3%cmCh1_@H*XGA z7Cb8!kT@UKh2MCTS)4*%%NO?5hcdfG!^3Z(X(|2Gp(Zbh6`h9_1zc=x=LF9ltA*z< zJa`M$k%v)=9yjHmJ5KsJG%6(BeOUe0ubP(q`()`kBm{wDHhbmb@^WC)z8X96r?%@} zmva%1eFJJ;nlftKV}lf!mhw!&wdBHFq~=5hF5YdFukY*twA|C2g?{vJ&^IM;0PZ&7j}+rO2jB-iSJdeMc+M=YWSlurx?T}(cq3=Ieoh`pj z-J+-mRPMNXm_TV2Co^BWGx1%XHRZF5->z^9mhxAgw!<)jAh}J|-x0@GF@G&I(iY z>;@w!M9vDkh>kU$R!e7^fJjWZ$A+BB$tWR6muRh>uwqtJ?8@qtb0%mZibeo@G+ju7 zPWs}358TCDqim>hDL9RkU4c>V6g+6yfEOu)Qo}3dwSeoO`>rkuFkg!hNB743e0`AK zGgpuBgtWK$-mmqOH8*04*-=Wzanq!!iMmL{MbC(V_JaC-B!Uv0e(Bg1-fZni!G>13}E<}#Ky4UHolW#V35w%2smzr+9)JnI~R9*u} zVJ#G2v`Yszu1Eqcz$Eb7=RdI^MeLb3a3O`#x!C8X%+aiqQ^W5ulg7*}zqd*uMY#nxA9HlvWUT7K%mx(vG=i23=gVa3kTxB7^Nv$TZtPYemg@5#}XgC zQASjsIHyxRfw!rG>n1`#G+=sSb@$%TY?>$|v~Cr+O4wyG;~^ItDky_K{KR}}x30oC zhi*H!^%lyvlC<#31Rj7mUpT9KBjEA~_%arlo$)juA7tKwjdKG-1AwY3S-fX}gonmd ztO5RympmQ;`y;-dPdbUcO_}KSdrHJumIymy$)d~--ALj}kFRj%e-25g;=mYlp3I-!i53ekDB_{+xin=R1(YpqbS!#fhirqkHJd#_ond z@c?sJx3fYnel^AZR*>N(N6)Yx-OBr3Y>5u=(r-JVdBHs-gK?}Dtrn+NEik-r1_Qm7 z$=AS_Yqy4-{pF`q{0af3^pd?5vD<^+N22itDQVxk{64QymZ8KiyYP1)U)}0_ZVEDx zWxg*_GR~aod035)MnfT~(=)W(shvO65$m`2m`;v;)o&fIUr+HOsTtAKKp~k*rwF@O z>vQQA*C+z)#GCmYtYy833!DM$_Ub%%lp46otwHU?)Q$k0aD>H6h93ELJNV%d**Y?O}Q`Z^AywTe#6ekh&m@>?TSj z_co89ox=`3z+!q0M;;r(#UJc}`1l)(K4Cv_BK+Lh#e-p5yQ#2Yv|DW?tJ2DSTM0%K zM!CK%4DU32uy7!S`AoCFI4>s_{S}o|Me;rh|9R6>E2&5ALscizoUTjD_-|cU6Q`813rgsZ5x5_&H2D< zxcAxPMro4-pqmK5bj&XV_eY&w^Oj8oqpV8?|Ff~HOUITua-$}8rklPm^C`xCjU1ni zT5uvENWe9UNw&O!=n%(rn;5N%122{l>GoBlorU}<6;5sNc5LKqFfQ$W&(=t?Y<#nm z!YuH%jlRbv1vBn#S1#7(eZuxB7Ssu~^vSdonL)`1%Zm3y=bs#GZQYg(du%fDX%f!9`^Wnw~(28gJble5pabAlJa%S<`E%EkFKs* za$bn2(&sqRZs+TYwMAP`81bUef@hW3HHsd)5L?69?8N18hZxN@d6~07K@Q}(|GTXi zsWp|btGR24$B$LL!S8ZzEn&u^kn1~L1lYB)m?MWrAYO()wW*U+K@fU)uCYb_KDAyk zT*b8&TC$A$&Ije}DcgO<9Wk4#8}nWp;qPI6@~tyS-vvwsY!d&Q9f_-w|42{uk8QGL z=Gei+*})D1snh(iKuC;1{HVhdXA%jGAG}kmGb}7H(kf%1wsYNBvX(rT)XDFQy5i>*Qg#}> zRAHQ~XlHfEGP;|%uesbnDVRLfUC@VLUWo7~czj+Ok;a#$s1q*MVtpgKA^Ri>{ zG@_}In|4e-oTozX#oSav9^_TGwH~)z6xj$?ZMvBni-EsYr^Mzf1_A`I^XUeg;|f0g zl($tQFedEm4+M|U7TfFSmdkoBL^cj_0wo-q7I&Kt*57=SMhu&8b%1D_Gzdlj7yfMo zMIX;3Z}uGaf2%BbuC^$=kUNkJaurW}Dfbxck%}?OV_(v0n$qYzKvIJSK( z!?$)cJ}VbQ(oqzwp08P(0s*=8QizDn+LJ9a{MX+0h7Wb6i`Z?1RQ=5^Qw+);xzSj= zhFuXVzW7>?*)HyctnYAUbRJN4vGL=Xc8#u{Y0>KEy6tZ%M?kR$3H{;9u}4apH7uz5 zM}JJ(xRpT?5T`h#%`cl{B2F6l5PgtAmQK!fJc4YGXVM-gRqY0E!q`AxnvsrGWp24x z9ZwNMt5G$V^FPx>?%KAh?6b{sIQ9{br?R(MP9b5|rX) zChgihH=m7gaki5^bf)DuUSp#S2(-@fl=<%%0_ug=Wp+DFH79miIFxu3!d{44ofvt+6uhsNRH;FbMi)BbO+{Z7B6 z)eQzM;i4j)tVVm|xk7maZ_8+1;QJ9Y5-dvQxQB&Fp{644#5=-_8~=q0_pRPmPX++b zJQzn(RaJr=>powdh2gXJ*3a&jZV_)$(f}<`gd?^R8%05*;u;ysylh~7_5ce>TDVbcrJJs&_V=4*h<;cue zw27etPqce4>3cMmmu}Wy1jpawg@>LJqi z;3K(AD&<9;)6>R4g*_Z_52^ZXS;c~+pKIxr)D|8R0+|?F9qvIqz^0Qbdq)iNB{|#v zGEZ|%d}@Q`DuWUNk-*38Ths634H61d3iH;$Fo7NW6@)9JNrB7MHwe&0?RgahBLcIw zZZPb8wJrFFa0b6#0g6$Q5`KWSfc1)eQnY_RgC=tHCrK7l+WQFYIe2`C@MvSTgDG<;`Mv26QDW7f2H?4M zX@!J9Hy&0hFmeyi=lZ&BFRfh$ljOxb4FlSzF|Q$q;GMZ#yavyLdvS`yX&66DtV7iT z^MnSm=1ZWTWP}O;!J;c`OJe`hoiFfQZbAU=k*WBYbfWz2`};5y6*#f-E?t+3DsKzu z-~1*Gsgp-N0=nJ1e{%N(0u^-w1K$R7eZRmwSD!r6yElEo_nU_2GbXl*L`9{Gzkb_= zI$ac?@<3?U<$iy-TQm_|E5f8ng~iI^Gn zu9KmZX^;Sk${`?rr6Fb^9$rgp3j}r~QH;JK#Bz z3Zylx_0d>SncvM$+^Yl5ZJHaQQK_dmlrYn>R{R*L$9MP56v5B0af|^LX4@$cc-ciymIDF7=#y4L_O8ktD_Y3OJ^Ou5U-W6&}?nrir^A~GL zE!-znj5UvA@8lzzxO<`~An~~P#j?VX{@jEWMbnV=hC5`55lW2Y8faE_5CMZ|Uk#rA zP-fWkW4Vp;)a`Jd1c{F^xPbhxr76}|N%7dQ{ z%X|k~7oB@G7}0iAj=CfgVCd^yNx;j?IJJ_LcuNHzrMFJboHpB(`$c0Z_B;&WP0Sho z5k?7SZ5#$_bwv_3oKHMb^irOA0i`vb17H=iR(WU1sJ35}yZLc|w)6?KT zc^v=liaF+C`wzJ~Duu?M>HDcbEdjn~emz9|E`&4X8wc&;ByhjzpR&G}H*=!4w`R^p z*Nuc_8zLJoq&B|z?^au#Ygd?XVCCTHab?YRBbFf7X2G~QRPf_o(jcJLb!Y0^48QYJ zWAB@XSpDqlPPg(VQVifasw1hUAJ0YyE-^CQ>wo*}U7H%%t;<(eb$)20icsxrcX{PA zppy1`=tXBpFJBw)LfZYZi=kMBR+sm_rKzIKzu$9gp+eFj_Ow&4`{YQE(1YlN8K{!{H)bXVB3PtY}M7m*(-)UCbKY?38zmn0M)^TkA_%9BLkN+ z8eM0hFom`P3J!;+M1}7!p`sVXk7DMSu_OjeY1vm&cyI{Y4=xE4>ELpbrPJl+_sgdD zZKj`1pF6Eyotx})ehdT@wtnQ&p~9U1!!=>kh35nKvi8ppp7$7rQ~s#vjjKlL?S3i7w7se=wr=#xpY3-812=p`N@; z2mh3&{@wPsH*wBbc&}USgOa+t66{^fKmNVm&&bdhX{@<`Wz=ACI;} zjMiJJF*e?-+%6PdnK_l4OY_Rrh&CT80c2P`j`5IfQu>&UQ`UNJ6{MiOHPkyzVsyN_ z!2!aE>Vuq;IO&s3W!8&w77SZhA>7oro1)PLs zw&aexfh?$|;7nsIlFI2T`z?nkfR*RT?upROXA<;c*|R-c60M*HuYuzejMjNI`pl-V zTN|^CN6$_gMa;6G&Lv#m<|&8me*{nlk0SqATZis#JhwX4xx&c%r^%0J{o|5@J!GZ^ zDwl!+Aib_FVl=DD>9?*aBsV<>b32AqKbupdle8aEz=RPU-VZ+|L<^v7`LhS-q4p-?=~WKNR=(#>Q2;d~R)Tay$Uf4t;yAm6-3G7xiK!5$inUO(ZpzI#Gj)%L zzt;wTHum$eQY6b2+g|s?wd|!_|a^Dj$xN0q)Hmya`vLS zbu?ExYUTlhwIL>sUL7FZ)yeJta2KH-VcoeFZ$F_hft&+Daoh3^|27K1)#MFB9B0km zuhN_zuTzjl_@Na+5h-cVK}tQ>ZI{;%;zgBEC%5!e2sW8jd_Ju5kL+`*lmxP(b7xDQ zmEfJhs~IkJ29@83^@cy3u|=cF%Y6uA1%z+M4KI*scsM~Gs)+Lzqu^5FrPES`5VuPS zfMJ$TP%5R)(Z?=I?8alB5ZLz+4t5dX^5t1xBxpN$P=;g5R-fdJSXjYDCTnf9el51- zr@fEN!yAkzbv+|kJ#6P1`BVR(th~0@+*vGQTYrXyX|F@%lx3exglX_TP(o(g>9}CT zS5ivU?ot}~viIuc(qw=qy)ZE9vZVDs;hd)wj9ZZ!xE)wdHA#>B`IU&0yjdNg8*N5h z;bAmBBWEbPxKE|VG)N0f&PXv^cUC&2Kqp>Qsv|~;?A=ZI5(1%zY3zbT*-^h#j8(kgNSd?|sovxlrp6fMoL^RB_;w?)R@M z*ol7df$Vw2IakjRKsIbG20`k2y>HiC_l!8CIYQ^pE$46oKHoJ;y8R@>{AVf{s`CkO z-D0Pp??V$ygj{& zxiQu)dxNNM!z^eL;-w*Ql+pbmTLRaqSsaLC9B)N_kbdrQOjQsMvVYOwL>?8rurO@| zBJ7;{9dOIY7ll~4j=An<8UAG#sac^XHmpfucTZ*d%)@HbuaQ9*Xz|llk6>D*F#rRZ z@o#KH7kYu)MD>y%Z5u52DFd~Dp6S<>^plJ1dz1+|;g?|4<#%x0`P_nbd%}~jl|FG^ zp}^WWKnfS{C?Vaw8AZBLIG4P;Jhjh^krF2D7ax)}$@IX!(YSN+HOS{^5FPL&uw3m7 z?ANs+v4H!4Xq-KB>kChEbvd>-%(Ao30=1eH`DRfz)QqwMExH)~Ws{ik(lAQ9+j}*% z{@s4B(~t0|?@!?5?JlgZ;H1cb+xOZ;_82#o4R(TgQTLaH8~F9Uu>sQCe-o6El%_ov zFmyUmQwgJn^ed>sHwS!}A}+uat3JuO-@9IXzl=0I+x=t}bYb!Bwasy>vADo6wZ2APliK+GC)K7J5qT5fYDR z4(Z$w^J8Ew+lia41}AEk-_PrLf+-sKuSNhAbxtlMBf$M=MS$_`JX`ZdWM~R#Zh)lw z(51L!%H;&DIZ$1p@RqR9^ub#VP|Nwj<+=tv3mY^Wb2s2Qg*Pu9N`t2VbO-MCdzx_r zc_IgFf_Oytav7aYZzi0W9;@$hFoSOQgB@88D71e=6~iArKkIq%){bDW;nB%AdU_B$ zBk*QtP83e`?j9%#vgV_W(|CyQkIA~jQmiP9Prof8&rA=HEDB@#K6@PldCfDZ!cfM`ug=;+T10}T9iOPEM_17IKiZsVmac$ zI$aVkD*VS-Xuv0=XCo)Lv5&SedGThFL1k?cxbb$^P6FPy0OiTjq5>{d)c18)aug2o z8eFBEaM1%@xHdnV7XdvBmb_eYZ%&G6q9b{DIUI2KLV2}GXGI9tFRLs(X=|7iXjsSE zN?rFS7VixKQV%Q|Y`5@f5iLG&TW@<<3DBf~(~0-@rFfYKU;vs1sFha>LJW`>1BTBp z;Jm^oGK_a}pSz-md0EooQq{%vk1%`w^bM!QBhnS=6(tm3W#Yh%-Sk%P)8D_!KA=ui ztX>v1opstLRfBb~mvv7fF>zU02!OdUgs}97Jj{^&qBYNXOlZ2SiyNdA_?_d_TU{T4 zOS7)ma#J=BxQPltRNxs-98Dm)$biUBytSFDmX^y-#^#9Zdljg6dMyOP#VRWu0&V)3 z_bV0t$R$@~EJQ#}G}7bp@AA>iNVb}rnVlr~pnWD!;LO(6)d8p_Rl|^IX^n*IE5Ru1 zjIUQ~uRi=yey!q$E|$l$PA`38oR$(n@xtUMiDHZt%dis-F}e-Qxh-rj4Q{ifvjnax z`?>00uTSV<)98f%5o6c%o@o|8*|_BPg#3`oJV6&eYLy4;IDdE$E+p4urVG-Wit5eg z;yy`%TK|>$P{@nWdsh7!^oW%jq>9OQwc5%eG$)24st(>8JWJ<(39>!8Je~Jbjde*~ z*zMT-aoQ7rkI;Bew7U>iZAc}aLTfB>x!p{U~3m7E>VfRJ|$H*F1_#+8Voycx?J}- z^`FOaR9Q+E%z6b(Ffkk65&_5mqF?}8v{ADj7E1c4IGgw^IJTQbV3M*e*HdfdcjtZ! zT1V>*1E?v{pR9t%lVV0(5*N95QyA!}E!s%TLf<#C?lp2DZJaBg7+at$qRb>ATug%# zBiWPB#z@eUSYMu7DgSx$tWi49>EZ0>gMre`e|i`YnVX)Rzh)W&jl)w8*V8C4L%r9(C` z#h&SBa!jNWa(p&>{cc+GwOiM9WF7(XG zwq^fno(?!}7X#%a9m7{h-pyb2>T~^3?kEK8cx771t7~hi6)VvCBbml~gackVFHbo) z;rPl9R1|g~)pHOB`Z@Lpcn|eTxQL)8IiGmx<-W-4$u}-+bz#|Hol>FKqJgkXR-|yH zaZ>b#ntn>cR!{eb=~k6`Hi&iR*qiY92e&J~cO#5A->voXh;M&DB!6M63LAdoa;!(` zs)38KJ=S8En!d&OWsms+j`a4s86Zb5U`hKK%?(y@oQOevo*y>atl2k zPR9c{Uta6T7DGK`Gq<<2g}z@5ugFu(up9Q2D8qb1HdNlY75SN27?6PQKo1U#3RJH+ z<}R{WnoW6rk~>!`KD_VM66*C33#1BNW4??}D<&v=%tXNRaIeb*)YHidCIMS?i%7O; znD<;{aCtVNlwPpaEVBFAz8=f7@Esbu^)kFH(thkMlPLx=G;cY`AqBD%P}mC3LmrZ* zTiTNlg;uo7CRHRWvrUjB>vYKa{r1Nz_^4?RH~RPoIj=>-VlKPI_NM-o`_{6fJ-DIA zucMk2s3m9q6C3-+<0Z_Lc_AL4;>0RQLhI0zdYn8L`%nqRrrsPDrH5_aaupw~Y|d72 zLBi}`{mZ{8=d?N_a$meXk>M$_q{7%_=LO;um+0@gH{b1{kO+jV)(1{vj9|pEc9T5B zi?6V<2=-DkDRtDqMYGw(j;-~WfIOdwUn9dGFOvru0J6)E#JJ1G~MIc%QCMAZI6`~g4?q!WJY zy`e^aqIr}+iass@?W68Hxb|IYE&|c#cUka51lWAmx+fo#LK8IY18T(o*IG={P3oLo zx}_a?%#JGXNu^oACIHj?OZK_EMB(qn_j9J@muUmFC{kA^#RN|F$Uw}fyNNS3L592y z`~yiw*g80L55A4RH`}3l`|l6{x)FPBbGEW5)dhlIhr`&U*1B(xj#{w6wuxMaGp zoCE8BGXMOKj;?s-SWAByjXAJA4l31q@0ECuy%WF7PHU z-5QPop96rrc=pCVeja_AzthO!!0bmD2k9TXGVy_5R<8Oh=WT%Lf;288WY39+O7Hf7 zKtzEJ-g>1Uxac7)SXGCz{*f90vV%G`tb1+*A7XZ86Gjo}CZc=?5{2Re$5YaCQ=6dh zdqY z{zos&Ii7-R4w3awR$Z-(50nw3MbUr#fNsJER5(aHAUz`#48$GxGU^!R1SSaZrqTID zW8}fB|9>)8raG`&S2uQ8(Cxv2dao#{Z_QA<-FXMlhus6wQUj3NELclhw%V4z`c!~p z0~EH2PbDYHSSuQ_F`~ri1o{K8K??p<&~74wBend?e9hyz2#|L+w3KJOZF)6j#o}$2tU)ouJh(kj5sW)_j|3A8rrclGkpJH z@EIS1YT^$&J63~@`cDnXLNdWRFX^chwYRe`11gF>{|6GzBm?e_dGai2I)REJ&x7+l zHR+Bm0A)n~ZBGR@{{CJA{`YzJ1Q#a|*XqrF?_PpK30yq^URQ5Ien*`5U~yx6v!qxl z{4&~R4>ynJmB|02%w7}%$MC#)qVvhdPYl`aRG*sDA{3mW0p`O2L3NZ+HKxs^Q<;U= zFLAk1?`w1(aq`#xR{#Uu`v5cT+Tu%<)(Bq+nNu)t%<9)J31f)d0{l4%VoVlI3B zvahhgt#oSW^fZ7Hj;)xzDj4=Md;LiAKieUy1lJ$8HLOglDly5I93*U zS3m??1yg9{t;;tE^Ug30ie!<(JIWK&+i6X{-YGrfASY7V2TOmco@?+SwvH2P>y=l` zf7-nk3?p>*b^q1xNm2~>)Dc*jTT-DO{J*vY#P*@@ZtLX2=vzD2!kRp6ov(EsCnFYq zt?I1*G}c81M&Mu|F4j1s>aa6L@)^K;zx6B9bF@rv%oNs$b!QHlKqT`r`6kMF%b@^$ zh~B$pCsQ?u?8Kjc(EUt0kjDO~P;DCZ)njsCdbeCF0vThQVA*huf7E)1J2Sjt>6*>doVoW4hVwm1}t8;h+@FpM~Z-bLjVIX9Sesz z9V_t59pQ@9FyC4UfkpsaVk1D%mnIg(Pv}}GVDSe?9MlLNEP)6-^TK1B!{F%|%f2Aw z#TZ`pc^b-`Hn;g#Vya(tsh!g|!H?w?SX!Oe_DH}690*@S(&#hW^irH^H^W-TVwicz^5bk!J~#*nbXwbT;M6o_${pTGbVMwsQ#BWkQo8c^uM;wtbYw zdw4dF>v_N)eQP$`)_!s}s@7W=$Uj&WW!b!2R&#j4B##)kvgBFQjyrq4fdBVjrBVdK zZ{QTe6wTAC_w&r)I@55TX1>M*rdIOxcT^bT2LgufV)ScVdha_C0~Ad?LO|T#7f&tc z^beZPi#H)L&l%#_G+6xzbHzWQNQGSWK6jgcx5fJER~$5oaHHLQTQ zEG0`c^T>fEfZ_<59MwNHYAa#f8G&M4cSVCR0r1FQ`}cF@x2KPfVE>b?JXm~YxGR)iqVwtWdnUQKYjw*E`}lXv<{Fvcg1O$cswyMG#B_^EHKeQtc_kNpi++{MoM{ zV~aT_hqyUP1lB$=Cau09;sMZm#gW37x&ruSF{q6R4DuJmsTWeQoU0^w1t>01b(bbtcasY zsN@RS!v)=tCJKwRoL%i*bx;P0T%AIQaxf<6Q7D4mCgJ|W#5xioq-I~=t2R88Cs-80 z*zYVgx!0joS#=FPEcT>lH3~pvgO8H_UjPXP_W7l`+0o!MXchw8AWRpFk`P}wJG{hb zX&0k|O%OOhV0$9GmuPN2z-HeI{{M>r`yazn9;jKG{^3%n*a-ri6Hq^|72Y@X8AW(I z$KP9p2yk!c`>9w$oTcWHKJ5KiK&=pfz?8sLcr~ra3h%Y)>paFmppF2?K`1~k)hw+K zyA|Ry%pVRgz_{cE0euOc3NO=&ya-w2Mk2tCBlV}iLWm~=wGd)|;)bPu6G)7?t}nm( z5{&Tr9m~4bBfwP&26P-k98fTE#aRMV;eGM>;T3)6oHZ1~IwODpcZS;iigZ!9NJi{_ zps>&@0tl~H;p)^_1h`Y&epFUMi2ZN`DY@uEV_&`9yI~`ng;q0la`V9GCH#YV|00HiYyH~a9A~I>3zQlqa#u%@nhp}A{ zm=#_IS9L)=j5-kDFyh#W7dt{cyspIp5aLddQ;FjQv}B}72bV8AKO7>wjt9#@^AKPM zgW`ip7tc zZ~ZqW&C}CGJ?JN%1;q1U2uz!q52t2$;p~vLnuCdKe~uu){jm?K=AGv0QtB~YBpxp}o%wd#f8H5Si^_Ec!xaRj(=q!g&;X=MnSf-zZPi>#Q_!YcyPY&RL3 z^E#JbIy?LT;q@wnUKoo2dl4o-jXaPQ8}otT1_6f&DBCUib|-_XUi{nPEr-qR+BE8G zm;eIYFi?t{PoT((pC7)ulNFmQb}ue$76SMF2}pGFG`&jSZvU}}%>o2Cwutxa?@m@c z)KsSPS!&K`wIFK}P1F_w_wESTCgyFM>Asm|rWnb5;mnio(8Sywe=lol!Ds}y1*jBR zj)27Y!r4<-i-BAALP&pcId1G#jer&1JNm*`i0<>lGZ$YNUbEYcYNc@$1nLt&fa^1) zga!!cLU{4)shv^OR*ZF_w8fGcTL|2%6R@KDDATq5y86PWbFF%b90`Hu2zVsG%{fg; zZWGW2QWr{P#t&0-KDYgI>ZfztYOHgGfX)@0<-VzN=K`6oD`CNoIRp^kIZ$}X9RmM& zW_U~ea~IAIFJ-pRSW95qtmXr|-EqfCEa{Vg&IP+&&&KA;%s{GZI(PcCi@G7OiU0z< zijX7kV}>#6Gro9sc->|-ui9;Bvz$v=mc6Nr2R?BTP|R)o-^^@xh0X=LUAg$T!|M#B zit9Y^-CG3M_XtL8znZEqzHsWAvSVdFCO5B6`i`066yAAptB9?Qv0|;5+xRnxD!e#H zkyipA3dVct-734Fz&?`$W`jH(LW!E^?vBwJSuGosbVqp7k&)Dr% z#YQpGm!~>)a4ZCTA%Fn;5-IF#oPaL$YPK%=k!M6%S(vghHGvjQp~f)c+N^i8LMvvs z?BjK@6x01;EB1=PdL^?r1i~SJ0EZJxJZXS{1VLGtvN1J*7EPhg4~G&DiHO9c5aykX zSpp-WX`p8Rim>7;-^JhqG0`+2&Ak;Xo6!z!E5mvFcttG5RBYGxk|Q7xE&&8M+}Pq- zg9IcV5)p|>AWoYkZ{E6|hd*~`9WiL2eVCq7)4z{a0Ldvgb246HJs9W?D!jGnbS}OUUvxy;}4?=h-_} z?5^9*W|HQHM9#C;^)S_ + + + + + diff --git a/app/src/main/res/drawable/seekbar_video_play.xml b/app/src/main/res/drawable/seekbar_video_play.xml new file mode 100644 index 0000000..3f5a1f4 --- /dev/null +++ b/app/src/main/res/drawable/seekbar_video_play.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/selector_play_button.xml b/app/src/main/res/drawable/selector_play_button.xml new file mode 100644 index 0000000..3e83ce9 --- /dev/null +++ b/app/src/main/res/drawable/selector_play_button.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_photo_info.xml b/app/src/main/res/layout/activity_photo_info.xml index 5a71be9..f94842a 100644 --- a/app/src/main/res/layout/activity_photo_info.xml +++ b/app/src/main/res/layout/activity_photo_info.xml @@ -48,13 +48,30 @@ android:padding="16dp" app:layout_constraintTop_toTopOf="parent"> - + android:id="@+id/frame_image" + android:layout_height="320dp"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_photo_sorting.xml b/app/src/main/res/layout/activity_photo_sorting.xml index 8d81bf8..5e54de9 100644 --- a/app/src/main/res/layout/activity_photo_sorting.xml +++ b/app/src/main/res/layout/activity_photo_sorting.xml @@ -52,13 +52,13 @@ android:orientation="horizontal"> @@ -81,13 +81,13 @@ android:orientation="horizontal"> @@ -125,48 +125,55 @@ - + android:id="@+id/relative_thumbnails" + android:layout_below="@id/filter_date_layout"> - + + + + + + - diff --git a/app/src/main/res/layout/activity_scan_result_display.xml b/app/src/main/res/layout/activity_scan_result_display.xml index 160f102..e4f71d0 100644 --- a/app/src/main/res/layout/activity_scan_result_display.xml +++ b/app/src/main/res/layout/activity_scan_result_display.xml @@ -8,6 +8,7 @@ android:background="@color/white" android:orientation="vertical" tools:context=".result.ScanResultDisplayActivity"> + + android:textSize="14sp" + app:fontType="bold" /> + android:textSize="14sp" + app:fontType="bold" /> - + android:layout_height="match_parent" + android:background="@drawable/bg_rectangle_white_top_20" + android:layout_marginTop="20dp"> + + + + - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_scanning.xml b/app/src/main/res/layout/activity_scanning.xml index aa4459b..cee4ad8 100644 --- a/app/src/main/res/layout/activity_scanning.xml +++ b/app/src/main/res/layout/activity_scanning.xml @@ -34,67 +34,71 @@ app:fontType="bold" /> - - - + android:orientation="horizontal" + android:paddingTop="150dp"> + + + app:fontType="bold" + app:layout_constraintEnd_toStartOf="@id/tv_scan_describe" + app:layout_constraintHorizontal_weight="1" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/scan_progress" /> - + app:fontType="bold" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_weight="1" + app:layout_constraintStart_toEndOf="@id/tv_scan_current_counts" + app:layout_constraintTop_toTopOf="@id/tv_scan_current_counts" /> - - + android:layout_marginStart="16dp" + android:layout_marginTop="103dp" + android:indeterminateTint="@color/main_title" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_scan_current_counts" /> + + + + + + + + + + - + + + + + - - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_video_play.xml b/app/src/main/res/layout/activity_video_play.xml new file mode 100644 index 0000000..478ab05 --- /dev/null +++ b/app/src/main/res/layout/activity_video_play.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/file_span_count_three_adapter.xml b/app/src/main/res/layout/file_span_count_three_adapter.xml index 908ef2f..af9fb5d 100644 --- a/app/src/main/res/layout/file_span_count_three_adapter.xml +++ b/app/src/main/res/layout/file_span_count_three_adapter.xml @@ -3,10 +3,10 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root_layout" - android:layout_marginEnd="10dp" - android:layout_marginTop="9dp" android:layout_width="match_parent" - android:layout_height="150dp"> + android:layout_height="150dp" + android:layout_marginTop="9dp" + android:layout_marginEnd="10dp"> - + android:layout_alignParentBottom="true"> + + + + + - + android:background="@drawable/photo_size_bg"> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/scan_result_documents_adapter.xml b/app/src/main/res/layout/scan_result_documents_adapter.xml new file mode 100644 index 0000000..1777d40 --- /dev/null +++ b/app/src/main/res/layout/scan_result_documents_adapter.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index eb2472f..03ff289 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -24,6 +24,7 @@ #15787880 #F2F2F7 #D9D9D9 + #99F2F2F7 \ 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 eb6b458..4bb8853 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,12 +36,16 @@ Exit Allow Scanning… + Photos photos deleted photos + Videos videos deleted videos + Audios audios deleted audios + Documents documents deleted documents Finished! @@ -49,6 +53,7 @@ If you exit,the scanning results will be discarded.Are you sure you want to exit now? Date Size + Duration Layout Hide thumbnails (%d) Thumbnails refer to photos below 256 pixels @@ -64,6 +69,7 @@ OK Name Path + Type Resolution Recovering... It may take a few seconds to recover the file(s), please @@ -78,6 +84,8 @@ wait.. The file(s) will be completely deleted and cannot be recovered. Confirm delete? View + Sorry!No %s found! + All @@ -86,12 +94,27 @@ wait.. within 24 month Customize - + All 0-1 M 1-5 M >5 M + + + All + 0-500 KB + 500 KB-1 M + >1 M + + + + All + 0-5 minutes + 5-20 minutes + 20-60 minutes + >60 minutes + 2 columns 3 columns