Commit 7d3cd81b authored by wanglei's avatar wanglei

...ui

parent 239af647
...@@ -2,7 +2,10 @@ package com.base.datarecovery ...@@ -2,7 +2,10 @@ package com.base.datarecovery
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import com.base.datarecovery.activity.SplashActivity
import com.base.datarecovery.ads.AdmobOpenUtils
import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
import com.base.datarecovery.help.BaseApplication import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper import com.base.datarecovery.help.ConfigHelper
...@@ -25,6 +28,7 @@ class MyApplication : BaseApplication() { ...@@ -25,6 +28,7 @@ class MyApplication : BaseApplication() {
MobileAds.initialize(this) { initializationStatus -> MobileAds.initialize(this) { initializationStatus ->
} }
} }
initLifeListener()
} }
...@@ -58,18 +62,18 @@ class MyApplication : BaseApplication() { ...@@ -58,18 +62,18 @@ class MyApplication : BaseApplication() {
} }
if (flag) { if (flag) {
// if (AdmobUtils.isOpenAdLoaded()) { if (AdmobOpenUtils.isOpenAdLoaded()) {
// AdmobUtils.showAppOpenAd(activity) AdmobOpenUtils.showAppOpenAd(activity)
// } else { } else {
// topActivity?.startActivity( topActivity?.startActivity(
// Intent( Intent(
// topActivity, topActivity,
// NewSplashActivity::class.java SplashActivity::class.java
// ).apply { ).apply {
// putExtra("isHotLaunch", true) putExtra("isHotLaunch", true)
// putExtra("type", -1) putExtra("type", -1)
// }) })
// } }
} }
} }
} }
......
package com.base.datarecovery.activity package com.base.datarecovery.activity
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import com.base.datarecovery.databinding.ActivityFileRecoveredBinding import com.base.datarecovery.databinding.ActivityFileRecoveredBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils
class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() { class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
...@@ -17,6 +23,37 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() { ...@@ -17,6 +23,37 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
val number = intent.extras?.getInt("Number") ?: 0
val scanType = intent.extras?.getInt("ScanType")
binding.tvNumber.text = number.toString()
val type = when (scanType) {
SCAN_PHOTOS -> if (number == 1) "Photo" else "Photos"
SCAN_VIDEOS -> if (number == 1) "Video" else "Videos"
SCAN_DOCUMENTS -> if (number == 1) "Document" else "Documents"
else -> ""
}
binding.tvType.text = type
}
override fun initListener() {
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
finishToMain()
}
binding.tvContinue.setOnClickListener {
finish()
}
binding.tvFinish.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
} }
} }
\ No newline at end of file
...@@ -6,13 +6,12 @@ import android.graphics.BitmapFactory ...@@ -6,13 +6,12 @@ import android.graphics.BitmapFactory
import android.graphics.Color import android.graphics.Color
import android.os.Environment import android.os.Environment
import android.view.View import android.view.View
import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.adapter.FileMediaColumnsAdapter import com.base.datarecovery.adapter.FileTimeColumnsAdapter
import com.base.datarecovery.adapter.RecoveryFilterAdapter import com.base.datarecovery.adapter.RecoveryFilterAdapter
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
...@@ -39,7 +38,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() { ...@@ -39,7 +38,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
} }
private var folderBean: FolderBean? = null private var folderBean: FolderBean? = null
private lateinit var adapter: FileMediaColumnsAdapter private lateinit var adapter: FileTimeColumnsAdapter
private lateinit var filterAdapter: RecoveryFilterAdapter private lateinit var filterAdapter: RecoveryFilterAdapter
...@@ -95,7 +94,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() { ...@@ -95,7 +94,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
} }
adapter = FileMediaColumnsAdapter( adapter = FileTimeColumnsAdapter(scanType,
select = { all, size -> select = { all, size ->
binding.ivSelectAll.isSelected = all binding.ivSelectAll.isSelected = all
binding.tvRecover.text = "Recover($size)" binding.tvRecover.text = "Recover($size)"
...@@ -125,7 +124,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() { ...@@ -125,7 +124,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
binding.switchThumbnails.setOnCheckedChangeListener { buttonView, isChecked -> binding.switchThumbnails.setOnCheckedChangeListener { buttonView, isChecked ->
adapter.toggleThumbnails(isChecked) adapter.toggleThumbnails(isChecked)
} }
binding.ivSelectAll.setOnClickListener { binding.flSelectAll.setOnClickListener {
binding.ivSelectAll.isSelected = !binding.ivSelectAll.isSelected binding.ivSelectAll.isSelected = !binding.ivSelectAll.isSelected
adapter.toggleAllSelect(binding.ivSelectAll.isSelected) adapter.toggleAllSelect(binding.ivSelectAll.isSelected)
} }
...@@ -161,7 +160,10 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() { ...@@ -161,7 +160,10 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
}, finish = { }, finish = {
adapter.toggleAllSelect(false) adapter.toggleAllSelect(false)
startActivity(Intent(this, FileRecoveredActivity::class.java)) startActivity(Intent(this, FileRecoveredActivity::class.java).apply {
putExtra("Number", list.size)
putExtra("ScanType", scanType)
})
}) })
} }
......
...@@ -10,6 +10,7 @@ import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS ...@@ -10,6 +10,7 @@ import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import com.base.datarecovery.bean.FolderBean import com.base.datarecovery.bean.FolderBean
import com.base.datarecovery.bean.RecoveryBean import com.base.datarecovery.bean.RecoveryBean
import com.base.datarecovery.bean.RecoveryBean.Companion.setType
import com.base.datarecovery.databinding.ActivityFileScanResultBinding import com.base.datarecovery.databinding.ActivityFileScanResultBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
...@@ -90,6 +91,10 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() { ...@@ -90,6 +91,10 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
val list = hashMap.map { val list = hashMap.map {
val folder = it.key.split("/").last() val folder = it.key.split("/").last()
if (scanType == SCAN_DOCUMENTS) {
it.value.forEach { bean -> bean.setType() }
}
FolderBean(folder, recoveryList = it.value) FolderBean(folder, recoveryList = it.value)
} }
binding.tvFolderNumber.text = list.size.toString() binding.tvFolderNumber.text = list.size.toString()
......
...@@ -10,10 +10,12 @@ import android.text.style.UnderlineSpan ...@@ -10,10 +10,12 @@ import android.text.style.UnderlineSpan
import android.view.View import android.view.View
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.ads.AdmobOpenUtils
import com.base.datarecovery.databinding.ActivitySplashBinding import com.base.datarecovery.databinding.ActivitySplashBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.ConfigHelper import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.utils.SPUtils import com.base.datarecovery.utils.SPUtils
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
...@@ -27,6 +29,7 @@ import kotlin.random.Random ...@@ -27,6 +29,7 @@ import kotlin.random.Random
@SuppressLint("CustomSplashScreen") @SuppressLint("CustomSplashScreen")
class SplashActivity : BaseActivity<ActivitySplashBinding>() { class SplashActivity : BaseActivity<ActivitySplashBinding>() {
private val TAG = "SplashActivity"
private var job: Job? = null private var job: Job? = null
private val progress = MutableSharedFlow<Int>() private val progress = MutableSharedFlow<Int>()
private val progressFlow: SharedFlow<Int> = progress private val progressFlow: SharedFlow<Int> = progress
...@@ -77,6 +80,9 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -77,6 +80,9 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
} }
AdmobNativeUtils.loadNativeAd() AdmobNativeUtils.loadNativeAd()
AdmobOpenUtils.loadAppOpenAd {
LogEx.logDebug(TAG, "load where=$it")
}
} }
private fun jumpNext() { private fun jumpNext() {
...@@ -105,12 +111,25 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -105,12 +111,25 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
} }
} }
fun startProgress() = lifecycleScope.launch { var processTime = 0L
private fun startProgress() = lifecycleScope.launch {
while (isActive) { while (isActive) {
delay(Random.nextLong(50, 150))
val value = binding.pb.progress + Random.nextInt(3, 5) val value = binding.pb.progress + Random.nextInt(3, 5)
binding.pb.setProgress(value, true) binding.pb.setProgress(value, true)
progress.emit(value) progress.emit(value)
val delayTime = Random.nextLong(300, 550)
delay(delayTime)
processTime += delayTime
if (processTime >= 3000) {
AdmobOpenUtils.showAppOpenAd(this@SplashActivity) {
LogEx.logDebug(TAG, "where $it")
binding.pb.progress = 100
startActivity(Intent(this@SplashActivity, MainActivity::class.java))
finish()
}
}
} }
} }
......
package com.base.datarecovery.adapter package com.base.datarecovery.adapter
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.view.Gravity
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.FolderBean import com.base.datarecovery.bean.FolderBean
import com.base.datarecovery.bean.RecoveryBean import com.base.datarecovery.bean.RecoveryBean
import com.base.datarecovery.databinding.ItemMediaBinding import com.base.datarecovery.databinding.ItemDocumentBinding
import com.base.datarecovery.databinding.ItemTimeMediaBinding
import com.base.datarecovery.help.KotlinExt.toFormatSize import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.view.XmlEx.inflate import com.base.datarecovery.view.XmlEx.inflate
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import java.io.File import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
class FileMediaColumnsAdapter( class FileTimeColumnsAdapter(
val scanType: Int,
val select: (all: Boolean, size: Int) -> Unit, val select: (all: Boolean, size: Int) -> Unit,
) : RecyclerView.Adapter<FileMediaColumnsAdapter.MCV>() { ) : RecyclerView.Adapter<FileTimeColumnsAdapter.MCV>() {
private val beanList = arrayListOf<FolderBean>() private val beanList = arrayListOf<FolderBean>()
private var hideThumbnails: Boolean = false private var hideThumbnails: Boolean = false
...@@ -28,7 +36,7 @@ class FileMediaColumnsAdapter( ...@@ -28,7 +36,7 @@ class FileMediaColumnsAdapter(
class MCV(view: View) : ViewHolder(view) class MCV(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MCV { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MCV {
return MCV(R.layout.item_media.inflate(parent)) return MCV(R.layout.item_time_media.inflate(parent))
} }
override fun getItemCount(): Int { override fun getItemCount(): Int {
...@@ -36,7 +44,7 @@ class FileMediaColumnsAdapter( ...@@ -36,7 +44,7 @@ class FileMediaColumnsAdapter(
} }
override fun onBindViewHolder(holder: MCV, position: Int) { override fun onBindViewHolder(holder: MCV, position: Int) {
val binding = ItemMediaBinding.bind(holder.itemView) val binding = ItemTimeMediaBinding.bind(holder.itemView)
val context = holder.itemView.context val context = holder.itemView.context
val bean = beanList[position] val bean = beanList[position]
...@@ -45,7 +53,17 @@ class FileMediaColumnsAdapter( ...@@ -45,7 +53,17 @@ class FileMediaColumnsAdapter(
val subAdapter = MediaColumnsAdapter() val subAdapter = MediaColumnsAdapter()
if (scanType == SCAN_DOCUMENTS) {
binding.rvMediaColumns.layoutManager = LinearLayoutManager(context)
} else {
binding.rvMediaColumns.layoutManager = GridLayoutManager(context, columns) binding.rvMediaColumns.layoutManager = GridLayoutManager(context, columns)
binding.rvMediaColumns.layoutParams =
LinearLayout.LayoutParams(RecyclerView.LayoutParams.WRAP_CONTENT, RecyclerView.LayoutParams.WRAP_CONTENT).apply {
topMargin = context.resources.getDimensionPixelOffset(R.dimen.dp_8)
gravity = Gravity.CENTER_HORIZONTAL
}
}
binding.rvMediaColumns.adapter = subAdapter binding.rvMediaColumns.adapter = subAdapter
val list = if (hideThumbnails) bean.recoveryList.filter { !it.isThumbnails } else bean.recoveryList val list = if (hideThumbnails) bean.recoveryList.filter { !it.isThumbnails } else bean.recoveryList
if (list.isEmpty()) { if (list.isEmpty()) {
...@@ -80,12 +98,15 @@ class FileMediaColumnsAdapter( ...@@ -80,12 +98,15 @@ class FileMediaColumnsAdapter(
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CS { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CS {
val layout = when (columns) { var layout = when (columns) {
2 -> R.layout.item_media_columns2 2 -> R.layout.item_media_columns2
3 -> R.layout.item_media_columns3 3 -> R.layout.item_media_columns3
4 -> R.layout.item_media_columns4 4 -> R.layout.item_media_columns4
else -> R.layout.item_media_columns2 else -> R.layout.item_media_columns2
} }
if (scanType == SCAN_DOCUMENTS) {
layout = R.layout.item_document
}
return CS(layout.inflate(parent)) return CS(layout.inflate(parent))
} }
...@@ -101,11 +122,40 @@ class FileMediaColumnsAdapter( ...@@ -101,11 +122,40 @@ class FileMediaColumnsAdapter(
val context = holder.itemView.context val context = holder.itemView.context
val data = list[position] val data = list[position]
if (scanType == SCAN_DOCUMENTS) {
if (payloads.isEmpty()) {
val binding = ItemDocumentBinding.bind(holder.itemView)
binding.ivSelector.isSelected = data.isSelect
val icon = when (data.type) {
"PDF" -> R.mipmap.pdf
"DOC" -> R.mipmap.doc
"XLS" -> R.mipmap.xls
"PPT" -> R.mipmap.ppt
else -> 0
}
binding.ivType.setImageResource(icon)
val file = File(data.path)
binding.tvName.text = file.name
val time = SimpleDateFormat("MMM-dd-yyyy", Locale.getDefault()).format(file.lastModified())
val size = file.length().toFormatSize()
val info = "$time $size"
binding.tvInfo.text = info
binding.root.setOnClickListener {
data.isSelect = !data.isSelect
holder.ivSelector.isSelected = data.isSelect
notifyItemChanged(position, "asdada")
subItemClick(data)
}
} else {
holder.ivSelector.isSelected = data.isSelect
super.onBindViewHolder(holder, position, payloads)
}
} else {
if (payloads.isEmpty()) { if (payloads.isEmpty()) {
Glide.with(context).asBitmap().load(data.path).centerCrop().into(holder.iv) Glide.with(context).asBitmap().load(data.path).centerCrop().into(holder.iv)
holder.iv.tag = data.path
holder.ivSelector.isSelected = data.isSelect holder.ivSelector.isSelected = data.isSelect
holder.ivSelector.setOnClickListener { holder.itemView.setOnClickListener {
data.isSelect = !data.isSelect data.isSelect = !data.isSelect
holder.ivSelector.isSelected = data.isSelect holder.ivSelector.isSelected = data.isSelect
notifyItemChanged(position, "changeIv") notifyItemChanged(position, "changeIv")
...@@ -120,6 +170,8 @@ class FileMediaColumnsAdapter( ...@@ -120,6 +170,8 @@ class FileMediaColumnsAdapter(
} }
} }
}
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
fun setData(bean: List<RecoveryBean>) { fun setData(bean: List<RecoveryBean>) {
list.clear() list.clear()
......
package com.base.datarecovery.ads
import android.app.Activity
import com.base.datarecovery.ads.AdmobCommonUtils.isMultiClick
import com.base.datarecovery.ads.AdmobEvent.clickAd
import com.base.datarecovery.ads.AdmobEvent.pullAd
import com.base.datarecovery.ads.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.LogEx
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.appopen.AppOpenAd
import org.json.JSONObject
import java.util.UUID
object AdmobOpenUtils {
private val TAG = "AdmobOpenUtils"
private val mRequest = AdRequest.Builder().build()
private var openLoadTime = Long.MAX_VALUE
private var mOpenAd: AppOpenAd? = null
fun isOpenAdLoaded() = mOpenAd != null
fun loadAppOpenAd(skip: Boolean = false, onLoad: ((where: Int) -> Unit)? = null) {
if (mOpenAd != null || skip) {
onLoad?.invoke(1)
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
onLoad?.invoke(2)
return
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "openAd")
// EventUtils.event("ad_pull_start", ext = obj)
AppOpenAd.load(
BaseApplication.context,
ConfigHelper.openAdmobId,
mRequest,
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdLoaded(ad: AppOpenAd) {
openLoadTime = System.currentTimeMillis()
mOpenAd = ad
onLoad?.invoke(3)
pullAd(ad.responseInfo, "openAd", reqId = reqId)
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
}
override fun onAdFailedToLoad(p0: LoadAdError) {
LogEx.logDebug(TAG, "LoadAdError ${p0.message}")
mOpenAd = null
onLoad?.invoke(4)
pullAd(p0.responseInfo, "openAd", p0.message, reqId = reqId)
}
})
}
fun showAppOpenAd(activity: Activity, skip: Boolean = false, onHidden: ((where: Int) -> Unit)? = null) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
onHidden?.invoke(1)
return
}
val obj = JSONObject()
obj.put("ad_unit", "openAd")
// EventUtils.event("ad_prepare_show", ext = obj)
if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
mOpenAd = null
loadAppOpenAd()
onHidden?.invoke(2)
val obj = JSONObject()
obj.put("ad_unit", "openAd")
// EventUtils.event("ad_expire", ext = obj)
return
}
if (mOpenAd != null) {
val thisMOpenAd = mOpenAd
mOpenAd = null
thisMOpenAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
clickAd(thisMOpenAd?.responseInfo, "openAd")
isMultiClick(thisMOpenAd)
}
override fun onAdDismissedFullScreenContent() {
mOpenAd = null
onHidden?.invoke(3)
loadAppOpenAd()
}
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
mOpenAd = null
onHidden?.invoke(4)
loadAppOpenAd()
val obj = JSONObject()
obj.put("reason", p0.message)
obj.put("ad_unit", "openAd")
// EventUtils.event("ad_show_error", ext = obj)
}
override fun onAdShowedFullScreenContent() {
showAd(thisMOpenAd?.responseInfo, "openAd", activity)
}
}
thisMOpenAd?.show(activity)
} else {
onHidden?.invoke(5)
loadAppOpenAd()
val obj = JSONObject()
obj.put("reason", "no_ad")
obj.put("ad_unit", "openAd")
// EventUtils.event("ad_show_error", ext = obj)
}
}
}
\ No newline at end of file
package com.base.datarecovery.bean package com.base.datarecovery.bean
import com.base.datarecovery.utils.FileHexEx.isDoc
import com.base.datarecovery.utils.FileHexEx.isDocx
import com.base.datarecovery.utils.FileHexEx.isPPT
import com.base.datarecovery.utils.FileHexEx.isPPTX
import com.base.datarecovery.utils.FileHexEx.isPdf
import com.base.datarecovery.utils.FileHexEx.isXls
import com.base.datarecovery.utils.FileHexEx.isXlsx
import java.io.File
data class RecoveryBean( data class RecoveryBean(
val path: String = "", val path: String = "",
) { ) {
var isSelect: Boolean = false var isSelect: Boolean = false
var isThumbnails: Boolean = false var isThumbnails: Boolean = false
var type: String = ""
companion object {
fun RecoveryBean.setType() {
val file = File(path)
if (isPdf(file)) {
type = "PDF"
}
if (isDocx(file) || isDoc(file)) {
type = "DOC"
}
if (isXlsx(file) || isXls(file)) {
type = "XLS"
}
if (isPPTX(file) || isPPT(file)) {
type = "PPT"
}
}
}
} }
\ No newline at end of file
package com.base.datarecovery.help package com.base.datarecovery.help
import com.base.datarecovery.activity.SplashActivity import com.base.datarecovery.activity.SplashActivity
import com.base.datarecovery.utils.SPUtils
object ConfigHelper { object ConfigHelper {
......
...@@ -7,6 +7,7 @@ object LogEx { ...@@ -7,6 +7,7 @@ object LogEx {
val isOpen = true val isOpen = true
val filterTAG = arrayOf( val filterTAG = arrayOf(
"FileScanActivity", "FileScanActivity",
"FileHexEx"
) )
fun logDebug(tag: String, content: String, isMust: Boolean = false) { fun logDebug(tag: String, content: String, isMust: Boolean = false) {
......
...@@ -108,9 +108,9 @@ object DialogViews { ...@@ -108,9 +108,9 @@ object DialogViews {
val recoveryFile = File(dir, file.name) val recoveryFile = File(dir, file.name)
file.copyTo(recoveryFile, true) file.copyTo(recoveryFile, true)
} }
mutableSharedFlow.emit(index + 1) mutableSharedFlow.emit(index)
index++
delay(Random.nextLong(500, 1500)) delay(Random.nextLong(500, 1500))
index++
} }
mutableSharedFlow.emit(-1) mutableSharedFlow.emit(-1)
} }
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<corners android:radius="22.5dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="2dp"
android:color="@color/white" />
<corners android:radius="22.5dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main" android:id="@+id/main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#577DFD"
android:orientation="vertical"
tools:context=".activity.FileRecoveredActivity"> tools:context=".activity.FileRecoveredActivity">
</androidx.constraintlayout.widget.ConstraintLayout> <androidx.constraintlayout.widget.ConstraintLayout
\ No newline at end of file android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout_editor_absoluteX="0dp">
<View
android:id="@+id/v_top"
android:layout_width="match_parent"
android:layout_height="40dp"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/fl_fanhui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/v_top"
tools:ignore="UselessParent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<ImageView
android:id="@+id/iv_yanhua"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="18dp"
android:layout_marginTop="25dp"
android:src="@mipmap/tu_yanhua"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl_fanhui"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="15sp"
android:includeFontPadding="false"
android:textColor="@color/white"
android:textSize="59sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/iv_yanhua"
app:layout_constraintStart_toEndOf="@id/iv_yanhua"
app:layout_constraintTop_toTopOf="@id/iv_yanhua"
tools:text="2" />
<TextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="14dp"
android:layout_marginBottom="10dp"
android:includeFontPadding="false"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/tv_number"
app:layout_constraintStart_toEndOf="@id/tv_number"
tools:text="Photos" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="35dp"
android:text="Recovered successfully!"
android:textColor="@color/white"
android:textSize="25sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="@id/iv_yanhua"
app:layout_constraintTop_toBottomOf="@id/iv_yanhua"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="25dp"
android:src="@mipmap/tubg_yanhua"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/v_top"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="60dp">
<TextView
android:id="@+id/tv_continue"
android:layout_width="160dp"
android:layout_height="46dp"
android:layout_gravity="start"
android:background="@drawable/bg_stroke_ffffff_22"
android:gravity="center"
android:text="Continue"
android:textColor="@color/white"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_finish"
android:layout_width="160dp"
android:layout_height="46dp"
android:layout_marginStart="25dp"
android:background="@drawable/bg_f5f5f5_18"
android:gravity="center"
android:text="Finish"
android:textColor="#577DFD"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
...@@ -165,7 +165,8 @@ ...@@ -165,7 +165,8 @@
android:id="@+id/ll_all_select" android:id="@+id/ll_all_select"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginStart="6dp"
android:layout_marginEnd="16dp"
android:background="@color/white" android:background="@color/white"
android:orientation="horizontal" android:orientation="horizontal"
android:paddingTop="20dp" android:paddingTop="20dp"
...@@ -173,6 +174,12 @@ ...@@ -173,6 +174,12 @@
app:layout_constraintTop_toBottomOf="@id/cl_top" app:layout_constraintTop_toBottomOf="@id/cl_top"
app:layout_scrollFlags="scroll|enterAlways"> app:layout_scrollFlags="scroll|enterAlways">
<FrameLayout
android:id="@+id/fl_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp">
<ImageView <ImageView
android:id="@+id/iv_select_all" android:id="@+id/iv_select_all"
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -181,6 +188,8 @@ ...@@ -181,6 +188,8 @@
android:src="@drawable/bg_circle_selector" android:src="@drawable/bg_circle_selector"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
</FrameLayout>
<TextView <TextView
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
...@@ -271,7 +280,7 @@ ...@@ -271,7 +280,7 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv" android:id="@+id/rv"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:background="#FDFDFD" android:background="#FDFDFD"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginVertical="15dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/bg_circle_selector"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15dp"
tools:ignore="ContentDescription"
tools:src="@mipmap/xls" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="20dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="middle"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="16sp"
tools:text="xxxx.xls" />
<TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:textColor="#768294"
android:textSize="12sp"
tools:text="2024-06-20 18.9 KB" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp" android:layout_marginStart="16dp"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" android:textStyle="bold"
...@@ -25,11 +25,10 @@ ...@@ -25,11 +25,10 @@
<LinearLayout <LinearLayout
android:id="@+id/ll_select" android:id="@+id/ll_select"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end" android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp" android:layout_marginEnd="16dp"
tools:ignore="UseCompoundDrawables"> tools:ignore="UseCompoundDrawables">
<ImageView <ImageView
......
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dp_8">8dp</dimen>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment