Commit c947439c authored by wanglei's avatar wanglei

...

parent c3a71894
......@@ -30,8 +30,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
// binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
// showRateStarPopDialog()
// showExitFunctionDialog()
}
......
package com.base.datarecovery.activity.recovery
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.os.Environment
import android.view.View
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobInterstitialUtils
import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.ads.AdmobOpenUtils
import com.base.datarecovery.bean.ConstObject
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
......@@ -27,12 +22,10 @@ import com.base.datarecovery.utils.FileHexEx.isVideo
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.DialogViews.showExitFunctionDialog
import com.base.datarecovery.view.DialogViews.showGerPermission
import kotlinx.coroutines.Dispatchers
import com.base.datarecovery.view.FileScanDialog
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
/**
* 文件扫描,遍历文件夹的方式进行
......@@ -69,6 +62,11 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() {
binding.ivIcon.setImageResource(R.mipmap.tu_videos_scan)
}
}
if (checkStorePermission()) {
beginScan()
} else {
requestPermission()
}
}
override fun initListener() {
......@@ -82,26 +80,37 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() {
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
binding.tvScan.setOnClickListener {
if (checkStorePermission()) {
binding.llFile.visibility = View.VISIBLE
beginScan()
} else {
requestPermission()
}
}
// binding.tvScan.setOnClickListener {
// if (checkStorePermission()) {
// binding.llFile.visibility = View.VISIBLE
// beginScan()
// } else {
// requestPermission()
// }
// }
}
private fun beginScan() {
if (scanOnce)
return
scanOnce = true
val mutableSharedFlow = MutableSharedFlow<String>(
val mPathFlow = MutableSharedFlow<String>(
replay = 5,//当新的订阅者Collect时,发送几个已经发送过的数据给它
extraBufferCapacity = 5,//减去replay,MutableSharedFlow还缓存多少数据,缓冲池容量 = replay + extraBufferCapacity
onBufferOverflow = BufferOverflow.SUSPEND//缓存策略,三种 丢掉最新值、丢掉最旧值和挂起
)
val pathFlow: SharedFlow<String> = mPathFlow
val mFoundFlow = MutableSharedFlow<Int>(
replay = 5,//当新的订阅者Collect时,发送几个已经发送过的数据给它
extraBufferCapacity = 5,//减去replay,MutableSharedFlow还缓存多少数据,缓冲池容量 = replay + extraBufferCapacity
onBufferOverflow = BufferOverflow.SUSPEND//缓存策略,三种 丢掉最新值、丢掉最旧值和挂起
)
val sharedFlow: SharedFlow<String> = mutableSharedFlow
val foundFlow: SharedFlow<Int> = mFoundFlow
val dialogClass = FileScanDialog(this)
val scanDialog = dialogClass.showFileScanDialog(pathFlow, foundFlow)
val filter = when (scanType) {
SCAN_PHOTOS -> ::isImage
......@@ -112,25 +121,24 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() {
val root = Environment.getExternalStorageDirectory()
val pathList = arrayListOf<String>()
lifecycleScope.loadFileByFilter(
mutableSharedFlow,
mPathFlow,
mFoundFlow,
root, filter = filter,
onDo = { file ->
LogEx.logDebug(TAG, "file =${file.absolutePath}")
pathList.add(file.absolutePath)
},
onFinish = {
startActivity(Intent(this@FileScanActivity, FileScanResultActivity::class.java).apply {
putExtra("ScanType", scanType)
putExtra("PathList", pathList.toTypedArray())
})
finish()
if (pathList.isEmpty()) {
scanDialog.dismiss()
} else {
dialogClass.stopScan(scanType, pathList)
}
}
)
lifecycleScope.launch(Dispatchers.Main) {
sharedFlow.collectLatest {
binding.tvPath.text = it
}
}
}
......@@ -139,7 +147,7 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() {
showGerPermission(tittle = "Storage Permission Required",
desc = "This feature requires access to your storage to scan your photos, videos, and documents and recover any accidentally deleted data. We will not transmit your data to any third-party service. Please grant permission so that we can provide you with better service.",
deny = { },
deny = { finishToMain() },
allow = {
requestStorePermission(launcher, jumpAction = {}, result = { flag ->
......
......@@ -18,13 +18,16 @@ object FileHelp {
private val TAG = "FileHelp"
fun CoroutineScope.loadFileByFilter(
mutableSharedFlow: MutableSharedFlow<String>? = null,
flow1: MutableSharedFlow<String>? = null,
flow2: MutableSharedFlow<Int>? = null,
folder: File,
filter: (file: File) -> Boolean,
onDo: ((file: File) -> Unit)? = null,
onFinish: (() -> Unit)? = null
) = launch(Dispatchers.IO) {
var size = 0
//添加第一层文件到链表
val linkList = LinkedList<File>()
val fileList = folder.listFiles()
......@@ -36,8 +39,10 @@ object FileHelp {
LogEx.logDebug(TAG, "$it flag=$flag")
if (flag) {
onDo?.invoke(it)
size++
flow2?.emit(size)
}
mutableSharedFlow?.emit(it.absolutePath)
flow1?.emit(it.absolutePath)
}
}
......@@ -54,8 +59,10 @@ object FileHelp {
// LogEx.logDebug(TAG, "$it flag=$flag")
if (flag) {
onDo?.invoke(it)
size++
flow2?.emit(size)
}
mutableSharedFlow?.emit(it.absolutePath)
flow1?.emit(it.absolutePath)
}
}
}
......
package com.base.datarecovery.view
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R
import com.base.datarecovery.activity.recovery.FileScanResultActivity
import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.databinding.DialogFileScanBinding
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
object FileScanDialog {
fun Context.showFileScanDialog() {
val binding = DialogFileScanBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).create()
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
val params = dialog.window?.attributes
params?.width = resources.getDimensionPixelOffset(R.dimen.dp_345)
dialog.window?.attributes = params
class FileScanDialog(
val activity: AppCompatActivity,
) {
private val TAG = "FileScanDialog"
private val a1 = ValueAnimator.ofFloat(0f, -360f)
private val dialog = AlertDialog.Builder(activity).create()
private lateinit var btn: TextView
@SuppressLint("SetTextI18n")
fun showFileScanDialog(
sharedFlow: SharedFlow<String>,
foundFlow: SharedFlow<Int>
): AlertDialog {
val binding = DialogFileScanBinding.inflate(LayoutInflater.from(activity))
dialog?.setView(binding.root)
dialog?.setCanceledOnTouchOutside(false)
dialog?.setCancelable(false)
dialog?.show()
dialog?.window?.setBackgroundDrawableResource(android.R.color.transparent)
val params = dialog?.window?.attributes
params?.width = activity.resources.getDimensionPixelOffset(R.dimen.dp_300)
dialog?.window?.attributes = params
a1.run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.iv.rotation = it.animatedValue as Float
}
start()
}
dialog?.setOnDismissListener {
a1.cancel()
}
AdmobNativeUtils.showNativeAd(activity, binding.flAd)
activity.lifecycleScope.launch(Dispatchers.Main) {
sharedFlow.collectLatest { path ->
binding.tvPath.text = path
}
}
activity.lifecycleScope.launch {
foundFlow.collectLatest {
binding.tvFoundNumber.text = "Found $it files"
}
}
btn = binding.tvBtn
return dialog
}
fun stopScan(scanType: Int, pathList: ArrayList<String>) {
a1.cancel()
btn.visibility = View.VISIBLE
btn.setOnClickListener {
activity.startActivity(Intent(activity, FileScanResultActivity::class.java).apply {
putExtra("ScanType", scanType)
putExtra("PathList", pathList.toTypedArray())
})
activity.finish()
}
}
}
\ No newline at end of file
......@@ -66,69 +66,69 @@
tools:ignore="ContentDescription"
tools:src="@mipmap/tu_photos_scan" />
<TextView
android:id="@+id/tv_scan"
android:layout_width="240dp"
android:layout_height="35dp"
android:layout_gravity="center"
android:layout_marginTop="40dp"
android:background="@drawable/bg_567dfd_15"
android:elevation="5dp"
android:gravity="center"
android:text="SCAN"
android:textColor="@color/white"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="Tap to start scanning"
android:textColor="#999999"
tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_file"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="20dp"
android:orientation="vertical"
android:visibility="gone">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ProgressBar
android:layout_width="35dp"
android:layout_height="35dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:text="Scanning..."
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
<TextView
android:id="@+id/tv_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="middle"
android:singleLine="true"
android:textSize="14sp"
tools:text="............." />
</LinearLayout>
<!-- <TextView-->
<!-- android:id="@+id/tv_scan"-->
<!-- android:layout_width="240dp"-->
<!-- android:layout_height="35dp"-->
<!-- android:layout_gravity="center"-->
<!-- android:layout_marginTop="40dp"-->
<!-- android:background="@drawable/bg_567dfd_15"-->
<!-- android:elevation="5dp"-->
<!-- android:gravity="center"-->
<!-- android:text="SCAN"-->
<!-- android:textColor="@color/white"-->
<!-- tools:ignore="HardcodedText" />-->
<!-- <TextView-->
<!-- android:id="@+id/tv_tip"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_gravity="center_horizontal"-->
<!-- android:layout_marginTop="20dp"-->
<!-- android:text="Tap to start scanning"-->
<!-- android:textColor="#999999"-->
<!-- tools:ignore="HardcodedText" />-->
<!-- <LinearLayout-->
<!-- android:id="@+id/ll_file"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginHorizontal="16dp"-->
<!-- android:layout_marginTop="20dp"-->
<!-- android:orientation="vertical"-->
<!-- android:visibility="gone">-->
<!-- <LinearLayout-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content">-->
<!-- <ProgressBar-->
<!-- android:layout_width="35dp"-->
<!-- android:layout_height="35dp" />-->
<!-- <TextView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_gravity="center_vertical"-->
<!-- android:layout_marginStart="8dp"-->
<!-- android:text="Scanning..."-->
<!-- android:textColor="@color/black"-->
<!-- android:textSize="16sp"-->
<!-- android:textStyle="bold"-->
<!-- tools:ignore="HardcodedText" />-->
<!-- </LinearLayout>-->
<!-- <TextView-->
<!-- android:id="@+id/tv_path"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:ellipsize="middle"-->
<!-- android:singleLine="true"-->
<!-- android:textSize="14sp"-->
<!-- tools:text="............." />-->
<!-- </LinearLayout>-->
</LinearLayout>
......
......@@ -220,48 +220,48 @@
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#EEEEEE" />
<LinearLayout
android:id="@+id/ll_user_agreement"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="18dp"
android:layout_marginEnd="10dp"
android:importantForAccessibility="no"
android:src="@mipmap/privacy"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:text="User Agreement"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="18dp"
android:src="@mipmap/jianotu" />
</LinearLayout>
<!-- <View-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="1px"-->
<!-- android:background="#EEEEEE" />-->
<!-- <LinearLayout-->
<!-- android:id="@+id/ll_user_agreement"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="60dp"-->
<!-- android:background="?attr/selectableItemBackground"-->
<!-- android:clickable="true"-->
<!-- android:focusable="true"-->
<!-- android:orientation="horizontal">-->
<!-- <ImageView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_gravity="center_vertical"-->
<!-- android:layout_marginStart="18dp"-->
<!-- android:layout_marginEnd="10dp"-->
<!-- android:importantForAccessibility="no"-->
<!-- android:src="@mipmap/privacy"-->
<!-- tools:ignore="ContentDescription" />-->
<!-- <TextView-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_gravity="center_vertical"-->
<!-- android:layout_weight="1"-->
<!-- android:text="User Agreement"-->
<!-- android:textColor="@color/black"-->
<!-- android:textSize="16sp"-->
<!-- android:textStyle="bold"-->
<!-- tools:ignore="HardcodedText" />-->
<!-- <androidx.appcompat.widget.AppCompatImageView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_gravity="center_vertical"-->
<!-- android:layout_marginEnd="18dp"-->
<!-- android:src="@mipmap/jianotu" />-->
<!-- </LinearLayout>-->
</LinearLayout>
......
......@@ -2,6 +2,9 @@
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="300dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardCornerRadius="10dp"
android:layout_height="wrap_content"
android:orientation="vertical">
......@@ -14,7 +17,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="13dp">
android:layout_marginTop="13dp"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/iv"
......@@ -35,12 +39,45 @@
</LinearLayout>
<TextView
android:id="@+id/tv_found_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:textSize="15sp"
tools:text="Found 100 files" />
<TextView
android:id="@+id/tv_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="5dp"
android:ellipsize="middle"
android:singleLine="true"
android:textSize="12sp" />
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="25dp" />
<TextView
android:id="@+id/tv_btn"
android:layout_width="251dp"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="25dp"
android:background="@drawable/bg_577dfd_22"
android:gravity="center"
android:text="Scan Completed"
android:textColor="@color/white"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
......
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