Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
D
Data Recovery White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Data Recovery White
Commits
7d3cd81b
Commit
7d3cd81b
authored
Jul 04, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...ui
parent
239af647
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
535 additions
and
55 deletions
+535
-55
MyApplication.kt
app/src/main/java/com/base/datarecovery/MyApplication.kt
+16
-12
FileRecoveredActivity.kt
...a/com/base/datarecovery/activity/FileRecoveredActivity.kt
+37
-0
FileRecoveryActivity.kt
...va/com/base/datarecovery/activity/FileRecoveryActivity.kt
+8
-6
FileScanResultActivity.kt
.../com/base/datarecovery/activity/FileScanResultActivity.kt
+5
-0
SplashActivity.kt
...ain/java/com/base/datarecovery/activity/SplashActivity.kt
+21
-2
FileTimeColumnsAdapter.kt
...a/com/base/datarecovery/adapter/FileTimeColumnsAdapter.kt
+72
-20
AdmobOpenUtils.kt
...src/main/java/com/base/datarecovery/ads/AdmobOpenUtils.kt
+124
-0
RecoveryBean.kt
app/src/main/java/com/base/datarecovery/bean/RecoveryBean.kt
+28
-0
ConfigHelper.kt
app/src/main/java/com/base/datarecovery/help/ConfigHelper.kt
+0
-1
LogEx.kt
app/src/main/java/com/base/datarecovery/utils/LogEx.kt
+1
-0
DialogViews.kt
app/src/main/java/com/base/datarecovery/view/DialogViews.kt
+2
-2
bg_ffffff_22.xml
app/src/main/res/drawable/bg_ffffff_22.xml
+7
-0
bg_stroke_ffffff_22.xml
app/src/main/res/drawable/bg_stroke_ffffff_22.xml
+8
-0
activity_file_recovered.xml
app/src/main/res/layout/activity_file_recovered.xml
+128
-2
activity_file_recovery.xml
app/src/main/res/layout/activity_file_recovery.xml
+16
-7
item_document.xml
app/src/main/res/layout/item_document.xml
+56
-0
item_time_media.xml
app/src/main/res/layout/item_time_media.xml
+2
-3
doc.png
app/src/main/res/mipmap-xxhdpi/doc.png
+0
-0
fanhui.png
app/src/main/res/mipmap-xxhdpi/fanhui.png
+0
-0
pdf.png
app/src/main/res/mipmap-xxhdpi/pdf.png
+0
-0
ppt.png
app/src/main/res/mipmap-xxhdpi/ppt.png
+0
-0
tu_yanhua.png
app/src/main/res/mipmap-xxhdpi/tu_yanhua.png
+0
-0
tubg_yanhua.png
app/src/main/res/mipmap-xxhdpi/tubg_yanhua.png
+0
-0
xls.png
app/src/main/res/mipmap-xxhdpi/xls.png
+0
-0
dimens.xml
app/src/main/res/values/dimens.xml
+4
-0
No files found.
app/src/main/java/com/base/datarecovery/MyApplication.kt
View file @
7d3cd81b
...
...
@@ -2,7 +2,10 @@ package com.base.datarecovery
import
android.annotation.SuppressLint
import
android.app.Activity
import
android.content.Intent
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.help.BaseApplication
import
com.base.datarecovery.help.ConfigHelper
...
...
@@ -25,6 +28,7 @@ class MyApplication : BaseApplication() {
MobileAds
.
initialize
(
this
)
{
initializationStatus
->
}
}
initLifeListener
()
}
...
...
@@ -58,18 +62,18 @@ class MyApplication : BaseApplication() {
}
if
(
flag
)
{
// if (Admob
Utils.isOpenAdLoaded()) {
// Admob
Utils.showAppOpenAd(activity)
//
} else {
//
topActivity?.startActivity(
//
Intent(
//
topActivity,
// New
SplashActivity::class.java
//
).apply {
//
putExtra("isHotLaunch", true)
//
putExtra("type", -1)
//
})
//
}
if
(
AdmobOpen
Utils
.
isOpenAdLoaded
())
{
AdmobOpen
Utils
.
showAppOpenAd
(
activity
)
}
else
{
topActivity
?.
startActivity
(
Intent
(
topActivity
,
SplashActivity
::
class
.
java
).
apply
{
putExtra
(
"isHotLaunch"
,
true
)
putExtra
(
"type"
,
-
1
)
})
}
}
}
}
...
...
app/src/main/java/com/base/datarecovery/activity/FileRecoveredActivity.kt
View file @
7d3cd81b
package
com.base.datarecovery.activity
import
android.graphics.Color
import
android.os.Bundle
import
androidx.activity.addCallback
import
androidx.activity.enableEdgeToEdge
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.view.ViewCompat
import
androidx.core.view.WindowInsetsCompat
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.help.BaseActivity
import
com.base.datarecovery.utils.BarUtils
class
FileRecoveredActivity
:
BaseActivity
<
ActivityFileRecoveredBinding
>()
{
...
...
@@ -17,6 +23,37 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
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
app/src/main/java/com/base/datarecovery/activity/FileRecoveryActivity.kt
View file @
7d3cd81b
...
...
@@ -6,13 +6,12 @@ import android.graphics.BitmapFactory
import
android.graphics.Color
import
android.os.Environment
import
android.view.View
import
android.widget.Toast
import
androidx.activity.addCallback
import
androidx.core.content.ContextCompat
import
androidx.core.view.isVisible
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.R
import
com.base.datarecovery.adapter.File
Media
ColumnsAdapter
import
com.base.datarecovery.adapter.File
Time
ColumnsAdapter
import
com.base.datarecovery.adapter.RecoveryFilterAdapter
import
com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
...
...
@@ -39,7 +38,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
}
private
var
folderBean
:
FolderBean
?
=
null
private
lateinit
var
adapter
:
File
Media
ColumnsAdapter
private
lateinit
var
adapter
:
File
Time
ColumnsAdapter
private
lateinit
var
filterAdapter
:
RecoveryFilterAdapter
...
...
@@ -95,7 +94,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
}
adapter
=
File
MediaColumnsAdapter
(
adapter
=
File
TimeColumnsAdapter
(
scanType
,
select
=
{
all
,
size
->
binding
.
ivSelectAll
.
isSelected
=
all
binding
.
tvRecover
.
text
=
"Recover($size)"
...
...
@@ -125,7 +124,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
binding
.
switchThumbnails
.
setOnCheckedChangeListener
{
buttonView
,
isChecked
->
adapter
.
toggleThumbnails
(
isChecked
)
}
binding
.
iv
SelectAll
.
setOnClickListener
{
binding
.
fl
SelectAll
.
setOnClickListener
{
binding
.
ivSelectAll
.
isSelected
=
!
binding
.
ivSelectAll
.
isSelected
adapter
.
toggleAllSelect
(
binding
.
ivSelectAll
.
isSelected
)
}
...
...
@@ -161,7 +160,10 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
},
finish
=
{
adapter
.
toggleAllSelect
(
false
)
startActivity
(
Intent
(
this
,
FileRecoveredActivity
::
class
.
java
))
startActivity
(
Intent
(
this
,
FileRecoveredActivity
::
class
.
java
).
apply
{
putExtra
(
"Number"
,
list
.
size
)
putExtra
(
"ScanType"
,
scanType
)
})
})
}
...
...
app/src/main/java/com/base/datarecovery/activity/FileScanResultActivity.kt
View file @
7d3cd81b
...
...
@@ -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.FolderBean
import
com.base.datarecovery.bean.RecoveryBean
import
com.base.datarecovery.bean.RecoveryBean.Companion.setType
import
com.base.datarecovery.databinding.ActivityFileScanResultBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.utils.BarUtils
...
...
@@ -90,6 +91,10 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
val
list
=
hashMap
.
map
{
val
folder
=
it
.
key
.
split
(
"/"
).
last
()
if
(
scanType
==
SCAN_DOCUMENTS
)
{
it
.
value
.
forEach
{
bean
->
bean
.
setType
()
}
}
FolderBean
(
folder
,
recoveryList
=
it
.
value
)
}
binding
.
tvFolderNumber
.
text
=
list
.
size
.
toString
()
...
...
app/src/main/java/com/base/datarecovery/activity/SplashActivity.kt
View file @
7d3cd81b
...
...
@@ -10,10 +10,12 @@ import android.text.style.UnderlineSpan
import
android.view.View
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.ads.AdmobNativeUtils
import
com.base.datarecovery.ads.AdmobOpenUtils
import
com.base.datarecovery.databinding.ActivitySplashBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.ConfigHelper
import
com.base.datarecovery.utils.BarUtils
import
com.base.datarecovery.utils.LogEx
import
com.base.datarecovery.utils.SPUtils
import
kotlinx.coroutines.Job
import
kotlinx.coroutines.delay
...
...
@@ -27,6 +29,7 @@ import kotlin.random.Random
@SuppressLint
(
"CustomSplashScreen"
)
class
SplashActivity
:
BaseActivity
<
ActivitySplashBinding
>()
{
private
val
TAG
=
"SplashActivity"
private
var
job
:
Job
?
=
null
private
val
progress
=
MutableSharedFlow
<
Int
>()
private
val
progressFlow
:
SharedFlow
<
Int
>
=
progress
...
...
@@ -77,6 +80,9 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
}
AdmobNativeUtils
.
loadNativeAd
()
AdmobOpenUtils
.
loadAppOpenAd
{
LogEx
.
logDebug
(
TAG
,
"load where=$it"
)
}
}
private
fun
jumpNext
()
{
...
...
@@ -105,12 +111,25 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
}
}
fun
startProgress
()
=
lifecycleScope
.
launch
{
var
processTime
=
0L
private
fun
startProgress
()
=
lifecycleScope
.
launch
{
while
(
isActive
)
{
delay
(
Random
.
nextLong
(
50
,
150
))
val
value
=
binding
.
pb
.
progress
+
Random
.
nextInt
(
3
,
5
)
binding
.
pb
.
setProgress
(
value
,
true
)
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
()
}
}
}
}
...
...
app/src/main/java/com/base/datarecovery/adapter/File
Media
ColumnsAdapter.kt
→
app/src/main/java/com/base/datarecovery/adapter/File
Time
ColumnsAdapter.kt
View file @
7d3cd81b
package
com.base.datarecovery.adapter
import
android.annotation.SuppressLint
import
android.view.Gravity
import
android.view.View
import
android.view.ViewGroup
import
android.widget.ImageView
import
android.widget.LinearLayout
import
android.widget.TextView
import
androidx.recyclerview.widget.GridLayoutManager
import
androidx.recyclerview.widget.LinearLayoutManager
import
androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView.ViewHolder
import
com.base.datarecovery.R
import
com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.datarecovery.bean.FolderBean
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.view.XmlEx.inflate
import
com.bumptech.glide.Glide
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
,
)
:
RecyclerView
.
Adapter
<
File
Media
ColumnsAdapter
.
MCV
>()
{
)
:
RecyclerView
.
Adapter
<
File
Time
ColumnsAdapter
.
MCV
>()
{
private
val
beanList
=
arrayListOf
<
FolderBean
>()
private
var
hideThumbnails
:
Boolean
=
false
...
...
@@ -28,7 +36,7 @@ class FileMediaColumnsAdapter(
class
MCV
(
view
:
View
)
:
ViewHolder
(
view
)
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
{
...
...
@@ -36,7 +44,7 @@ class FileMediaColumnsAdapter(
}
override
fun
onBindViewHolder
(
holder
:
MCV
,
position
:
Int
)
{
val
binding
=
ItemMediaBinding
.
bind
(
holder
.
itemView
)
val
binding
=
Item
Time
MediaBinding
.
bind
(
holder
.
itemView
)
val
context
=
holder
.
itemView
.
context
val
bean
=
beanList
[
position
]
...
...
@@ -45,7 +53,17 @@ class FileMediaColumnsAdapter(
val
subAdapter
=
MediaColumnsAdapter
()
binding
.
rvMediaColumns
.
layoutManager
=
GridLayoutManager
(
context
,
columns
)
if
(
scanType
==
SCAN_DOCUMENTS
)
{
binding
.
rvMediaColumns
.
layoutManager
=
LinearLayoutManager
(
context
)
}
else
{
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
val
list
=
if
(
hideThumbnails
)
bean
.
recoveryList
.
filter
{
!
it
.
isThumbnails
}
else
bean
.
recoveryList
if
(
list
.
isEmpty
())
{
...
...
@@ -80,12 +98,15 @@ class FileMediaColumnsAdapter(
}
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
CS
{
va
l
layout
=
when
(
columns
)
{
va
r
layout
=
when
(
columns
)
{
2
->
R
.
layout
.
item_media_columns2
3
->
R
.
layout
.
item_media_columns3
4
->
R
.
layout
.
item_media_columns4
else
->
R
.
layout
.
item_media_columns2
}
if
(
scanType
==
SCAN_DOCUMENTS
)
{
layout
=
R
.
layout
.
item_document
}
return
CS
(
layout
.
inflate
(
parent
))
}
...
...
@@ -101,23 +122,54 @@ class FileMediaColumnsAdapter(
val
context
=
holder
.
itemView
.
context
val
data
=
list
[
position
]
if
(
payloads
.
isEmpty
())
{
Glide
.
with
(
context
).
asBitmap
().
load
(
data
.
path
).
centerCrop
().
into
(
holder
.
iv
)
holder
.
iv
.
tag
=
data
.
path
holder
.
ivSelector
.
isSelected
=
data
.
isSelect
holder
.
ivSelector
.
setOnClickListener
{
data
.
isSelect
=
!
data
.
isSelect
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
notifyItemChanged
(
position
,
"changeIv"
)
subItemClick
(
data
)
super
.
onBindViewHolder
(
holder
,
position
,
payloads
)
}
val
file
=
File
(
data
.
path
)
holder
.
tvSize
.
text
=
file
.
length
().
toFormatSize
()
}
else
{
holder
.
ivSelector
.
isSelected
=
data
.
isSelect
super
.
onBindViewHolder
(
holder
,
position
,
payloads
)
if
(
payloads
.
isEmpty
())
{
Glide
.
with
(
context
).
asBitmap
().
load
(
data
.
path
).
centerCrop
().
into
(
holder
.
iv
)
holder
.
ivSelector
.
isSelected
=
data
.
isSelect
holder
.
itemView
.
setOnClickListener
{
data
.
isSelect
=
!
data
.
isSelect
holder
.
ivSelector
.
isSelected
=
data
.
isSelect
notifyItemChanged
(
position
,
"changeIv"
)
subItemClick
(
data
)
}
val
file
=
File
(
data
.
path
)
holder
.
tvSize
.
text
=
file
.
length
().
toFormatSize
()
}
else
{
holder
.
ivSelector
.
isSelected
=
data
.
isSelect
super
.
onBindViewHolder
(
holder
,
position
,
payloads
)
}
}
}
@SuppressLint
(
"NotifyDataSetChanged"
)
...
...
app/src/main/java/com/base/datarecovery/ads/AdmobOpenUtils.kt
0 → 100644
View file @
7d3cd81b
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
app/src/main/java/com/base/datarecovery/bean/RecoveryBean.kt
View file @
7d3cd81b
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
(
val
path
:
String
=
""
,
)
{
var
isSelect
:
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
app/src/main/java/com/base/datarecovery/help/ConfigHelper.kt
View file @
7d3cd81b
package
com.base.datarecovery.help
import
com.base.datarecovery.activity.SplashActivity
import
com.base.datarecovery.utils.SPUtils
object
ConfigHelper
{
...
...
app/src/main/java/com/base/datarecovery/utils/LogEx.kt
View file @
7d3cd81b
...
...
@@ -7,6 +7,7 @@ object LogEx {
val
isOpen
=
true
val
filterTAG
=
arrayOf
(
"FileScanActivity"
,
"FileHexEx"
)
fun
logDebug
(
tag
:
String
,
content
:
String
,
isMust
:
Boolean
=
false
)
{
...
...
app/src/main/java/com/base/datarecovery/view/DialogViews.kt
View file @
7d3cd81b
...
...
@@ -108,9 +108,9 @@ object DialogViews {
val
recoveryFile
=
File
(
dir
,
file
.
name
)
file
.
copyTo
(
recoveryFile
,
true
)
}
mutableSharedFlow
.
emit
(
index
+
1
)
index
++
mutableSharedFlow
.
emit
(
index
)
delay
(
Random
.
nextLong
(
500
,
1500
))
index
++
}
mutableSharedFlow
.
emit
(-
1
)
}
...
...
app/src/main/res/drawable/bg_ffffff_22.xml
0 → 100644
View file @
7d3cd81b
<?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
app/src/main/res/drawable/bg_stroke_ffffff_22.xml
0 → 100644
View file @
7d3cd81b
<?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
app/src/main/res/layout/activity_file_recovered.xml
View file @
7d3cd81b
<?xml version="1.0" encoding="utf-8"?>
<
androidx.constraintlayout.widget.Constraint
Layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
<
Linear
Layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:id=
"@+id/main"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#577DFD"
android:orientation=
"vertical"
tools:context=
".activity.FileRecoveredActivity"
>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<androidx.constraintlayout.widget.ConstraintLayout
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
app/src/main/res/layout/activity_file_recovery.xml
View file @
7d3cd81b
...
...
@@ -165,7 +165,8 @@
android:id=
"@+id/ll_all_select"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"16dp"
android:layout_marginStart=
"6dp"
android:layout_marginEnd=
"16dp"
android:background=
"@color/white"
android:orientation=
"horizontal"
android:paddingTop=
"20dp"
...
...
@@ -173,13 +174,21 @@
app:layout_constraintTop_toBottomOf=
"@id/cl_top"
app:layout_scrollFlags=
"scroll|enterAlways"
>
<
ImageView
android:id=
"@+id/
iv
_select_all"
<
FrameLayout
android:id=
"@+id/
fl
_select_all"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:src=
"@drawable/bg_circle_selector"
tools:ignore=
"ContentDescription"
/>
android:padding=
"10dp"
>
<ImageView
android:id=
"@+id/iv_select_all"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:src=
"@drawable/bg_circle_selector"
tools:ignore=
"ContentDescription"
/>
</FrameLayout>
<TextView
android:layout_width=
"0dp"
...
...
@@ -271,7 +280,7 @@
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv"
android:layout_width=
"
wrap_cont
ent"
android:layout_width=
"
match_par
ent"
android:layout_height=
"match_parent"
android:layout_gravity=
"center_horizontal"
android:background=
"#FDFDFD"
...
...
app/src/main/res/layout/item_document.xml
0 → 100644
View file @
7d3cd81b
<?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
app/src/main/res/layout/item_media.xml
→
app/src/main/res/layout/item_
time_
media.xml
View file @
7d3cd81b
...
...
@@ -16,7 +16,7 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"
8
dp"
android:layout_marginStart=
"
16
dp"
android:textColor=
"@color/black"
android:textSize=
"16sp"
android:textStyle=
"bold"
...
...
@@ -25,11 +25,10 @@
<LinearLayout
android:id=
"@+id/ll_select"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical|end"
android:layout_marginEnd=
"
8
dp"
android:layout_marginEnd=
"
16
dp"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
...
...
app/src/main/res/mipmap-xxhdpi/doc.png
0 → 100644
View file @
7d3cd81b
4.13 KB
app/src/main/res/mipmap-xxhdpi/fanhui.png
0 → 100644
View file @
7d3cd81b
649 Bytes
app/src/main/res/mipmap-xxhdpi/pdf.png
0 → 100644
View file @
7d3cd81b
2.96 KB
app/src/main/res/mipmap-xxhdpi/ppt.png
0 → 100644
View file @
7d3cd81b
2.54 KB
app/src/main/res/mipmap-xxhdpi/tu_yanhua.png
0 → 100644
View file @
7d3cd81b
10.7 KB
app/src/main/res/mipmap-xxhdpi/tubg_yanhua.png
0 → 100644
View file @
7d3cd81b
12.7 KB
app/src/main/res/mipmap-xxhdpi/xls.png
0 → 100644
View file @
7d3cd81b
3.89 KB
app/src/main/res/values/dimens.xml
0 → 100644
View file @
7d3cd81b
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen
name=
"dp_8"
>
8dp
</dimen>
</resources>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment