Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
F
File Recovery RecycleBin
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
File Recovery RecycleBin
Commits
49a23028
Commit
49a23028
authored
Jul 17, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
切换max
parent
b75e9002
Hide whitespace changes
Inline
Side-by-side
Showing
34 changed files
with
827 additions
and
99 deletions
+827
-99
ResultActivity.kt
...om/base/filerecoveryrecyclebin/activity/ResultActivity.kt
+3
-2
CleanJunkActivity.kt
...ecoveryrecyclebin/activity/junkclean/CleanJunkActivity.kt
+2
-1
CleaningActivity.kt
...recoveryrecyclebin/activity/junkclean/CleaningActivity.kt
+2
-1
ScanJunkActivity.kt
...recoveryrecyclebin/activity/junkclean/ScanJunkActivity.kt
+2
-1
PrivacyManageActivity.kt
...recyclebin/activity/privacyspace/PrivacyManageActivity.kt
+2
-1
PrivacySpaceActivity.kt
...yrecyclebin/activity/privacyspace/PrivacySpaceActivity.kt
+2
-1
FileRecoveredActivity.kt
...veryrecyclebin/activity/recovery/FileRecoveredActivity.kt
+2
-0
FileRecoveryActivity.kt
...overyrecyclebin/activity/recovery/FileRecoveryActivity.kt
+5
-0
FileScanActivity.kt
...erecoveryrecyclebin/activity/recovery/FileScanActivity.kt
+2
-1
FileScanResultActivity.kt
...eryrecyclebin/activity/recovery/FileScanResultActivity.kt
+17
-6
RepeatActivity.kt
.../filerecoveryrecyclebin/activity/repeat/RepeatActivity.kt
+5
-10
RepeatAnimationActivity.kt
...veryrecyclebin/activity/repeat/RepeatAnimationActivity.kt
+4
-10
ScreenShotActivity.kt
...overyrecyclebin/activity/screenshot/ScreenShotActivity.kt
+5
-3
ScreenShotAnimationActivity.kt
...clebin/activity/screenshot/ScreenShotAnimationActivity.kt
+2
-1
FileTimeColumnsAdapter.kt
.../filerecoveryrecyclebin/adapter/FileTimeColumnsAdapter.kt
+5
-1
RecycleBinAdapter.kt
.../base/filerecoveryrecyclebin/adapter/RecycleBinAdapter.kt
+13
-7
AdMaxInit.kt
...java/com/base/filerecoveryrecyclebin/ads/max/AdMaxInit.kt
+7
-5
ConstObject.kt
.../java/com/base/filerecoveryrecyclebin/bean/ConstObject.kt
+1
-0
RecoveryBean.kt
...java/com/base/filerecoveryrecyclebin/bean/RecoveryBean.kt
+18
-1
HomeFragment.kt
.../com/base/filerecoveryrecyclebin/fragment/HomeFragment.kt
+18
-44
RecycleBinFragment.kt
...ase/filerecoveryrecyclebin/fragment/RecycleBinFragment.kt
+94
-0
FileHexEx.kt
...n/java/com/base/filerecoveryrecyclebin/utils/FileHexEx.kt
+29
-1
LogEx.kt
.../main/java/com/base/filerecoveryrecyclebin/utils/LogEx.kt
+1
-1
FileScanDialog.kt
...va/com/base/filerecoveryrecyclebin/view/FileScanDialog.kt
+2
-1
fragment_home_3.xml
app/src/main/res/layout/fragment_home_3.xml
+454
-0
fragment_recycle_bin.xml
app/src/main/res/layout/fragment_recycle_bin.xml
+45
-0
item_media_file.xml
app/src/main/res/layout/item_media_file.xml
+1
-0
item_recyclebin_file.xml
app/src/main/res/layout/item_recyclebin_file.xml
+83
-0
h_duplicate.png
app/src/main/res/mipmap-xxhdpi/h_duplicate.png
+0
-0
h_photos.png
app/src/main/res/mipmap-xxhdpi/h_photos.png
+0
-0
h_screenshot.png
app/src/main/res/mipmap-xxhdpi/h_screenshot.png
+0
-0
h_videos.png
app/src/main/res/mipmap-xxhdpi/h_videos.png
+0
-0
r_queshengtu.png
app/src/main/res/mipmap-xxhdpi/r_queshengtu.png
+0
-0
memosj.json
app/src/main/res/raw/memosj.json
+1
-0
No files found.
app/src/main/java/com/base/filerecoveryrecyclebin/activity/ResultActivity.kt
View file @
49a23028
...
@@ -13,6 +13,7 @@ import com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity
...
@@ -13,6 +13,7 @@ import com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity
import
com.base.filerecoveryrecyclebin.activity.repeat.RepeatAnimationActivity
import
com.base.filerecoveryrecyclebin.activity.repeat.RepeatAnimationActivity
import
com.base.filerecoveryrecyclebin.activity.screenshot.ScreenShotAnimationActivity
import
com.base.filerecoveryrecyclebin.activity.screenshot.ScreenShotAnimationActivity
import
com.base.filerecoveryrecyclebin.adapter.AppFunctionAdapter
import
com.base.filerecoveryrecyclebin.adapter.AppFunctionAdapter
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import
com.base.filerecoveryrecyclebin.bean.ConstObject.JUNK_CLEANER
import
com.base.filerecoveryrecyclebin.bean.ConstObject.JUNK_CLEANER
...
@@ -115,7 +116,7 @@ class ResultActivity : BaseActivity<ActivityLayoutResultBinding>() {
...
@@ -115,7 +116,7 @@ class ResultActivity : BaseActivity<ActivityLayoutResultBinding>() {
onBackPressedDispatcher
.
addCallback
(
object
:
OnBackPressedCallback
(
true
)
{
onBackPressedDispatcher
.
addCallback
(
object
:
OnBackPressedCallback
(
true
)
{
override
fun
handleOnBackPressed
()
{
override
fun
handleOnBackPressed
()
{
Admob
InterstitialUtils
.
showInterstitialAd
(
this
@ResultActivity
)
{
Admob
MaxHelper
.
admobMaxShowInterstitialAd
(
this
@ResultActivity
)
{
finishToMain
()
finishToMain
()
}
}
}
}
...
@@ -125,7 +126,7 @@ class ResultActivity : BaseActivity<ActivityLayoutResultBinding>() {
...
@@ -125,7 +126,7 @@ class ResultActivity : BaseActivity<ActivityLayoutResultBinding>() {
onBackPressedDispatcher
.
onBackPressed
()
onBackPressedDispatcher
.
onBackPressed
()
}
}
Admob
NativeUtils
.
showNativeAd
(
this
@ResultActivity
,
binding
.
flAd
,
R
.
layout
.
layout_native_custom_white
)
Admob
MaxHelper
.
admobMaxShowNativeAd
(
this
@ResultActivity
,
binding
.
flAd
,
0
)
}
}
override
fun
onDestroy
()
{
override
fun
onDestroy
()
{
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/junkclean/CleanJunkActivity.kt
View file @
49a23028
...
@@ -14,6 +14,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
...
@@ -14,6 +14,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import
com.base.filerecoveryrecyclebin.BuildConfig
import
com.base.filerecoveryrecyclebin.BuildConfig
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.activity.ResultActivity
import
com.base.filerecoveryrecyclebin.activity.ResultActivity
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.bean.ChildBean
import
com.base.filerecoveryrecyclebin.bean.ChildBean
import
com.base.filerecoveryrecyclebin.bean.ConstObject.JUNK_CLEANER
import
com.base.filerecoveryrecyclebin.bean.ConstObject.JUNK_CLEANER
...
@@ -88,7 +89,7 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
...
@@ -88,7 +89,7 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
override
fun
handleOnBackPressed
()
{
override
fun
handleOnBackPressed
()
{
showExitFunctionDialog
{
showExitFunctionDialog
{
if
(
it
)
{
if
(
it
)
{
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
@CleanJunkActivity
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
@CleanJunkActivity
)
{
finishToMain
()
finishToMain
()
}
}
}
else
{
}
else
{
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/junkclean/CleaningActivity.kt
View file @
49a23028
...
@@ -9,6 +9,7 @@ import androidx.activity.addCallback
...
@@ -9,6 +9,7 @@ import androidx.activity.addCallback
import
androidx.core.animation.doOnEnd
import
androidx.core.animation.doOnEnd
import
androidx.core.view.updatePadding
import
androidx.core.view.updatePadding
import
com.base.filerecoveryrecyclebin.activity.ResultActivity
import
com.base.filerecoveryrecyclebin.activity.ResultActivity
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.bean.ConstObject.JUNK_CLEANER
import
com.base.filerecoveryrecyclebin.bean.ConstObject.JUNK_CLEANER
import
com.base.filerecoveryrecyclebin.databinding.ActivityLayoutCleanupingBinding
import
com.base.filerecoveryrecyclebin.databinding.ActivityLayoutCleanupingBinding
...
@@ -77,7 +78,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
...
@@ -77,7 +78,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
binding
.
idTvJd
.
text
=
"${it.animatedValue as Int}"
binding
.
idTvJd
.
text
=
"${it.animatedValue as Int}"
}
}
doOnEnd
{
doOnEnd
{
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
@CleaningActivity
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
@CleaningActivity
)
{
startActivity
(
startActivity
(
Intent
(
this
@CleaningActivity
,
ResultActivity
::
class
.
java
).
putExtra
(
"from"
,
JUNK_CLEANER
)
Intent
(
this
@CleaningActivity
,
ResultActivity
::
class
.
java
).
putExtra
(
"from"
,
JUNK_CLEANER
)
.
putExtra
(
"clean_size"
,
intentSize
)
.
putExtra
(
"clean_size"
,
intentSize
)
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/junkclean/ScanJunkActivity.kt
View file @
49a23028
...
@@ -7,6 +7,7 @@ import android.view.animation.LinearInterpolator
...
@@ -7,6 +7,7 @@ import android.view.animation.LinearInterpolator
import
android.widget.Toast
import
android.widget.Toast
import
androidx.activity.addCallback
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.core.view.updatePadding
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.databinding.ActivityLayoutScanJunkBinding
import
com.base.filerecoveryrecyclebin.databinding.ActivityLayoutScanJunkBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.help.BaseActivity
...
@@ -121,7 +122,7 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
...
@@ -121,7 +122,7 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
binding
.
root
.
postDelayed
({
binding
.
root
.
postDelayed
({
if
(
showAd
)
{
if
(
showAd
)
{
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
)
{
a1
.
cancel
()
a1
.
cancel
()
a2
.
cancel
()
a2
.
cancel
()
a3
.
cancel
()
a3
.
cancel
()
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/privacyspace/PrivacyManageActivity.kt
View file @
49a23028
...
@@ -8,6 +8,7 @@ import android.widget.Toast
...
@@ -8,6 +8,7 @@ import android.widget.Toast
import
androidx.core.view.updatePadding
import
androidx.core.view.updatePadding
import
androidx.lifecycle.lifecycleScope
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.adapter.MediaSubAdapter
import
com.base.filerecoveryrecyclebin.adapter.MediaSubAdapter
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.bean.MediaBean
import
com.base.filerecoveryrecyclebin.bean.MediaBean
import
com.base.filerecoveryrecyclebin.databinding.ActivityPrivacyManageBinding
import
com.base.filerecoveryrecyclebin.databinding.ActivityPrivacyManageBinding
...
@@ -69,7 +70,7 @@ class PrivacyManageActivity : BaseActivity<ActivityPrivacyManageBinding>() {
...
@@ -69,7 +70,7 @@ class PrivacyManageActivity : BaseActivity<ActivityPrivacyManageBinding>() {
private
fun
deleteFilesDirMedia
()
{
private
fun
deleteFilesDirMedia
()
{
showDeletePermanentlyDialog
{
showDeletePermanentlyDialog
{
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
)
{
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
list
=
mediaSubAdapter
.
getSelectData
()
val
list
=
mediaSubAdapter
.
getSelectData
()
list
.
forEach
{
list
.
forEach
{
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/privacyspace/PrivacySpaceActivity.kt
View file @
49a23028
...
@@ -8,6 +8,7 @@ import androidx.activity.addCallback
...
@@ -8,6 +8,7 @@ import androidx.activity.addCallback
import
androidx.fragment.app.Fragment
import
androidx.fragment.app.Fragment
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.widget.ViewPager2
import
androidx.viewpager2.widget.ViewPager2
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.bean.ConstObject.privacyPinPassword
import
com.base.filerecoveryrecyclebin.bean.ConstObject.privacyPinPassword
import
com.base.filerecoveryrecyclebin.databinding.ActivityPrivacySpaceBinding
import
com.base.filerecoveryrecyclebin.databinding.ActivityPrivacySpaceBinding
...
@@ -92,7 +93,7 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
...
@@ -92,7 +93,7 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
onBackPressedDispatcher
.
addCallback
{
onBackPressedDispatcher
.
addCallback
{
showExitFunctionDialog
(
true
)
{
showExitFunctionDialog
(
true
)
{
if
(
it
)
{
if
(
it
)
{
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
@PrivacySpaceActivity
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
@PrivacySpaceActivity
)
{
finishToMain
()
finishToMain
()
}
}
}
else
{
}
else
{
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/recovery/FileRecoveredActivity.kt
View file @
49a23028
...
@@ -5,6 +5,7 @@ import android.graphics.Color
...
@@ -5,6 +5,7 @@ import android.graphics.Color
import
android.os.Environment
import
android.os.Environment
import
androidx.activity.addCallback
import
androidx.activity.addCallback
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_AUDIOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_VIDEOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_VIDEOS
...
@@ -34,6 +35,7 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
...
@@ -34,6 +35,7 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
SCAN_PHOTOS
->
if
(
number
==
1
)
"Photo"
else
"Photos"
SCAN_PHOTOS
->
if
(
number
==
1
)
"Photo"
else
"Photos"
SCAN_VIDEOS
->
if
(
number
==
1
)
"Video"
else
"Videos"
SCAN_VIDEOS
->
if
(
number
==
1
)
"Video"
else
"Videos"
SCAN_DOCUMENTS
->
if
(
number
==
1
)
"Document"
else
"Documents"
SCAN_DOCUMENTS
->
if
(
number
==
1
)
"Document"
else
"Documents"
SCAN_AUDIOS
->
if
(
number
==
1
)
"Audio"
else
"Audios"
else
->
""
else
->
""
}
}
binding
.
tvType
.
text
=
type
binding
.
tvType
.
text
=
type
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/recovery/FileRecoveryActivity.kt
View file @
49a23028
...
@@ -13,6 +13,7 @@ import androidx.lifecycle.lifecycleScope
...
@@ -13,6 +13,7 @@ import androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.adapter.FileTimeColumnsAdapter
import
com.base.filerecoveryrecyclebin.adapter.FileTimeColumnsAdapter
import
com.base.filerecoveryrecyclebin.adapter.RecoveryFilterAdapter
import
com.base.filerecoveryrecyclebin.adapter.RecoveryFilterAdapter
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_AUDIOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_VIDEOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_VIDEOS
...
@@ -94,6 +95,9 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
...
@@ -94,6 +95,9 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
binding
.
clThumbnails
.
visibility
=
View
.
GONE
binding
.
clThumbnails
.
visibility
=
View
.
GONE
}
}
SCAN_AUDIOS
->
{
binding
.
clThumbnails
.
visibility
=
View
.
GONE
}
}
}
adapter
=
FileTimeColumnsAdapter
(
scanType
,
adapter
=
FileTimeColumnsAdapter
(
scanType
,
...
@@ -145,6 +149,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
...
@@ -145,6 +149,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
SCAN_PHOTOS
->
dirType
=
"Photo"
SCAN_PHOTOS
->
dirType
=
"Photo"
SCAN_DOCUMENTS
->
dirType
=
"Document"
SCAN_DOCUMENTS
->
dirType
=
"Document"
SCAN_VIDEOS
->
dirType
=
"Video"
SCAN_VIDEOS
->
dirType
=
"Video"
SCAN_AUDIOS
->
dirType
=
"Audio"
}
}
val
appName
=
this
.
resources
.
getString
(
R
.
string
.
app_name
)
val
appName
=
this
.
resources
.
getString
(
R
.
string
.
app_name
)
val
appDir
=
File
(
Environment
.
getExternalStorageDirectory
(),
appName
)
val
appDir
=
File
(
Environment
.
getExternalStorageDirectory
(),
appName
)
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/recovery/FileScanActivity.kt
View file @
49a23028
...
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
...
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import
android.graphics.Color
import
android.graphics.Color
import
androidx.activity.addCallback
import
androidx.activity.addCallback
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
...
@@ -54,7 +55,7 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() {
...
@@ -54,7 +55,7 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() {
onBackPressedDispatcher
.
addCallback
{
onBackPressedDispatcher
.
addCallback
{
showExitFunctionDialog
{
showExitFunctionDialog
{
if
(
it
)
{
if
(
it
)
{
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
@FileScanActivity
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
@FileScanActivity
)
{
finishToMain
()
finishToMain
()
}
}
}
else
{
}
else
{
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/recovery/FileScanResultActivity.kt
View file @
49a23028
...
@@ -9,13 +9,16 @@ import androidx.activity.addCallback
...
@@ -9,13 +9,16 @@ import androidx.activity.addCallback
import
androidx.core.view.isVisible
import
androidx.core.view.isVisible
import
androidx.lifecycle.lifecycleScope
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.adapter.FileFolderAdapter
import
com.base.filerecoveryrecyclebin.adapter.FileFolderAdapter
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_AUDIOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_VIDEOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_VIDEOS
import
com.base.filerecoveryrecyclebin.bean.FolderBean
import
com.base.filerecoveryrecyclebin.bean.FolderBean
import
com.base.filerecoveryrecyclebin.bean.RecoveryBean
import
com.base.filerecoveryrecyclebin.bean.RecoveryBean
import
com.base.filerecoveryrecyclebin.bean.RecoveryBean.Companion.setType
import
com.base.filerecoveryrecyclebin.bean.RecoveryBean.Companion.setAudioType
import
com.base.filerecoveryrecyclebin.bean.RecoveryBean.Companion.setDocumentType
import
com.base.filerecoveryrecyclebin.databinding.ActivityFileScanResultBinding
import
com.base.filerecoveryrecyclebin.databinding.ActivityFileScanResultBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.help.FileHelp.loadFileByFilter
import
com.base.filerecoveryrecyclebin.help.FileHelp.loadFileByFilter
...
@@ -67,7 +70,12 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
...
@@ -67,7 +70,12 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
SCAN_VIDEOS
->
{
SCAN_VIDEOS
->
{
binding
.
tvTittle
.
text
=
"Video Recovery"
binding
.
tvTittle
.
text
=
"Video Recovery"
binding
.
tvFileType
.
text
=
"videos"
binding
.
tvFileType
.
text
=
"Videos"
}
SCAN_AUDIOS
->
{
binding
.
tvTittle
.
text
=
"Audio Recovery"
binding
.
tvFileType
.
text
=
"Audios"
}
}
}
}
fileFolderAdapter
=
FileFolderAdapter
(
scanType
)
{
folderBean
->
fileFolderAdapter
=
FileFolderAdapter
(
scanType
)
{
folderBean
->
...
@@ -94,7 +102,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
...
@@ -94,7 +102,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
onBackPressedDispatcher
.
addCallback
{
onBackPressedDispatcher
.
addCallback
{
showExitFunctionDialog
{
showExitFunctionDialog
{
if
(
it
)
{
if
(
it
)
{
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
@FileScanResultActivity
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
@FileScanResultActivity
)
{
finishToMain
()
finishToMain
()
}
}
}
else
{
}
else
{
...
@@ -128,7 +136,6 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
...
@@ -128,7 +136,6 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
val
foundFlow
:
SharedFlow
<
Pair
<
Int
,
String
>>
=
mFoundFlow
val
foundFlow
:
SharedFlow
<
Pair
<
Int
,
String
>>
=
mFoundFlow
val
dialogClass
=
FileScanDialog
(
this
)
val
dialogClass
=
FileScanDialog
(
this
)
val
scanDialog
=
dialogClass
.
showFileScanDialog
(
pathFlow
,
foundFlow
)
{
val
scanDialog
=
dialogClass
.
showFileScanDialog
(
pathFlow
,
foundFlow
)
{
...
@@ -141,6 +148,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
...
@@ -141,6 +148,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
SCAN_PHOTOS
->
FileHexEx
::
isImage
SCAN_PHOTOS
->
FileHexEx
::
isImage
SCAN_DOCUMENTS
->
FileHexEx
::
isDocument
SCAN_DOCUMENTS
->
FileHexEx
::
isDocument
SCAN_VIDEOS
->
FileHexEx
::
isVideo
SCAN_VIDEOS
->
FileHexEx
::
isVideo
SCAN_AUDIOS
->
FileHexEx
::
isAudio
else
->
FileHexEx
::
isImage
else
->
FileHexEx
::
isImage
}
}
val
root
=
Environment
.
getExternalStorageDirectory
()
val
root
=
Environment
.
getExternalStorageDirectory
()
...
@@ -155,7 +163,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
...
@@ -155,7 +163,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
lifecycleScope
.
launch
(
Dispatchers
.
Main
)
{
lifecycleScope
.
launch
(
Dispatchers
.
Main
)
{
binding
.
ivWancheng
.
visibility
=
View
.
VISIBLE
binding
.
ivWancheng
.
visibility
=
View
.
VISIBLE
binding
.
tvScanning
.
text
=
"Completed"
binding
.
tvScanning
.
text
=
"Completed"
Admob
InterstitialUtils
.
showInterstitialAd
(
this
@FileScanResultActivity
,
isShowDialog
=
false
)
{}
Admob
MaxHelper
.
admobMaxShowInterstitialAd
(
this
@FileScanResultActivity
)
binding
.
flEmpty
.
isVisible
=
pathList
.
isEmpty
()
binding
.
flEmpty
.
isVisible
=
pathList
.
isEmpty
()
setAdapterData
(
null
)
setAdapterData
(
null
)
dialogClass
.
finishScan
{
dialogClass
.
finishScan
{
...
@@ -188,7 +196,10 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
...
@@ -188,7 +196,10 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
}
}
val
recoveryBean
=
RecoveryBean
(
path
)
val
recoveryBean
=
RecoveryBean
(
path
)
if
(
scanType
==
SCAN_DOCUMENTS
)
{
if
(
scanType
==
SCAN_DOCUMENTS
)
{
recoveryBean
.
setType
()
recoveryBean
.
setDocumentType
()
}
if
(
scanType
==
SCAN_AUDIOS
)
{
recoveryBean
.
setAudioType
()
}
}
hashMap
[
folder
]
?.
add
(
recoveryBean
)
hashMap
[
folder
]
?.
add
(
recoveryBean
)
return
isNewFolder
return
isNewFolder
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/repeat/RepeatActivity.kt
View file @
49a23028
...
@@ -6,6 +6,7 @@ import androidx.activity.addCallback
...
@@ -6,6 +6,7 @@ import androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.core.view.updatePadding
import
androidx.lifecycle.lifecycleScope
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.adapter.MediaAdapter
import
com.base.filerecoveryrecyclebin.adapter.MediaAdapter
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils.showInterAdSp
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils.showInterAdSp
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
...
@@ -74,14 +75,8 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
...
@@ -74,14 +75,8 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
onBackPressedDispatcher
.
addCallback
{
onBackPressedDispatcher
.
addCallback
{
showExitFunctionDialog
{
showExitFunctionDialog
{
if
(
it
)
{
if
(
it
)
{
if
(
ConfigHelper
.
admobTrueMaxFlase
)
{
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
@RepeatActivity
){
AdmobInterstitialUtils
.
showInterstitialAd
(
this
@RepeatActivity
)
{
finishToMain
()
finishToMain
()
}
}
else
{
AdMaxInterstitialUtils
.
showInterstitialAd
(
this
@RepeatActivity
)
{
finishToMain
()
}
}
}
}
else
{
}
else
{
finishToMain
()
finishToMain
()
...
@@ -99,7 +94,7 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
...
@@ -99,7 +94,7 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
binding
.
tvClean
.
setOnClickListener
{
binding
.
tvClean
.
setOnClickListener
{
showDeletePermanentlyDialog
{
showDeletePermanentlyDialog
{
if
(
showInterAdSp
())
{
if
(
showInterAdSp
())
{
Admob
InterstitialUtils
.
showInterstitialAd
(
this
)
{
Admob
MaxHelper
.
admobMaxShowInterstitialAd
(
this
)
{
cleanFile
()
cleanFile
()
}
}
}
else
{
}
else
{
...
@@ -141,7 +136,7 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
...
@@ -141,7 +136,7 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
binding
.
progressBar
.
visibility
=
View
.
GONE
binding
.
progressBar
.
visibility
=
View
.
GONE
mediaAdapter
.
setData
(
beanList
)
mediaAdapter
.
setData
(
beanList
)
if
(
beanList
.
sumOf
{
it
.
beans
.
size
}
>
6
||
ConfigHelper
.
mustShowNativeAd
)
{
if
(
beanList
.
sumOf
{
it
.
beans
.
size
}
>
6
||
ConfigHelper
.
mustShowNativeAd
)
{
Admob
NativeUtils
.
s
howNativeAd
(
this
@RepeatActivity
,
binding
.
flAd
)
Admob
MaxHelper
.
admobMaxS
howNativeAd
(
this
@RepeatActivity
,
binding
.
flAd
)
}
}
}
}
}
}
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/repeat/RepeatAnimationActivity.kt
View file @
49a23028
...
@@ -3,6 +3,7 @@ package com.base.filerecoveryrecyclebin.activity.repeat
...
@@ -3,6 +3,7 @@ package com.base.filerecoveryrecyclebin.activity.repeat
import
android.content.Intent
import
android.content.Intent
import
android.widget.Toast
import
android.widget.Toast
import
androidx.activity.addCallback
import
androidx.activity.addCallback
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.max.AdMaxInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.max.AdMaxInterstitialUtils
import
com.base.filerecoveryrecyclebin.databinding.ActivityRepeatAnimationBinding
import
com.base.filerecoveryrecyclebin.databinding.ActivityRepeatAnimationBinding
...
@@ -19,16 +20,9 @@ class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() {
...
@@ -19,16 +20,9 @@ class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() {
override
fun
initView
()
{
override
fun
initView
()
{
binding
.
root
.
postDelayed
({
binding
.
root
.
postDelayed
({
if
(
ConfigHelper
.
admobTrueMaxFlase
)
{
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
)
{
AdmobInterstitialUtils
.
showInterstitialAd
(
this
)
{
startActivity
(
Intent
(
this
,
RepeatActivity
::
class
.
java
))
startActivity
(
Intent
(
this
,
RepeatActivity
::
class
.
java
))
finish
()
finish
()
}
}
else
{
AdMaxInterstitialUtils
.
showInterstitialAd
(
this
)
{
startActivity
(
Intent
(
this
,
RepeatActivity
::
class
.
java
))
finish
()
}
}
}
},
Random
.
nextLong
(
3000
,
4500
))
},
Random
.
nextLong
(
3000
,
4500
))
}
}
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/screenshot/ScreenShotActivity.kt
View file @
49a23028
...
@@ -7,6 +7,7 @@ import androidx.activity.addCallback
...
@@ -7,6 +7,7 @@ import androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.core.view.updatePadding
import
androidx.lifecycle.lifecycleScope
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.adapter.ScreenShotAdapter
import
com.base.filerecoveryrecyclebin.adapter.ScreenShotAdapter
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils.showInterAdSp
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils.showInterAdSp
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
...
@@ -88,7 +89,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
...
@@ -88,7 +89,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
binding
.
tvSize
.
text
=
sizeF
[
0
]
binding
.
tvSize
.
text
=
sizeF
[
0
]
binding
.
tvUnit
.
text
=
sizeF
[
1
]
binding
.
tvUnit
.
text
=
sizeF
[
1
]
if
(
list
.
sumOf
{
it
.
screenPhotoBean
.
size
}
>
6
||
ConfigHelper
.
mustShowNativeAd
)
{
if
(
list
.
sumOf
{
it
.
screenPhotoBean
.
size
}
>
6
||
ConfigHelper
.
mustShowNativeAd
)
{
Admob
NativeUtils
.
s
howNativeAd
(
this
@ScreenShotActivity
,
binding
.
flAd
)
Admob
MaxHelper
.
admobMaxS
howNativeAd
(
this
@ScreenShotActivity
,
binding
.
flAd
)
}
}
}
}
}
}
...
@@ -101,7 +102,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
...
@@ -101,7 +102,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
onBackPressedDispatcher
.
addCallback
{
onBackPressedDispatcher
.
addCallback
{
showExitFunctionDialog
{
showExitFunctionDialog
{
if
(
it
)
{
if
(
it
)
{
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
@ScreenShotActivity
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
@ScreenShotActivity
)
{
finishToMain
()
finishToMain
()
}
}
}
else
{
}
else
{
...
@@ -122,7 +123,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
...
@@ -122,7 +123,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
showDeletePermanentlyDialog
{
showDeletePermanentlyDialog
{
if
(
showInterAdSp
())
{
if
(
showInterAdSp
())
{
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
)
{
cleanFile
()
cleanFile
()
}
}
}
else
{
}
else
{
...
@@ -133,6 +134,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
...
@@ -133,6 +134,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
}
}
}
}
@SuppressLint
(
"SetTextI18n"
)
private
fun
cleanFile
()
{
private
fun
cleanFile
()
{
val
files
=
screenShotAdapter
.
getSelectData
()
val
files
=
screenShotAdapter
.
getSelectData
()
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/screenshot/ScreenShotAnimationActivity.kt
View file @
49a23028
...
@@ -3,6 +3,7 @@ package com.base.filerecoveryrecyclebin.activity.screenshot
...
@@ -3,6 +3,7 @@ package com.base.filerecoveryrecyclebin.activity.screenshot
import
android.content.Intent
import
android.content.Intent
import
android.widget.Toast
import
android.widget.Toast
import
androidx.activity.addCallback
import
androidx.activity.addCallback
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.databinding.ActivityScreenShotAnimationBinding
import
com.base.filerecoveryrecyclebin.databinding.ActivityScreenShotAnimationBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.help.BaseActivity
...
@@ -16,7 +17,7 @@ class ScreenShotAnimationActivity : BaseActivity<ActivityScreenShotAnimationBind
...
@@ -16,7 +17,7 @@ class ScreenShotAnimationActivity : BaseActivity<ActivityScreenShotAnimationBind
override
fun
initView
()
{
override
fun
initView
()
{
binding
.
root
.
postDelayed
({
binding
.
root
.
postDelayed
({
Admob
InterstitialUtils
.
s
howInterstitialAd
(
this
)
{
Admob
MaxHelper
.
admobMaxS
howInterstitialAd
(
this
)
{
startActivity
(
Intent
(
this
,
ScreenShotActivity
::
class
.
java
))
startActivity
(
Intent
(
this
,
ScreenShotActivity
::
class
.
java
))
finish
()
finish
()
}
}
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/adapter/FileTimeColumnsAdapter.kt
View file @
49a23028
...
@@ -12,6 +12,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
...
@@ -12,6 +12,7 @@ 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.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_AUDIOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.FolderBean
import
com.base.filerecoveryrecyclebin.bean.FolderBean
import
com.base.filerecoveryrecyclebin.bean.RecoveryBean
import
com.base.filerecoveryrecyclebin.bean.RecoveryBean
...
@@ -55,7 +56,7 @@ class FileTimeColumnsAdapter(
...
@@ -55,7 +56,7 @@ class FileTimeColumnsAdapter(
val
subAdapter
=
MediaColumnsAdapter
()
val
subAdapter
=
MediaColumnsAdapter
()
if
(
scanType
==
SCAN_DOCUMENTS
)
{
if
(
scanType
==
SCAN_DOCUMENTS
||
scanType
==
SCAN_AUDIOS
)
{
binding
.
rvMediaColumns
.
layoutManager
=
LinearLayoutManager
(
context
)
binding
.
rvMediaColumns
.
layoutManager
=
LinearLayoutManager
(
context
)
}
else
{
}
else
{
binding
.
rvMediaColumns
.
layoutManager
=
GridLayoutManager
(
context
,
columns
)
binding
.
rvMediaColumns
.
layoutManager
=
GridLayoutManager
(
context
,
columns
)
...
@@ -132,6 +133,9 @@ class FileTimeColumnsAdapter(
...
@@ -132,6 +133,9 @@ class FileTimeColumnsAdapter(
"DOC"
->
R
.
mipmap
.
doc
"DOC"
->
R
.
mipmap
.
doc
"XLS"
->
R
.
mipmap
.
xls
"XLS"
->
R
.
mipmap
.
xls
"PPT"
->
R
.
mipmap
.
ppt
"PPT"
->
R
.
mipmap
.
ppt
"MP3"
->
R
.
mipmap
.
pdf
"WAV"
->
R
.
mipmap
.
pdf
"FLAC"
->
R
.
mipmap
.
pdf
else
->
0
else
->
0
}
}
binding
.
ivType
.
setImageResource
(
icon
)
binding
.
ivType
.
setImageResource
(
icon
)
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/adapter/RecycleBinAdapter.kt
View file @
49a23028
...
@@ -7,8 +7,13 @@ import androidx.recyclerview.widget.RecyclerView
...
@@ -7,8 +7,13 @@ import androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView.ViewHolder
import
androidx.recyclerview.widget.RecyclerView.ViewHolder
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import
com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import
com.base.filerecoveryrecyclebin.databinding.ItemMediaFileBinding
import
com.base.filerecoveryrecyclebin.databinding.ItemRecycleBinBeanBinding
import
com.base.filerecoveryrecyclebin.databinding.ItemRecycleBinBeanBinding
import
com.base.filerecoveryrecyclebin.databinding.ItemRecyclebinFileBinding
import
com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatTime
import
com.base.filerecoveryrecyclebin.view.XmlEx.inflate
import
com.base.filerecoveryrecyclebin.view.XmlEx.inflate
import
com.bumptech.glide.Glide
import
java.io.File
class
RecycleBinAdapter
:
RecyclerView
.
Adapter
<
RecycleBinAdapter
.
RBAV
>()
{
class
RecycleBinAdapter
:
RecyclerView
.
Adapter
<
RecycleBinAdapter
.
RBAV
>()
{
...
@@ -20,7 +25,7 @@ class RecycleBinAdapter : RecyclerView.Adapter<RecycleBinAdapter.RBAV>() {
...
@@ -20,7 +25,7 @@ class RecycleBinAdapter : RecyclerView.Adapter<RecycleBinAdapter.RBAV>() {
}
}
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
RBAV
{
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
RBAV
{
return
RBAV
(
R
.
layout
.
item_recycle
_bin_bean
.
inflate
(
parent
))
return
RBAV
(
R
.
layout
.
item_recycle
bin_file
.
inflate
(
parent
))
}
}
override
fun
getItemCount
():
Int
{
override
fun
getItemCount
():
Int
{
...
@@ -29,13 +34,14 @@ class RecycleBinAdapter : RecyclerView.Adapter<RecycleBinAdapter.RBAV>() {
...
@@ -29,13 +34,14 @@ class RecycleBinAdapter : RecyclerView.Adapter<RecycleBinAdapter.RBAV>() {
@SuppressLint
(
"SetTextI18n"
)
@SuppressLint
(
"SetTextI18n"
)
override
fun
onBindViewHolder
(
holder
:
RBAV
,
position
:
Int
)
{
override
fun
onBindViewHolder
(
holder
:
RBAV
,
position
:
Int
)
{
val
binding
=
ItemRecycle
BinBean
Binding
.
bind
(
holder
.
itemView
)
val
binding
=
ItemRecycle
binFile
Binding
.
bind
(
holder
.
itemView
)
val
bean
=
beanList
[
position
]
val
bean
=
beanList
[
position
]
binding
.
tvPath
.
text
=
bean
.
path
val
file
=
File
(
bean
.
path
)
binding
.
tvDeleted
.
text
=
"deleted=${bean.deleted}"
val
context
=
holder
.
itemView
.
context
binding
.
tvDeleteTime
.
text
=
"time="
+
bean
.
deleteTime
.
toString
()
Glide
.
with
(
context
).
load
(
bean
.
path
).
centerCrop
().
into
(
binding
.
iv
)
binding
.
tvSize
.
text
=
"size=${bean.size}"
binding
.
tvName
.
text
=
file
.
name
binding
.
tvMimetype
.
text
=
"mimetype=${bean.mimeType}"
binding
.
tvTime
.
text
=
"delete time:"
+
bean
.
deleteTime
.
toString
()
binding
.
tvSize
.
text
=
bean
.
size
.
toFormatTime
()
}
}
@SuppressLint
(
"NotifyDataSetChanged"
)
@SuppressLint
(
"NotifyDataSetChanged"
)
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/ads/max/AdMaxInit.kt
View file @
49a23028
...
@@ -4,12 +4,14 @@ import com.applovin.sdk.AppLovinMediationProvider
...
@@ -4,12 +4,14 @@ import com.applovin.sdk.AppLovinMediationProvider
import
com.applovin.sdk.AppLovinSdk
import
com.applovin.sdk.AppLovinSdk
import
com.applovin.sdk.AppLovinSdkInitializationConfiguration
import
com.applovin.sdk.AppLovinSdkInitializationConfiguration
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
com.google.android.gms.ads.identifier.AdvertisingIdClient
import
java.util.Collections
import
java.util.concurrent.Executors
import
java.util.concurrent.Executors
import
java.util.concurrent.atomic.AtomicBoolean
import
java.util.concurrent.atomic.AtomicBoolean
object
AdMaxInit
{
object
AdMaxInit
{
private
val
TAG
=
"
com.base.filerecoveryrecyclebin.ads.max.
AdMaxInit"
private
val
TAG
=
"AdMaxInit"
var
isAdMaxInit
=
AtomicBoolean
(
false
)
var
isAdMaxInit
=
AtomicBoolean
(
false
)
var
maxInitAction
:
(()
->
Unit
)?
=
null
var
maxInitAction
:
(()
->
Unit
)?
=
null
...
@@ -24,10 +26,10 @@ object AdMaxInit {
...
@@ -24,10 +26,10 @@ object AdMaxInit {
initConfigBuilder
.
mediationProvider
=
AppLovinMediationProvider
.
MAX
initConfigBuilder
.
mediationProvider
=
AppLovinMediationProvider
.
MAX
// Enable test mode by default for the current device. Cannot be run on the main thread.
// Enable test mode by default for the current device. Cannot be run on the main thread.
//
val currentGaid = AdvertisingIdClient.getAdvertisingIdInfo(this).id
val
currentGaid
=
AdvertisingIdClient
.
getAdvertisingIdInfo
(
this
).
id
//
if (currentGaid != null) {
if
(
currentGaid
!=
null
)
{
//
initConfigBuilder.testDeviceAdvertisingIds = Collections.singletonList(currentGaid)
initConfigBuilder
.
testDeviceAdvertisingIds
=
Collections
.
singletonList
(
currentGaid
)
//
}
}
// Initialize the AppLovin SDK
// Initialize the AppLovin SDK
val
sdk
=
AppLovinSdk
.
getInstance
(
this
)
val
sdk
=
AppLovinSdk
.
getInstance
(
this
)
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/bean/ConstObject.kt
View file @
49a23028
...
@@ -24,6 +24,7 @@ object ConstObject {
...
@@ -24,6 +24,7 @@ object ConstObject {
const
val
SCAN_PHOTOS
=
1
const
val
SCAN_PHOTOS
=
1
const
val
SCAN_DOCUMENTS
=
2
const
val
SCAN_DOCUMENTS
=
2
const
val
SCAN_VIDEOS
=
3
const
val
SCAN_VIDEOS
=
3
const
val
SCAN_AUDIOS
=
4
var
ifAgreePrivacy
=
false
var
ifAgreePrivacy
=
false
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/bean/RecoveryBean.kt
View file @
49a23028
...
@@ -2,9 +2,12 @@ package com.base.filerecoveryrecyclebin.bean
...
@@ -2,9 +2,12 @@ package com.base.filerecoveryrecyclebin.bean
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isDoc
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isDoc
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isDocx
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isDocx
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isFlac
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isMp3
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isPPT
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isPPT
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isPPTX
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isPPTX
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isPdf
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isPdf
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isWav
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isXls
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isXls
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isXlsx
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isXlsx
import
java.io.File
import
java.io.File
...
@@ -17,7 +20,7 @@ data class RecoveryBean(
...
@@ -17,7 +20,7 @@ data class RecoveryBean(
var
type
:
String
=
""
var
type
:
String
=
""
companion
object
{
companion
object
{
fun
RecoveryBean
.
setType
()
{
fun
RecoveryBean
.
set
Document
Type
()
{
val
file
=
File
(
path
)
val
file
=
File
(
path
)
if
(
isPdf
(
file
))
{
if
(
isPdf
(
file
))
{
type
=
"PDF"
type
=
"PDF"
...
@@ -32,5 +35,19 @@ data class RecoveryBean(
...
@@ -32,5 +35,19 @@ data class RecoveryBean(
type
=
"PPT"
type
=
"PPT"
}
}
}
}
fun
RecoveryBean
.
setAudioType
()
{
val
file
=
File
(
path
)
if
(
isMp3
(
file
))
{
type
=
"MP3"
}
if
(
isWav
(
file
))
{
type
=
"WAV"
}
if
(
isFlac
(
file
))
{
type
=
"FLAC"
}
}
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/fragment/HomeFragment.kt
View file @
49a23028
...
@@ -2,6 +2,7 @@ package com.base.filerecoveryrecyclebin.fragment
...
@@ -2,6 +2,7 @@ package com.base.filerecoveryrecyclebin.fragment
import
android.animation.AnimatorSet
import
android.animation.AnimatorSet
import
android.animation.ObjectAnimator
import
android.animation.ObjectAnimator
import
android.animation.ValueAnimator
import
android.annotation.SuppressLint
import
android.annotation.SuppressLint
import
android.content.Intent
import
android.content.Intent
import
android.view.View
import
android.view.View
...
@@ -16,24 +17,24 @@ import com.base.filerecoveryrecyclebin.activity.screenshot.ScreenShotAnimationAc
...
@@ -16,24 +17,24 @@ import com.base.filerecoveryrecyclebin.activity.screenshot.ScreenShotAnimationAc
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import
com.base.filerecoveryrecyclebin.ads.max.AdMaxNativeUtils
import
com.base.filerecoveryrecyclebin.ads.max.AdMaxNativeUtils
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_AUDIOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_VIDEOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_VIDEOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.privacyPinPassword
import
com.base.filerecoveryrecyclebin.bean.ConstObject.privacyPinPassword
import
com.base.filerecoveryrecyclebin.databinding.FragmentHome3Binding
import
com.base.filerecoveryrecyclebin.databinding.FragmentHomeBinding
import
com.base.filerecoveryrecyclebin.databinding.FragmentHomeBinding
import
com.base.filerecoveryrecyclebin.help.BaseFragment
import
com.base.filerecoveryrecyclebin.help.BaseFragment
import
com.base.filerecoveryrecyclebin.help.ConfigHelper
import
com.base.filerecoveryrecyclebin.help.ConfigHelper
class
HomeFragment
:
BaseFragment
<
FragmentHomeBinding
>()
{
class
HomeFragment
:
BaseFragment
<
FragmentHome
3
Binding
>()
{
override
val
binding
:
FragmentHomeBinding
by
lazy
{
override
val
binding
:
FragmentHome
3
Binding
by
lazy
{
FragmentHomeBinding
.
inflate
(
layoutInflater
)
FragmentHome
3
Binding
.
inflate
(
layoutInflater
)
}
}
private
lateinit
var
animatorSet
:
AnimatorSet
override
fun
setView
()
{
override
fun
setView
()
{
animatorSet
=
createHeartbeatAnimation
(
binding
.
flScan
)
binding
.
lottie
.
repeatCount
=
ValueAnimator
.
INFINITE
AdmobMaxHelper
.
admobMaxShowNativeAd
(
requireActivity
(),
binding
.
flAd
,
0
)
AdmobMaxHelper
.
admobMaxShowNativeAd
(
requireActivity
(),
binding
.
flAd
,
0
)
}
}
...
@@ -42,30 +43,27 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
...
@@ -42,30 +43,27 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
startActivity
(
Intent
(
requireContext
(),
ScanJunkActivity
::
class
.
java
))
startActivity
(
Intent
(
requireContext
(),
ScanJunkActivity
::
class
.
java
))
// sendNotification(requireContext(), ConstObject.ID_SCREENSHOT_CLEAN)
// sendNotification(requireContext(), ConstObject.ID_SCREENSHOT_CLEAN)
}
}
binding
.
flRyPhoto
.
setOnClickListener
{
binding
.
cardRyPhotos
.
setOnClickListener
{
startActivity
(
Intent
(
requireContext
(),
FileScanResultActivity
::
class
.
java
).
apply
{
startActivity
(
Intent
(
requireContext
(),
FileScanResultActivity
::
class
.
java
).
apply
{
putExtra
(
"ScanType"
,
SCAN_PHOTOS
)
putExtra
(
"ScanType"
,
SCAN_PHOTOS
)
})
})
}
}
binding
.
flRyVideo
.
setOnClickListener
{
binding
.
cardRyVideos
.
setOnClickListener
{
startActivity
(
Intent
(
requireContext
(),
FileScanResultActivity
::
class
.
java
).
apply
{
startActivity
(
Intent
(
requireContext
(),
FileScanResultActivity
::
class
.
java
).
apply
{
putExtra
(
"ScanType"
,
SCAN_VIDEOS
)
putExtra
(
"ScanType"
,
SCAN_VIDEOS
)
})
})
}
}
binding
.
cardRyDocument
.
setOnClickListener
{
binding
.
cardRyDocument
s
.
setOnClickListener
{
startActivity
(
Intent
(
requireContext
(),
FileScanResultActivity
::
class
.
java
).
apply
{
startActivity
(
Intent
(
requireContext
(),
FileScanResultActivity
::
class
.
java
).
apply
{
putExtra
(
"ScanType"
,
SCAN_DOCUMENTS
)
putExtra
(
"ScanType"
,
SCAN_DOCUMENTS
)
})
})
}
}
binding
.
cardPrivacySpace
.
setOnClickListener
{
binding
.
cardRyAudios
.
setOnClickListener
{
if
(
privacyPinPassword
.
isNotEmpty
())
{
startActivity
(
Intent
(
requireContext
(),
FileScanResultActivity
::
class
.
java
).
apply
{
startActivity
(
Intent
(
requireContext
(),
PrivacyPinOneActivity
::
class
.
java
))
putExtra
(
"ScanType"
,
SCAN_AUDIOS
)
}
else
{
})
startActivity
(
Intent
(
requireContext
(),
PrivacySpaceActivity
::
class
.
java
).
apply
{
})
}
}
}
binding
.
cardScreenshot
.
setOnClickListener
{
binding
.
cardScreenshot
.
setOnClickListener
{
startActivity
(
Intent
(
requireContext
(),
ScreenShotAnimationActivity
::
class
.
java
))
startActivity
(
Intent
(
requireContext
(),
ScreenShotAnimationActivity
::
class
.
java
))
}
}
...
@@ -77,40 +75,16 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
...
@@ -77,40 +75,16 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
}
}
}
}
@SuppressLint
(
"Recycle"
)
fun
createHeartbeatAnimation
(
view
:
View
):
AnimatorSet
{
// 创建放大动画
val
scaleUpAnimator
=
ObjectAnimator
.
ofFloat
(
view
,
"scaleX"
,
1f
,
1.1f
)
scaleUpAnimator
.
setDuration
(
500
)
scaleUpAnimator
.
interpolator
=
AccelerateDecelerateInterpolator
()
scaleUpAnimator
.
repeatCount
=
ObjectAnimator
.
INFINITE
scaleUpAnimator
.
repeatMode
=
ObjectAnimator
.
REVERSE
// 创建缩小动画
val
scaleDownAnimator
=
ObjectAnimator
.
ofFloat
(
view
,
"scaleY"
,
1.1f
,
1f
)
scaleDownAnimator
.
setDuration
(
500
)
scaleDownAnimator
.
interpolator
=
AccelerateDecelerateInterpolator
()
scaleDownAnimator
.
setStartDelay
(
500
)
// 延迟开始,以便与放大动画同步结束
scaleDownAnimator
.
repeatCount
=
ObjectAnimator
.
INFINITE
scaleDownAnimator
.
repeatMode
=
ObjectAnimator
.
REVERSE
// 组合放大和缩小动画
val
animatorSet
=
AnimatorSet
()
animatorSet
.
play
(
scaleUpAnimator
).
with
(
scaleDownAnimator
)
// 启动动画
animatorSet
.
start
()
return
animatorSet
}
override
fun
onPause
()
{
override
fun
onPause
()
{
super
.
onPause
()
super
.
onPause
()
animatorSet
.
pause
()
binding
.
lottie
.
cancelAnimation
()
}
}
override
fun
onResume
()
{
override
fun
onResume
()
{
super
.
onResume
()
super
.
onResume
()
animatorSet
.
resume
()
binding
.
lottie
.
playAnimation
()
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/fragment/RecycleBinFragment.kt
0 → 100644
View file @
49a23028
package
com.base.filerecoveryrecyclebin.fragment
import
android.content.Intent
import
android.os.Bundle
import
android.os.Handler
import
android.view.View
import
androidx.core.view.isVisible
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.activity.MainActivity
import
com.base.filerecoveryrecyclebin.adapter.RecycleBinAdapter
import
com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import
com.base.filerecoveryrecyclebin.databinding.FragmentRecycleBinBinding
import
com.base.filerecoveryrecyclebin.help.BaseFragment
import
com.base.filerecoveryrecyclebin.help.PermissionHelp.checkStorePermission
import
com.base.filerecoveryrecyclebin.help.PermissionHelp.requestStorePermission
import
com.base.filerecoveryrecyclebin.service.StayNotificationService
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
com.base.filerecoveryrecyclebin.view.DialogViews.showGerPermission
import
com.google.gson.Gson
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
java.io.File
class
RecycleBinFragment
:
BaseFragment
<
FragmentRecycleBinBinding
>()
{
private
val
TAG
=
"RecycleBinFragment"
private
lateinit
var
handler
:
Handler
private
lateinit
var
recycleBinAdapter
:
RecycleBinAdapter
override
val
binding
:
FragmentRecycleBinBinding
by
lazy
{
FragmentRecycleBinBinding
.
inflate
(
layoutInflater
)
}
override
fun
setView
()
{
handler
=
Handler
(
requireActivity
().
mainLooper
)
{
message
->
if
(
message
.
what
==
99
)
{
// LogEx.logDebug(TAG, "媒体库更新了")
}
if
(
message
.
what
==
100
)
{
// LogEx.logDebug(TAG, "回收站数据更新了")
}
true
}
StayNotificationService
.
mainHandler
=
handler
requireActivity
().
startService
(
Intent
(
requireActivity
(),
StayNotificationService
::
class
.
java
).
apply
{
this
.
action
=
StayNotificationService
.
MEDIA_OBSERVER_ACTION
})
requireActivity
().
startService
(
Intent
(
requireContext
(),
StayNotificationService
::
class
.
java
).
apply
{
this
.
action
=
StayNotificationService
.
FILE_OBSERVER_ACTION
putExtra
(
"isStart"
,
true
)
})
recycleBinAdapter
=
RecycleBinAdapter
()
binding
.
rv
.
adapter
=
recycleBinAdapter
val
launcher
=
(
requireActivity
()
as
MainActivity
).
launcher
if
(
requireActivity
().
checkStorePermission
())
{
initData
()
}
else
{
requireContext
().
showGerPermission
(
allow
=
{
requireContext
().
requestStorePermission
(
launcher
,
result
=
{
flag
->
if
(
flag
)
{
initData
()
}
})
})
}
}
private
fun
initData
()
{
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
file
=
requireActivity
().
filesDir
val
recycleBinDir
=
File
(
file
,
"RecycleBin"
)
if
(!
recycleBinDir
.
exists
())
{
recycleBinDir
.
mkdirs
()
}
val
binList
=
recycleBinDir
.
listFiles
()
?.
filter
{
it
.
name
.
contains
(
".bin"
)
}
val
beanList
=
arrayListOf
<
RecycleBinBean
>()
binList
?.
forEach
{
val
bean
=
Gson
().
fromJson
(
it
.
readText
(),
RecycleBinBean
::
class
.
java
)
beanList
.
add
(
bean
)
}
launch
(
Dispatchers
.
Main
)
{
binding
.
rv
.
isVisible
=
!
binList
.
isNullOrEmpty
()
binding
.
llEmpty
.
isVisible
=
binList
.
isNullOrEmpty
()
recycleBinAdapter
.
setData
(
beanList
)
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/utils/FileHexEx.kt
View file @
49a23028
...
@@ -105,7 +105,7 @@ object FileHexEx {
...
@@ -105,7 +105,7 @@ object FileHexEx {
val
aviHex
=
"524946461C1BA900415649204C495354"
val
aviHex
=
"524946461C1BA900415649204C495354"
val
hex
=
FileHelp
.
readFileRange
(
file
.
absolutePath
,
0
,
16
).
byteArrayToHexString
()
val
hex
=
FileHelp
.
readFileRange
(
file
.
absolutePath
,
0
,
16
).
byteArrayToHexString
()
val
flag
=
hex
==
aviHex
val
flag
=
hex
==
aviHex
LogEx
.
logDebug
(
TAG
,
"flag=$flag hex=${hex} ${file.absolutePath}"
)
//
LogEx.logDebug(TAG, "flag=$flag hex=${hex} ${file.absolutePath}")
return
flag
return
flag
}
}
...
@@ -126,5 +126,33 @@ object FileHexEx {
...
@@ -126,5 +126,33 @@ object FileHexEx {
}
}
fun
isAudio
(
file
:
File
):
Boolean
{
return
isMp3
(
file
)
||
isFlac
(
file
)
||
isWav
(
file
)
}
fun
isMp3
(
file
:
File
):
Boolean
{
val
mp3Hex1
=
"49443303"
val
hex1
=
FileHelp
.
readFileRange
(
file
.
absolutePath
,
0
,
4
).
byteArrayToHexString
()
val
flag1
=
hex1
==
mp3Hex1
LogEx
.
logDebug
(
TAG
,
"flag1=$flag1 hex1=${hex1} ${file.absolutePath}"
)
return
flag1
}
fun
isFlac
(
file
:
File
):
Boolean
{
val
flacHex
=
"664C6143"
val
hex1
=
FileHelp
.
readFileRange
(
file
.
absolutePath
,
0
,
4
).
byteArrayToHexString
()
val
flag1
=
hex1
==
flacHex
LogEx
.
logDebug
(
TAG
,
"flag1=$flag1 hex1=${hex1} ${file.absolutePath}"
)
return
flag1
}
fun
isWav
(
file
:
File
):
Boolean
{
val
wavHex
=
"5249464668E7820957415645666D74"
val
hex1
=
FileHelp
.
readFileRange
(
file
.
absolutePath
,
0
,
15
).
byteArrayToHexString
()
val
flag1
=
hex1
==
wavHex
LogEx
.
logDebug
(
TAG
,
"flag1=$flag1 hex1=${hex1} ${file.absolutePath}"
)
return
flag1
}
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/utils/LogEx.kt
View file @
49a23028
...
@@ -7,7 +7,7 @@ object LogEx {
...
@@ -7,7 +7,7 @@ object LogEx {
val
isOpen
=
true
val
isOpen
=
true
val
filterTAG
=
arrayOf
(
val
filterTAG
=
arrayOf
(
"FileScanActivity"
,
"FileScanActivity"
,
"FileHexEx"
,
//
"FileHexEx",
"FileGridAdapter"
"FileGridAdapter"
)
)
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/view/FileScanDialog.kt
View file @
49a23028
...
@@ -9,6 +9,7 @@ import android.view.animation.LinearInterpolator
...
@@ -9,6 +9,7 @@ import android.view.animation.LinearInterpolator
import
androidx.appcompat.app.AppCompatActivity
import
androidx.appcompat.app.AppCompatActivity
import
androidx.lifecycle.lifecycleScope
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import
com.base.filerecoveryrecyclebin.databinding.DialogFileScanBinding
import
com.base.filerecoveryrecyclebin.databinding.DialogFileScanBinding
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
...
@@ -55,7 +56,7 @@ class FileScanDialog(
...
@@ -55,7 +56,7 @@ class FileScanDialog(
a1
.
cancel
()
a1
.
cancel
()
}
}
Admob
NativeUtils
.
showNativeAd
(
activity
,
binding
.
flAd
,
R
.
layout
.
layout_native_custom_big
)
Admob
MaxHelper
.
admobMaxShowNativeAd
(
activity
,
binding
.
flAd
,
1
)
var
pathShowed
=
false
var
pathShowed
=
false
activity
.
lifecycleScope
.
launch
(
Dispatchers
.
Main
)
{
activity
.
lifecycleScope
.
launch
(
Dispatchers
.
Main
)
{
...
...
app/src/main/res/layout/fragment_home_3.xml
0 → 100644
View file @
49a23028
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#F2F4F8"
android:orientation=
"vertical"
tools:context=
".fragment.HomeFragment"
>
<View
android:layout_width=
"match_parent"
android:layout_height=
"40dp"
app:layout_constraintTop_toTopOf=
"parent"
/>
<androidx.core.widget.NestedScrollView
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical|start"
android:layout_marginStart=
"16dp"
android:text=
"@string/app_name"
android:textSize=
"19sp"
android:textStyle=
"bold"
/>
<FrameLayout
android:id=
"@+id/fl_setting"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical|end"
android:padding=
"10dp"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginEnd=
"6dp"
android:src=
"@mipmap/shezhi"
tools:ignore=
"ContentDescription"
/>
</FrameLayout>
</FrameLayout>
<FrameLayout
android:id=
"@+id/fl_scan"
android:layout_width=
"220dp"
android:layout_height=
"220dp"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"20dp"
>
<com.base.filerecoveryrecyclebin.view.XmlLottieAnimationView
android:id=
"@+id/lottie"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
app:lottie_autoPlay=
"true"
app:lottie_rawRes=
"@raw/memosj"
/>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:orientation=
"vertical"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:text=
"Scan"
android:textColor=
"@color/white"
android:textSize=
"20sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"10dp"
android:text=
"Click to view"
android:textColor=
"@color/white"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
</FrameLayout>
<TextView
android:id=
"@+id/tv_junl_tip"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"25dp"
android:textColor=
"@color/black"
android:textSize=
"16sp"
android:textStyle=
"bold"
android:visibility=
"gone"
tools:text=
"Scanned junk files 29.69MB"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"15dp"
android:layout_marginTop=
"16dp"
android:text=
"File"
android:textColor=
"@color/black"
android:textSize=
"19sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"8dp"
android:layout_marginTop=
"8dp"
android:orientation=
"horizontal"
tools:ignore=
"DisableBaselineAlignment"
>
<androidx.cardview.widget.CardView
android:id=
"@+id/card_screenshot"
android:layout_width=
"0dp"
android:layout_height=
"80dp"
android:layout_margin=
"8dp"
android:layout_weight=
"1"
android:background=
"@mipmap/photo"
app:cardBackgroundColor=
"@color/white"
app:cardCornerRadius=
"10dp"
app:cardElevation=
"0dp"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"12dp"
android:text=
"Screenshot\nCleaner"
android:textColor=
"@color/black"
android:textSize=
"16sp"
tools:ignore=
"HardcodedText"
/>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical|end"
android:layout_marginEnd=
"8dp"
android:src=
"@mipmap/h_screenshot"
tools:ignore=
"ContentDescription"
/>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id=
"@+id/card_repeat_photos"
android:layout_width=
"0dp"
android:layout_height=
"80dp"
android:layout_margin=
"8dp"
android:layout_weight=
"1"
android:background=
"@mipmap/videos"
app:cardBackgroundColor=
"@color/white"
app:cardCornerRadius=
"10dp"
app:cardElevation=
"0dp"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"12dp"
android:text=
"Duplicate\nPhotos"
android:textColor=
"@color/black"
android:textSize=
"16sp"
tools:ignore=
"HardcodedText"
/>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical|end"
android:layout_marginEnd=
"8dp"
android:src=
"@mipmap/h_similar"
/>
</androidx.cardview.widget.CardView>
</LinearLayout>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"15dp"
android:layout_marginTop=
"16dp"
android:text=
"Recovery"
android:textColor=
"@color/black"
android:textSize=
"19sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<TextView
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"15dp"
android:layout_marginTop=
"12dp"
android:text=
"Recover lost data from unrooted Android devices"
android:textColor=
"#181D2C"
android:textSize=
"15sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"8dp"
android:layout_marginTop=
"16dp"
android:orientation=
"horizontal"
>
<androidx.cardview.widget.CardView
android:id=
"@+id/card_ry_photos"
android:layout_width=
"0dp"
android:layout_height=
"105dp"
android:layout_marginHorizontal=
"8dp"
android:layout_weight=
"1"
app:cardBackgroundColor=
"@color/white"
app:cardCornerRadius=
"10dp"
app:cardElevation=
"0dp"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"8dp"
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Photos"
android:textColor=
"@color/black"
android:textSize=
"15sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginTop=
"15dp"
android:text=
"Recover lost\nphotos"
android:textColor=
"#999999"
android:textSize=
"14sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"end"
android:layout_margin=
"8dp"
android:src=
"@mipmap/h_photos"
tools:ignore=
"ContentDescription"
/>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id=
"@+id/card_ry_videos"
android:layout_width=
"0dp"
android:layout_height=
"105dp"
android:layout_marginHorizontal=
"8dp"
android:layout_weight=
"1"
app:cardBackgroundColor=
"@color/white"
app:cardCornerRadius=
"10dp"
app:cardElevation=
"0dp"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"8dp"
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Videos"
android:textColor=
"@color/black"
android:textSize=
"15sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginTop=
"15dp"
android:text=
"Recover lost\nVideos"
android:textColor=
"#999999"
android:textSize=
"14sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"end"
android:layout_margin=
"8dp"
android:src=
"@mipmap/h_videos"
tools:ignore=
"ContentDescription"
/>
</androidx.cardview.widget.CardView>
</LinearLayout>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"8dp"
android:layout_marginTop=
"12dp"
android:orientation=
"horizontal"
>
<androidx.cardview.widget.CardView
android:id=
"@+id/card_ry_audios"
android:layout_width=
"0dp"
android:layout_height=
"105dp"
android:layout_marginHorizontal=
"8dp"
android:layout_weight=
"1"
app:cardBackgroundColor=
"@color/white"
app:cardCornerRadius=
"10dp"
app:cardElevation=
"0dp"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"8dp"
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Audios"
android:textColor=
"@color/black"
android:textSize=
"15sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginTop=
"15dp"
android:text=
"Recover lost\nAudios"
android:textColor=
"#999999"
android:textSize=
"14sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"end"
android:layout_margin=
"8dp"
android:src=
"@mipmap/h_videos"
tools:ignore=
"ContentDescription"
/>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id=
"@+id/card_ry_documents"
android:layout_width=
"0dp"
android:layout_height=
"105dp"
android:layout_marginHorizontal=
"8dp"
android:layout_weight=
"1"
app:cardBackgroundColor=
"@color/white"
app:cardCornerRadius=
"10dp"
app:cardElevation=
"0dp"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"8dp"
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Documents"
android:textColor=
"@color/black"
android:textSize=
"15sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginTop=
"15dp"
android:text=
"Recover lost\nDocuments"
android:textColor=
"#999999"
android:textSize=
"14sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"end"
android:layout_margin=
"8dp"
android:src=
"@mipmap/h_videos"
tools:ignore=
"ContentDescription"
/>
</androidx.cardview.widget.CardView>
</LinearLayout>
<FrameLayout
android:id=
"@+id/fl_ad"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"8dp"
/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_recycle_bin.xml
0 → 100644
View file @
49a23028
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:context=
".fragment.RecycleBinFragment"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:listitem=
"@layout/item_media_file"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/ll_empty"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:orientation=
"vertical"
android:visibility=
"gone"
tools:ignore=
"UseCompoundDrawables,UselessParent"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:src=
"@mipmap/r_queshengtu"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"30dp"
android:gravity=
"center"
android:text=
"Mobispeedy is protecting your photos, videos, files & App files from being deleted"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
app/src/main/res/layout/item_media_file.xml
View file @
49a23028
...
@@ -39,6 +39,7 @@
...
@@ -39,6 +39,7 @@
android:id=
"@+id/tv_name"
android:id=
"@+id/tv_name"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:ellipsize=
"middle"
android:singleLine=
"true"
android:singleLine=
"true"
android:textColor=
"#333333"
android:textColor=
"#333333"
android:textSize=
"15sp"
android:textSize=
"15sp"
...
...
app/src/main/res/layout/item_recyclebin_file.xml
0 → 100644
View file @
49a23028
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"20dp"
android:layout_marginVertical=
"6dp"
>
<androidx.cardview.widget.CardView
android:id=
"@+id/card"
android:layout_width=
"50dp"
android:layout_height=
"50dp"
app:cardCornerRadius=
"8dp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<ImageView
android:id=
"@+id/iv"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:ignore=
"ContentDescription"
/>
</androidx.cardview.widget.CardView>
<LinearLayout
android:id=
"@+id/ll"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"12dp"
android:orientation=
"vertical"
app:layout_constraintBottom_toBottomOf=
"@id/card"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toEndOf=
"@id/card"
app:layout_constraintTop_toTopOf=
"@id/card"
>
<TextView
android:id=
"@+id/tv_name"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:ellipsize=
"middle"
android:singleLine=
"true"
android:textColor=
"#333333"
android:textSize=
"15sp"
tools:text=
"VID_20240210_200748.mp3"
/>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"8dp"
>
<TextView
android:id=
"@+id/tv_time"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:textColor=
"#999999"
android:textSize=
"14sp"
tools:text=
"2024/07/16"
/>
<TextView
android:id=
"@+id/tv_size"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical|end"
android:textColor=
"#999999"
android:textSize=
"14sp"
tools:text=
"8.7 MB"
/>
</FrameLayout>
</LinearLayout>
<View
android:layout_width=
"match_parent"
android:layout_height=
"1dp"
android:layout_marginTop=
"12dp"
android:layout_marginEnd=
"10dp"
android:background=
"#F4F4F4"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/ll"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/mipmap-xxhdpi/h_duplicate.png
0 → 100644
View file @
49a23028
10.5 KB
app/src/main/res/mipmap-xxhdpi/h_photos.png
0 → 100644
View file @
49a23028
8.22 KB
app/src/main/res/mipmap-xxhdpi/h_screenshot.png
View replaced file @
b75e9002
View file @
49a23028
4.52 KB
|
W:
|
H:
8.41 KB
|
W:
|
H:
2-up
Swipe
Onion skin
app/src/main/res/mipmap-xxhdpi/h_videos.png
0 → 100644
View file @
49a23028
8.23 KB
app/src/main/res/mipmap-xxhdpi/r_queshengtu.png
0 → 100644
View file @
49a23028
130 KB
app/src/main/res/raw/memosj.json
0 → 100644
View file @
49a23028
This source diff could not be displayed because it is too large. You can
view the blob
instead.
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