取消intent传递class

This commit is contained in:
litingting 2026-01-06 14:29:20 +08:00
parent ca7a7f9da6
commit 0c1980da94
11 changed files with 229 additions and 194 deletions

View File

@ -19,8 +19,8 @@ android {
applicationId = "com.ux.video.file.filerecovery" applicationId = "com.ux.video.file.filerecovery"
minSdk = 24 minSdk = 24
targetSdk = 36 targetSdk = 36
versionCode = 1 versionCode = 2
versionName = "1.0" versionName = "1.1"
project.setProperty("archivesBaseName", "File Recovery Tool" + versionName + "(${versionCode})_$timestamp") project.setProperty("archivesBaseName", "File Recovery Tool" + versionName + "(${versionCode})_$timestamp")
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@ -24,31 +24,6 @@ data class ResultDataFiles(
val sizeString: String, val sizeString: String,
val lastModified: Long, // 时间戳 val lastModified: Long, // 时间戳
) : Parcelable { ) : 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())
// }
} }

View File

@ -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<ResultDataFiles>()
fun setClickItemData(data: ResultDataFiles) {
clickData.postValue(data)
}
}

View File

@ -6,6 +6,7 @@ import android.os.Build
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import androidx.activity.viewModels
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.bumptech.glide.Glide 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.resolution
import com.ux.video.file.filerecovery.db.targetFile import com.ux.video.file.filerecovery.db.targetFile
import com.ux.video.file.filerecovery.sort.RecoverOrDeleteManager 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.success.RecoverySuccessActivity
import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.Common
import com.ux.video.file.filerecovery.utils.ExtendFunctions.dpToPx 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.PlayMediaManager
import com.ux.video.file.filerecovery.video.VideoPlayActivity import com.ux.video.file.filerecovery.video.VideoPlayActivity
import java.io.File import java.io.File
import kotlin.getValue
class DetailsActivity : BaseActivity<ActivityDetailsBinding>() { class DetailsActivity : BaseActivity<ActivityDetailsBinding>() {
@ -40,40 +43,42 @@ class DetailsActivity : BaseActivity<ActivityDetailsBinding>() {
val KEY_SHOW_SHARE = "show_share" 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 myData: ResultDataFiles? = null
private var showShare = false private var showShare = false
private val viewModel: DetailsViewModel by viewModels()
override fun inflateBinding(inflater: LayoutInflater): ActivityDetailsBinding = override fun inflateBinding(inflater: LayoutInflater): ActivityDetailsBinding =
ActivityDetailsBinding.inflate(inflater) ActivityDetailsBinding.inflate(inflater)
override fun initView() { override fun initView() {
super.initView() super.initView()
myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra(KEY_CLICK_ITEM, ResultDataFiles::class.java) // intent.getParcelableExtra(KEY_CLICK_ITEM, ResultDataFiles::class.java)
} else { // } else {
@Suppress("DEPRECATION") // @Suppress("DEPRECATION")
intent.getParcelableExtra(KEY_CLICK_ITEM) // 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) showShare = intent.getBooleanExtra(KEY_SHOW_SHARE, false)
setView()
} }
override fun initData() { private fun initValue(){
super.initData()
binding.run { binding.run {
imageViewBack.setOnClickListener { finish() } imageViewBack.setOnClickListener { finish() }
myData?.let { resultPhotosFiles -> myData?.let { resultPhotosFiles ->
@ -134,91 +139,91 @@ class DetailsActivity : BaseActivity<ActivityDetailsBinding>() {
} }
} }
myData?.let { myData?.let {
when (it.fileType) { when (it.fileType) {
FileType.PHOTO -> { FileType.PHOTO -> {
layoutName.isVisible = true layoutName.isVisible = true
layoutPath.isVisible = true layoutPath.isVisible = true
layoutResolution.isVisible = true layoutResolution.isVisible = true
layoutDate.isVisible = true layoutDate.isVisible = true
frameImage.setBackgroundResource(0) frameImage.setBackgroundResource(0)
layoutSeekbar.isVisible = false layoutSeekbar.isVisible = false
layoutType.isVisible = false layoutType.isVisible = false
layoutSize.isVisible = false layoutSize.isVisible = false
layoutDuration.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 -> { FileType.VIDEO -> {
layoutName.isVisible = true layoutName.isVisible = true
layoutPath.isVisible = true layoutPath.isVisible = true
layoutResolution.isVisible = true layoutResolution.isVisible = true
layoutDate.isVisible = true layoutDate.isVisible = true
layoutDuration.isVisible = true layoutDuration.isVisible = true
frameImage.setBackgroundResource(0) frameImage.setBackgroundResource(0)
layoutSeekbar.isVisible = false layoutSeekbar.isVisible = false
layoutType.isVisible = false layoutType.isVisible = false
layoutSize.isVisible = false layoutSize.isVisible = false
imPlay.isVisible = true imPlay.isVisible = true
myData?.let { data -> myData?.let { data ->
loadImage(image, data.targetFile()) loadImage(image, data.targetFile())
frameImage.setOnClickListener { frameImage.setOnClickListener {
startActivity( startActivity(
Intent( Intent(
this@DetailsActivity, this@DetailsActivity,
VideoPlayActivity::class.java VideoPlayActivity::class.java
).apply { ).apply {
putExtra(VideoPlayActivity.KEY_DATA, data) // putExtra(VideoPlayActivity.KEY_DATA, data)
}) })
} }
} }
} }
FileType.AUDIO -> { FileType.AUDIO -> {
Common.showLog("----------音频") Common.showLog("----------音频")
layoutName.isVisible = true layoutName.isVisible = true
layoutPath.isVisible = true layoutPath.isVisible = true
layoutSize.isVisible = true layoutSize.isVisible = true
layoutDate.isVisible = true layoutDate.isVisible = true
layoutDuration.isVisible = true layoutDuration.isVisible = true
layoutSeekbar.isVisible = true layoutSeekbar.isVisible = true
imPlay.isVisible = true imPlay.isVisible = true
frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8) frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8)
loadCenterImage(image, R.drawable.image_info_music) loadCenterImage(image, R.drawable.image_info_music)
initPlayAudio() initPlayAudio()
layoutResolution.isVisible = false layoutResolution.isVisible = false
layoutType.isVisible = false layoutType.isVisible = false
} }
FileType.DOCUMENT -> { FileType.DOCUMENT -> {
layoutName.isVisible = true layoutName.isVisible = true
layoutType.isVisible = true layoutType.isVisible = true
layoutPath.isVisible = true layoutPath.isVisible = true
layoutSize.isVisible = true layoutSize.isVisible = true
layoutDate.isVisible = true layoutDate.isVisible = true
frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8) frameImage.setBackgroundResource(R.drawable.bg_info_music_f2f2f7_8)
myData?.targetFile()?.let { myData?.targetFile()?.let {
loadCenterImage(image, Common.getFileIconRes(it)) loadCenterImage(image, Common.getFileIconRes(it))
} }
imPlay.isVisible = false imPlay.isVisible = false
layoutSeekbar.isVisible = false layoutSeekbar.isVisible = false
layoutResolution.isVisible = false layoutResolution.isVisible = false
layoutDuration.isVisible = false layoutDuration.isVisible = false
} }
} }
} }
} }
} }
@ -289,7 +294,7 @@ class DetailsActivity : BaseActivity<ActivityDetailsBinding>() {
startActivity(Intent(this@DetailsActivity, RecoverySuccessActivity::class.java).apply { startActivity(Intent(this@DetailsActivity, RecoverySuccessActivity::class.java).apply {
putExtra(RecoverySuccessActivity.Companion.KEY_SUCCESS_COUNT, number) putExtra(RecoverySuccessActivity.Companion.KEY_SUCCESS_COUNT, number)
putExtra(RecoverySuccessActivity.Companion.KEY_SUCCESS_TYPE, type) putExtra(RecoverySuccessActivity.Companion.KEY_SUCCESS_TYPE, type)
putExtra(Common.KEY_FILE_TYPE, fileType.value) putExtra(Common.KEY_FILE_TYPE, fileType?.value?: FileType.PHOTO.value)
}) })
} }

View File

@ -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<ResultDataFiles> = ClickDataRepository.clickData
fun updateData(data: ResultDataFiles) {
ClickDataRepository.setClickItemData(data)
}
fun setClickItemData(data: ResultDataFiles) {
clickData.postValue(data)
}
}

View File

@ -186,14 +186,15 @@ class RecoveredFragment : BaseFragment<FragmentRecoveryPhotoBinding>() {
hideThumbnailsUpdate = { hide -> hideThumbnailsUpdate = { hide ->
}) { item -> }) { item ->
sharedViewModel.updateClickData(item)
// TODO:
startActivity( startActivity(
Intent( Intent(
requireContext(), requireContext(),
DetailsActivity::class.java DetailsActivity::class.java
).apply { ).apply {
putExtra(KEY_SCAN_TYPE, fileType.value) putExtra(KEY_SCAN_TYPE, fileType.value)
putExtra(DetailsActivity.KEY_CLICK_ITEM, item) // putExtra(DetailsActivity.KEY_CLICK_ITEM, item)
putExtra(DetailsActivity.KEY_SHOW_SHARE, true) putExtra(DetailsActivity.KEY_SHOW_SHARE, true)
}) })

View File

@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.ux.video.file.filerecovery.db.ResultDataFiles 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.Common
import com.ux.video.file.filerecovery.utils.FileType import com.ux.video.file.filerecovery.utils.FileType
@ -103,4 +104,9 @@ class RecoveryPhotoViewModel : ViewModel() {
FileType.DOCUMENT -> _selectedDocumentsLiveData FileType.DOCUMENT -> _selectedDocumentsLiveData
} }
} }
fun updateClickData(data: ResultDataFiles) {
ClickDataRepository.setClickItemData(data)
}
} }

View File

@ -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.databinding.ActivityPhotoSortingBinding
import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.db.ResultDataFiles
import com.ux.video.file.filerecovery.db.isThumbnail 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.detail.DetailsActivity
import com.ux.video.file.filerecovery.success.RecoverySuccessActivity import com.ux.video.file.filerecovery.success.RecoverySuccessActivity
import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.Common
@ -153,13 +154,14 @@ class SortingActivity : BaseActivity<ActivityPhotoSortingBinding>() {
}) { item -> }) { item ->
viewModel.updateClickData(item)
startActivity( startActivity(
Intent( Intent(
this@SortingActivity, this@SortingActivity,
DetailsActivity::class.java DetailsActivity::class.java
).apply { ).apply {
putExtra(Common.KEY_FILE_TYPE, item.fileType.value) 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<ActivityPhotoSortingBinding>() {
{ actionPath, isAdd -> { actionPath, isAdd ->
viewModel.toggleSelection(isAdd, actionPath) viewModel.toggleSelection(isAdd, actionPath)
}) { item -> }) { item ->
viewModel.updateClickData(item)
startActivity( startActivity(
Intent( Intent(
this@SortingActivity, this@SortingActivity,
DetailsActivity::class.java DetailsActivity::class.java
).apply { ).apply {
putExtra(Common.KEY_FILE_TYPE, fileType.value) putExtra(Common.KEY_FILE_TYPE, fileType.value)
putExtra(DetailsActivity.KEY_CLICK_ITEM, item) // putExtra(DetailsActivity.KEY_CLICK_ITEM, item)
}) })
}.apply { }.apply {
setData(sortByDateReverse) setData(sortByDateReverse)
@ -1035,4 +1038,9 @@ class SortingActivity : BaseActivity<ActivityPhotoSortingBinding>() {
} }
} }
fun updateClickData(data: ResultDataFiles) {
ClickDataRepository.setClickItemData(data)
}
} }

View File

@ -5,6 +5,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.ux.video.file.filerecovery.db.ResultData import com.ux.video.file.filerecovery.db.ResultData
import com.ux.video.file.filerecovery.db.ResultDataFiles 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.result.ScanResultRepository
import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.Common
@ -90,6 +91,8 @@ class SortingViewModel : ViewModel() {
val current = _selectedLiveData.value val current = _selectedLiveData.value
return current?.contains(resultDataFiles) == true return current?.contains(resultDataFiles) == true
} }
fun updateClickData(data: ResultDataFiles) {
ClickDataRepository.setClickItemData(data)
}
} }

View File

