diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0bab8ca..16a6d89 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,8 +19,8 @@ android { applicationId = "com.ux.video.file.filerecovery" minSdk = 24 targetSdk = 36 - versionCode = 1 - versionName = "1.0" + versionCode = 2 + versionName = "1.1" project.setProperty("archivesBaseName", "File Recovery Tool" + versionName + "(${versionCode})_$timestamp") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/ux/video/file/filerecovery/db/ResultDataFiles.kt b/app/src/main/java/com/ux/video/file/filerecovery/db/ResultDataFiles.kt index 6b9c074..76ef47f 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/db/ResultDataFiles.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/db/ResultDataFiles.kt @@ -24,31 +24,6 @@ data class ResultDataFiles( val sizeString: String, val lastModified: Long, // 时间戳 ) : Parcelable { -// val targetFile: File -// get() = path.let { File(it) } - //尺寸 -// val resolution: String -// get() = Common.getResolution(fileType, targetFile) - - //是否为缩略图文件(宽高任一小于 256) -// val isThumbnail: Boolean -// get() { -// val parts = resolution.lowercase().split("*").mapNotNull { -// it.trim().toIntOrNull() -// } -// if (parts.size == 2) { -// val (width, height) = parts -// return width < 256 || height < 256 -// } -// return false -// } - - - //音视频时长 -// val duration: Long -// get() { -// return Common.getMediaDuration(path.toString()) -// } } diff --git a/app/src/main/java/com/ux/video/file/filerecovery/detail/ClickDataRepository.kt b/app/src/main/java/com/ux/video/file/filerecovery/detail/ClickDataRepository.kt new file mode 100644 index 0000000..1661c0b --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/detail/ClickDataRepository.kt @@ -0,0 +1,18 @@ +package com.ux.video.file.filerecovery.detail + +import androidx.lifecycle.MutableLiveData +import com.ux.video.file.filerecovery.db.ResultData +import com.ux.video.file.filerecovery.db.ResultDataFiles + +object ClickDataRepository { + + + + val clickData = MutableLiveData() + + + fun setClickItemData(data: ResultDataFiles) { + clickData.postValue(data) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/detail/DetailsActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/detail/DetailsActivity.kt index 2aa1bf1..c1dc3e7 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/detail/DetailsActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/detail/DetailsActivity.kt @@ -6,6 +6,7 @@ import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup import android.widget.ImageView +import androidx.activity.viewModels import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide @@ -24,6 +25,7 @@ import com.ux.video.file.filerecovery.db.duration import com.ux.video.file.filerecovery.db.resolution import com.ux.video.file.filerecovery.db.targetFile import com.ux.video.file.filerecovery.sort.RecoverOrDeleteManager +import com.ux.video.file.filerecovery.sort.SortingViewModel import com.ux.video.file.filerecovery.success.RecoverySuccessActivity import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx @@ -32,6 +34,7 @@ import com.ux.video.file.filerecovery.utils.ScanType import com.ux.video.file.filerecovery.video.PlayMediaManager import com.ux.video.file.filerecovery.video.VideoPlayActivity import java.io.File +import kotlin.getValue class DetailsActivity : BaseActivity() { @@ -40,40 +43,42 @@ class DetailsActivity : BaseActivity() { val KEY_SHOW_SHARE = "show_share" } - private var playMediaManager: PlayMediaManager? = null + private var playMediaManager: PlayMediaManager? = null - private lateinit var fileType: FileType + private var fileType: FileType? = null private var myData: ResultDataFiles? = null private var showShare = false + private val viewModel: DetailsViewModel by viewModels() + override fun inflateBinding(inflater: LayoutInflater): ActivityDetailsBinding = ActivityDetailsBinding.inflate(inflater) override fun initView() { super.initView() - myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - intent.getParcelableExtra(KEY_CLICK_ITEM, ResultDataFiles::class.java) - } else { - @Suppress("DEPRECATION") - intent.getParcelableExtra(KEY_CLICK_ITEM) +// myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// intent.getParcelableExtra(KEY_CLICK_ITEM, ResultDataFiles::class.java) +// } else { +// @Suppress("DEPRECATION") +// intent.getParcelableExtra(KEY_CLICK_ITEM) +// } + viewModel.clickData.observe(this){ + myData = it + Common.showLog("------myData=${myData}") + myData?.apply { + initValue() + setView() + }?.fileType?.let { + fileType = it + Common.showLog("------fileType11=${fileType}") + } } - val intExtra = intent.getIntExtra(Common.KEY_FILE_TYPE, FileType.PHOTO.value) - - myData?.fileType.let { - if (it != null) { - fileType = it - Common.showLog("------fileType=${fileType}") - } - } showShare = intent.getBooleanExtra(KEY_SHOW_SHARE, false) - setView() - } - override fun initData() { - super.initData() + private fun initValue(){ binding.run { imageViewBack.setOnClickListener { finish() } myData?.let { resultPhotosFiles -> @@ -134,91 +139,91 @@ class DetailsActivity : BaseActivity() { } } - myData?.let { + myData?.let { - when (it.fileType) { - FileType.PHOTO -> { - layoutName.isVisible = true - layoutPath.isVisible = true - layoutResolution.isVisible = true - layoutDate.isVisible = true - frameImage.setBackgroundResource(0) + when (it.fileType) { + FileType.PHOTO -> { + layoutName.isVisible = true + layoutPath.isVisible = true + layoutResolution.isVisible = true + layoutDate.isVisible = true + frameImage.setBackgroundResource(0) - layoutSeekbar.isVisible = false - layoutType.isVisible = false - layoutSize.isVisible = false - layoutDuration.isVisible = false + layoutSeekbar.isVisible = false + layoutType.isVisible = false + layoutSize.isVisible = false + layoutDuration.isVisible = false - imPlay.isVisible = false + imPlay.isVisible = false - myData?.targetFile()?.let { loadImage(image, it) } - } + myData?.targetFile()?.let { loadImage(image, it) } + } - FileType.VIDEO -> { - layoutName.isVisible = true - layoutPath.isVisible = true - layoutResolution.isVisible = true - layoutDate.isVisible = true - layoutDuration.isVisible = true - frameImage.setBackgroundResource(0) + FileType.VIDEO -> { + layoutName.isVisible = true + layoutPath.isVisible = true + layoutResolution.isVisible = true + layoutDate.isVisible = true + layoutDuration.isVisible = true + frameImage.setBackgroundResource(0) - layoutSeekbar.isVisible = false - layoutType.isVisible = false - layoutSize.isVisible = false + layoutSeekbar.isVisible = false + layoutType.isVisible = false + layoutSize.isVisible = false - imPlay.isVisible = true - myData?.let { data -> - loadImage(image, data.targetFile()) - frameImage.setOnClickListener { - startActivity( - Intent( - this@DetailsActivity, - VideoPlayActivity::class.java - ).apply { - putExtra(VideoPlayActivity.KEY_DATA, data) - }) - } - } - } + imPlay.isVisible = true + myData?.let { data -> + loadImage(image, data.targetFile()) + frameImage.setOnClickListener { + startActivity( + Intent( + this@DetailsActivity, + VideoPlayActivity::class.java + ).apply { +// putExtra(VideoPlayActivity.KEY_DATA, data) + }) + } + } + } - FileType.AUDIO -> { - Common.showLog("----------音频") - layoutName.isVisible = true - layoutPath.isVisible = true - layoutSize.isVisible = true - layoutDate.isVisible = true - layoutDuration.isVisible = true - layoutSeekbar.isVisible = true - imPlay.isVisible = true - frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8) + FileType.AUDIO -> { + Common.showLog("----------音频") + layoutName.isVisible = true + layoutPath.isVisible = true + layoutSize.isVisible = true + layoutDate.isVisible = true + layoutDuration.isVisible = true + layoutSeekbar.isVisible = true + imPlay.isVisible = true + frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8) - loadCenterImage(image, R.drawable.image_info_music) + loadCenterImage(image, R.drawable.image_info_music) - initPlayAudio() - layoutResolution.isVisible = false - layoutType.isVisible = false - } + initPlayAudio() + layoutResolution.isVisible = false + layoutType.isVisible = false + } - FileType.DOCUMENT -> { - layoutName.isVisible = true - layoutType.isVisible = true - layoutPath.isVisible = true - layoutSize.isVisible = true - layoutDate.isVisible = true + FileType.DOCUMENT -> { + layoutName.isVisible = true + layoutType.isVisible = true + layoutPath.isVisible = true + layoutSize.isVisible = true + layoutDate.isVisible = true - frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8) - myData?.targetFile()?.let { - loadCenterImage(image, Common.getFileIconRes(it)) - } - imPlay.isVisible = false - layoutSeekbar.isVisible = false - layoutResolution.isVisible = false - layoutDuration.isVisible = false - } - } - } + frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8) + myData?.targetFile()?.let { + loadCenterImage(image, Common.getFileIconRes(it)) + } + imPlay.isVisible = false + layoutSeekbar.isVisible = false + layoutResolution.isVisible = false + layoutDuration.isVisible = false + } + } + } } } @@ -289,7 +294,7 @@ class DetailsActivity : BaseActivity() { startActivity(Intent(this@DetailsActivity, RecoverySuccessActivity::class.java).apply { putExtra(RecoverySuccessActivity.Companion.KEY_SUCCESS_COUNT, number) putExtra(RecoverySuccessActivity.Companion.KEY_SUCCESS_TYPE, type) - putExtra(Common.KEY_FILE_TYPE, fileType.value) + putExtra(Common.KEY_FILE_TYPE, fileType?.value?: FileType.PHOTO.value) }) } diff --git a/app/src/main/java/com/ux/video/file/filerecovery/detail/DetailsViewModel.kt b/app/src/main/java/com/ux/video/file/filerecovery/detail/DetailsViewModel.kt new file mode 100644 index 0000000..3d156f2 --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/detail/DetailsViewModel.kt @@ -0,0 +1,22 @@ +package com.ux.video.file.filerecovery.detail + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.ux.video.file.filerecovery.db.ResultData +import com.ux.video.file.filerecovery.db.ResultDataFiles +import com.ux.video.file.filerecovery.result.ScanResultRepository + +class DetailsViewModel : ViewModel() { + + + + val clickData: MutableLiveData = ClickDataRepository.clickData + + fun updateData(data: ResultDataFiles) { + ClickDataRepository.setClickItemData(data) + } + + fun setClickItemData(data: ResultDataFiles) { + clickData.postValue(data) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveredFragment.kt b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveredFragment.kt index 170ffdf..3c51e82 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveredFragment.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveredFragment.kt @@ -186,14 +186,15 @@ class RecoveredFragment : BaseFragment() { hideThumbnailsUpdate = { hide -> }) { item -> - + sharedViewModel.updateClickData(item) + // TODO: startActivity( Intent( requireContext(), DetailsActivity::class.java ).apply { putExtra(KEY_SCAN_TYPE, fileType.value) - putExtra(DetailsActivity.KEY_CLICK_ITEM, item) +// putExtra(DetailsActivity.KEY_CLICK_ITEM, item) putExtra(DetailsActivity.KEY_SHOW_SHARE, true) }) diff --git a/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoViewModel.kt b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoViewModel.kt index 44a72f5..f676620 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoViewModel.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/recovery/ui/recoveryphoto/RecoveryPhotoViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.ux.video.file.filerecovery.db.ResultDataFiles +import com.ux.video.file.filerecovery.detail.ClickDataRepository import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.FileType @@ -103,4 +104,9 @@ class RecoveryPhotoViewModel : ViewModel() { FileType.DOCUMENT -> _selectedDocumentsLiveData } } + + + fun updateClickData(data: ResultDataFiles) { + ClickDataRepository.setClickItemData(data) + } } \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/sort/SortingActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/SortingActivity.kt index c55c2d3..8e580a7 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/sort/SortingActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/SortingActivity.kt @@ -16,6 +16,7 @@ import com.ux.video.file.filerecovery.base.BaseActivity import com.ux.video.file.filerecovery.databinding.ActivityPhotoSortingBinding import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.db.isThumbnail +import com.ux.video.file.filerecovery.detail.ClickDataRepository import com.ux.video.file.filerecovery.detail.DetailsActivity import com.ux.video.file.filerecovery.success.RecoverySuccessActivity import com.ux.video.file.filerecovery.utils.Common @@ -153,13 +154,14 @@ class SortingActivity : BaseActivity() { }) { item -> + viewModel.updateClickData(item) startActivity( Intent( this@SortingActivity, DetailsActivity::class.java ).apply { putExtra(Common.KEY_FILE_TYPE, item.fileType.value) - putExtra(DetailsActivity.KEY_CLICK_ITEM, item) +// putExtra(DetailsActivity.KEY_CLICK_ITEM, item) }) } @@ -172,13 +174,14 @@ class SortingActivity : BaseActivity() { { actionPath, isAdd -> viewModel.toggleSelection(isAdd, actionPath) }) { item -> + viewModel.updateClickData(item) startActivity( Intent( this@SortingActivity, DetailsActivity::class.java ).apply { putExtra(Common.KEY_FILE_TYPE, fileType.value) - putExtra(DetailsActivity.KEY_CLICK_ITEM, item) +// putExtra(DetailsActivity.KEY_CLICK_ITEM, item) }) }.apply { setData(sortByDateReverse) @@ -1035,4 +1038,9 @@ class SortingActivity : BaseActivity() { } } + + fun updateClickData(data: ResultDataFiles) { + ClickDataRepository.setClickItemData(data) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/sort/SortingViewModel.kt b/app/src/main/java/com/ux/video/file/filerecovery/sort/SortingViewModel.kt index 7f23a1f..d5697c4 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/sort/SortingViewModel.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/sort/SortingViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.ux.video.file.filerecovery.db.ResultData import com.ux.video.file.filerecovery.db.ResultDataFiles +import com.ux.video.file.filerecovery.detail.ClickDataRepository import com.ux.video.file.filerecovery.result.ScanResultRepository import com.ux.video.file.filerecovery.utils.Common @@ -90,6 +91,8 @@ class SortingViewModel : ViewModel() { val current = _selectedLiveData.value return current?.contains(resultDataFiles) == true } - + fun updateClickData(data: ResultDataFiles) { + ClickDataRepository.setClickItemData(data) + } } \ No newline at end of file diff --git a/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt b/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt index 8c0b4fc..fd869ad 100644 --- a/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt +++ b/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayActivity.kt @@ -6,6 +6,7 @@ import android.os.Build import android.os.Handler import android.os.Looper import android.view.LayoutInflater +import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope import androidx.media3.common.MediaItem import androidx.media3.common.Player @@ -16,9 +17,11 @@ import com.ux.video.file.filerecovery.databinding.ActivityVideoPlayBinding import com.ux.video.file.filerecovery.sort.RecoverOrDeleteManager import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.db.targetFile +import com.ux.video.file.filerecovery.detail.DetailsViewModel import com.ux.video.file.filerecovery.success.RecoverySuccessActivity import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.FileType +import kotlin.getValue class VideoPlayActivity : BaseActivity() { @@ -28,6 +31,7 @@ class VideoPlayActivity : BaseActivity() { private lateinit var player: ExoPlayer private var myData: ResultDataFiles? = null + private val viewModel: VideoPlayViewModel by viewModels() private val updateHandler = Handler(Looper.getMainLooper()) override fun inflateBinding(inflater: LayoutInflater): ActivityVideoPlayBinding = ActivityVideoPlayBinding.inflate(inflater) @@ -40,86 +44,56 @@ class VideoPlayActivity : BaseActivity() { override fun initData() { super.initData() - myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - intent.getParcelableExtra(KEY_DATA, ResultDataFiles::class.java) - } else { - @Suppress("DEPRECATION") - intent.getParcelableExtra(KEY_DATA) - } -// initPlayer() - binding.run { - myData?.let { resultPhotosFiles-> - imageBack.setOnClickListener { finish() } - resultPhotosFiles.targetFile().let { - PlayMediaManager(context = this@VideoPlayActivity, mediaFile = it, playView = playerView, - seekBar = seekBar, playBtn = playImage, onUpdateProgress = { current,total-> - textTimeCurrent.text = current - textTimeTotal.text = total - } ) - } +// myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// intent.getParcelableExtra(KEY_DATA, ResultDataFiles::class.java) +// } else { +// @Suppress("DEPRECATION") +// intent.getParcelableExtra(KEY_DATA) +// } + viewModel.clickData.observe(this){ + myData = it -// 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) + binding.run { + myData?.let { resultPhotosFiles-> + imageBack.setOnClickListener { finish() } + resultPhotosFiles.targetFile().let { + PlayMediaManager(context = this@VideoPlayActivity, mediaFile = it, playView = playerView, + seekBar = seekBar, playBtn = playImage, onUpdateProgress = { current,total-> + textTimeCurrent.text = current + textTimeTotal.text = total + } ) + } + + 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) + layoutBottom.tvRight.run { + text = resources.getString(R.string.recover) + setOnClickListener { + RecoverOrDeleteManager.showRecoveringDialog( + supportFragmentManager, + lifecycleScope, + setOf(resultPhotosFiles) + ) { count -> + complete(count, 0) + } } } } } } + } private fun startProgressUpdater() { diff --git a/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayViewModel.kt b/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayViewModel.kt new file mode 100644 index 0000000..d278373 --- /dev/null +++ b/app/src/main/java/com/ux/video/file/filerecovery/video/VideoPlayViewModel.kt @@ -0,0 +1,23 @@ +package com.ux.video.file.filerecovery.video + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.ux.video.file.filerecovery.db.ResultData +import com.ux.video.file.filerecovery.db.ResultDataFiles +import com.ux.video.file.filerecovery.detail.ClickDataRepository +import com.ux.video.file.filerecovery.result.ScanResultRepository + +class VideoPlayViewModel : ViewModel() { + + + + val clickData: MutableLiveData = ClickDataRepository.clickData + + fun updateData(data: ResultDataFiles) { + ClickDataRepository.setClickItemData(data) + } + + fun setClickItemData(data: ResultDataFiles) { + clickData.postValue(data) + } +} \ No newline at end of file