@ -6,6 +6,7 @@ import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.activity.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.Player 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.sort.RecoverOrDeleteManager
import com.ux.video.file.filerecovery.db.ResultDataFiles import com.ux.video.file.filerecovery.db.ResultDataFiles
import com.ux.video.file.filerecovery.db.targetFile 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.success.RecoverySuccessActivity
import com.ux.video.file.filerecovery.utils.Common import com.ux.video.file.filerecovery.utils.Common
import com.ux.video.file.filerecovery.utils.FileType import com.ux.video.file.filerecovery.utils.FileType
import kotlin.getValue
class VideoPlayActivity : BaseActivity<ActivityVideoPlayBinding>() { class VideoPlayActivity : BaseActivity<ActivityVideoPlayBinding>() {
@ -28,6 +31,7 @@ class VideoPlayActivity : BaseActivity<ActivityVideoPlayBinding>() {
private lateinit var player: ExoPlayer private lateinit var player: ExoPlayer
private var myData: ResultDataFiles? = null private var myData: ResultDataFiles? = null
private val viewModel: VideoPlayViewModel by viewModels()
private val updateHandler = Handler(Looper.getMainLooper()) private val updateHandler = Handler(Looper.getMainLooper())
override fun inflateBinding(inflater: LayoutInflater): ActivityVideoPlayBinding = override fun inflateBinding(inflater: LayoutInflater): ActivityVideoPlayBinding =
ActivityVideoPlayBinding.inflate(inflater) ActivityVideoPlayBinding.inflate(inflater)
@ -40,86 +44,56 @@ class VideoPlayActivity : BaseActivity<ActivityVideoPlayBinding>() {
override fun initData() { override fun initData() {
super.initData() super.initData()
myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // myData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra(KEY_DATA, ResultDataFiles::class.java) // intent.getParcelableExtra(KEY_DATA, ResultDataFiles::class.java)
} else { // } else {
@Suppress("DEPRECATION") // @Suppress("DEPRECATION")
intent.getParcelableExtra(KEY_DATA) // intent.getParcelableExtra(KEY_DATA)
} // }
// initPlayer() viewModel.clickData.observe(this){
binding.run { myData = it
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
} )
}
// playImage.setOnClickListener { binding.run {
// if (player.playbackState == Player.STATE_ENDED) { myData?.let { resultPhotosFiles->
// player.seekTo(0) imageBack.setOnClickListener { finish() }
// } resultPhotosFiles.targetFile().let {
// if (!player.isPlaying) { PlayMediaManager(context = this@VideoPlayActivity, mediaFile = it, playView = playerView,
// player.play() seekBar = seekBar, playBtn = playImage, onUpdateProgress = { current,total->
// it.isSelected = true textTimeCurrent.text = current
// } else { textTimeTotal.text = total
// player.pause() } )
// it.isSelected = false }
// }
// } layoutBottom.tvLeft.run {
// seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { text = resources.getString(R.string.delete)
// override fun onProgressChanged( setOnClickListener {
// seekBar: SeekBar?, RecoverOrDeleteManager.showConfirmDeleteDialog(
// progress: Int, true,
// fromUser: Boolean supportFragmentManager,
// ) { lifecycleScope,
// if (fromUser) { setOf(resultPhotosFiles)
// val newPosition = progress * player.duration / 100 ) { count ->
// player.seekTo(newPosition) complete(count, 1)
// } }
// }
//
// 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 { layoutBottom.tvRight.run {
text = resources.getString(R.string.recover) text = resources.getString(R.string.recover)
setOnClickListener { setOnClickListener {
RecoverOrDeleteManager.showRecoveringDialog( RecoverOrDeleteManager.showRecoveringDialog(
supportFragmentManager, supportFragmentManager,
lifecycleScope, lifecycleScope,
setOf(resultPhotosFiles) setOf(resultPhotosFiles)
) { count -> ) { count ->
complete(count, 0) complete(count, 0)
}
} }
} }
} }
} }
} }
} }
private fun startProgressUpdater() { private fun startProgressUpdater() {

View File

@ -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<ResultDataFiles> = ClickDataRepository.clickData
fun updateData(data: ResultDataFiles) {
ClickDataRepository.setClickItemData(data)
}
fun setClickItemData(data: ResultDataFiles) {
clickData.postValue(data)
}
}