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
7304dac9
Commit
7304dac9
authored
Jul 08, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...ui
parent
b8601506
Hide whitespace changes
Inline
Side-by-side
Showing
64 changed files
with
2923 additions
and
119 deletions
+2923
-119
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+46
-12
FileScanActivity.kt
...n/java/com/base/datarecovery/activity/FileScanActivity.kt
+1
-1
PinActivity.kt
...c/main/java/com/base/datarecovery/activity/PinActivity.kt
+0
-22
ScreenShotActivity.kt
...java/com/base/datarecovery/activity/ScreenShotActivity.kt
+148
-0
SplashActivity.kt
...ain/java/com/base/datarecovery/activity/SplashActivity.kt
+2
-8
PrivacyImportActivity.kt
...tarecovery/activity/privacyspace/PrivacyImportActivity.kt
+3
-5
PrivacyPinOneActivity.kt
...tarecovery/activity/privacyspace/PrivacyPinOneActivity.kt
+200
-0
PrivacyPinTwoActivity.kt
...tarecovery/activity/privacyspace/PrivacyPinTwoActivity.kt
+200
-0
PrivacySpaceActivity.kt
...atarecovery/activity/privacyspace/PrivacySpaceActivity.kt
+18
-9
WhatsAppCleanerActivity.kt
...datarecovery/activity/whatsapp/WhatsAppCleanerActivity.kt
+137
-0
WhatsAppMessageCleanActivity.kt
...ecovery/activity/whatsapp/WhatsAppMessageCleanActivity.kt
+96
-0
ScreenShotAdapter.kt
...n/java/com/base/datarecovery/adapter/ScreenShotAdapter.kt
+119
-0
WhatsAppCleanerAdapter.kt
...a/com/base/datarecovery/adapter/WhatsAppCleanerAdapter.kt
+82
-0
WhatsAppMediaAdapter.kt
...ava/com/base/datarecovery/adapter/WhatsAppMediaAdapter.kt
+108
-0
AdmobInterstitialUtils.kt
.../java/com/base/datarecovery/ads/AdmobInterstitialUtils.kt
+208
-0
ConstObject.kt
app/src/main/java/com/base/datarecovery/bean/ConstObject.kt
+11
-0
MediaBean.kt
app/src/main/java/com/base/datarecovery/bean/MediaBean.kt
+1
-1
ScreenshotBean.kt
...rc/main/java/com/base/datarecovery/bean/ScreenshotBean.kt
+14
-0
WhatsAppCleanerBean.kt
...in/java/com/base/datarecovery/bean/WhatsAppCleanerBean.kt
+10
-0
HomeFragment.kt
.../main/java/com/base/datarecovery/fragment/HomeFragment.kt
+15
-3
PrivacyFileImportFragment.kt
...m/base/datarecovery/fragment/PrivacyFileImportFragment.kt
+1
-1
PrivacyPageFragment.kt
...ava/com/base/datarecovery/fragment/PrivacyPageFragment.kt
+24
-4
BaseActivity.kt
app/src/main/java/com/base/datarecovery/help/BaseActivity.kt
+1
-1
FileHelp.kt
app/src/main/java/com/base/datarecovery/help/FileHelp.kt
+30
-0
KotlinExt.kt
app/src/main/java/com/base/datarecovery/help/KotlinExt.kt
+9
-0
LogEx.kt
app/src/main/java/com/base/datarecovery/utils/LogEx.kt
+2
-1
AsteriskPasswordTransformationMethod.java
...tarecovery/view/AsteriskPasswordTransformationMethod.java
+36
-0
CustomDialog.kt
app/src/main/java/com/base/datarecovery/view/CustomDialog.kt
+37
-0
DialogViews.kt
app/src/main/java/com/base/datarecovery/view/DialogViews.kt
+6
-1
bg_355bea_10.xml
app/src/main/res/drawable/bg_355bea_10.xml
+5
-0
bg_bebebe_10.xml
app/src/main/res/drawable/bg_bebebe_10.xml
+6
-0
bg_border_pin.xml
app/src/main/res/drawable/bg_border_pin.xml
+5
-0
bg_border_pin_warm.xml
app/src/main/res/drawable/bg_border_pin_warm.xml
+7
-0
bg_button_enable_selector.xml
app/src/main/res/drawable/bg_button_enable_selector.xml
+5
-0
bg_pin_enable.xml
app/src/main/res/drawable/bg_pin_enable.xml
+7
-0
bg_pin_normal.xml
app/src/main/res/drawable/bg_pin_normal.xml
+8
-0
circle_progress_bar.xml
app/src/main/res/drawable/circle_progress_bar.xml
+27
-0
shape_splash_s.xml
app/src/main/res/drawable/shape_splash_s.xml
+13
-13
activity_privacy_import.xml
app/src/main/res/layout/activity_privacy_import.xml
+1
-1
activity_privacy_pin_one.xml
app/src/main/res/layout/activity_privacy_pin_one.xml
+164
-0
activity_privacy_pin_two.xml
app/src/main/res/layout/activity_privacy_pin_two.xml
+206
-0
activity_privacy_space.xml
app/src/main/res/layout/activity_privacy_space.xml
+47
-34
activity_screen_shot.xml
app/src/main/res/layout/activity_screen_shot.xml
+177
-0
activity_splash.xml
app/src/main/res/layout/activity_splash.xml
+1
-1
activity_whats_app_cleaner.xml
app/src/main/res/layout/activity_whats_app_cleaner.xml
+142
-0
activity_whats_app_message_clean.xml
app/src/main/res/layout/activity_whats_app_message_clean.xml
+169
-0
dialog_ad_loading.xml
app/src/main/res/layout/dialog_ad_loading.xml
+38
-0
dialog_pin_re_enter.xml
app/src/main/res/layout/dialog_pin_re_enter.xml
+22
-0
fragment_home.xml
app/src/main/res/layout/fragment_home.xml
+5
-0
item_media_file.xml
app/src/main/res/layout/item_media_file.xml
+87
-0
item_media_select.xml
app/src/main/res/layout/item_media_select.xml
+26
-0
item_screen_photo.xml
app/src/main/res/layout/item_screen_photo.xml
+28
-0
item_screenshot.xml
app/src/main/res/layout/item_screenshot.xml
+44
-0
item_whatsapp.xml
app/src/main/res/layout/item_whatsapp.xml
+115
-0
imagemessages.png
app/src/main/res/mipmap-hdpi/imagemessages.png
+0
-0
jianotu_whatsapp.png
app/src/main/res/mipmap-hdpi/jianotu_whatsapp.png
+0
-0
jianotul_whatsapp.png
app/src/main/res/mipmap-hdpi/jianotul_whatsapp.png
+0
-0
audiomessages.png
app/src/main/res/mipmap-xxhdpi/audiomessages.png
+0
-0
logo.png
app/src/main/res/mipmap-xxhdpi/logo.png
+0
-0
qdylogo.png
app/src/main/res/mipmap-xxhdpi/qdylogo.png
+0
-0
shezhimimaicon.png
app/src/main/res/mipmap-xxhdpi/shezhimimaicon.png
+0
-0
videomessages.png
app/src/main/res/mipmap-xxhdpi/videomessages.png
+0
-0
colors.xml
app/src/main/res/values/colors.xml
+2
-0
strings.xml
app/src/main/res/values/strings.xml
+1
-1
No files found.
app/src/main/AndroidManifest.xml
View file @
7304dac9
...
@@ -12,21 +12,13 @@
...
@@ -12,21 +12,13 @@
android:allowBackup=
"true"
android:allowBackup=
"true"
android:dataExtractionRules=
"@xml/data_extraction_rules"
android:dataExtractionRules=
"@xml/data_extraction_rules"
android:fullBackupContent=
"@xml/backup_rules"
android:fullBackupContent=
"@xml/backup_rules"
android:icon=
"@mipmap/
ic_launcher
"
android:icon=
"@mipmap/
logo
"
android:label=
"@string/app_name"
android:label=
"@string/app_name"
android:roundIcon=
"@mipmap/
ic_launcher_round
"
android:roundIcon=
"@mipmap/
logo
"
android:supportsRtl=
"true"
android:supportsRtl=
"true"
android:theme=
"@style/Theme.DataRecovery"
android:theme=
"@style/Theme.DataRecovery"
tools:targetApi=
"31"
>
tools:targetApi=
"34"
>
<activity
android:name=
".activity.PrivacyImportActivity"
android:exported=
"false"
/>
<activity
android:name=
".activity.PinActivity"
android:exported=
"false"
/>
<activity
android:name=
".activity.PrivacySpaceActivity"
android:exported=
"false"
/>
<activity
<activity
android:name=
".activity.SplashActivity"
android:name=
".activity.SplashActivity"
android:exported=
"true"
>
android:exported=
"true"
>
...
@@ -36,12 +28,54 @@
...
@@ -36,12 +28,54 @@
<category
android:name=
"android.intent.category.LAUNCHER"
/>
<category
android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</intent-filter>
</activity>
</activity>
<activity
android:name=
".activity.ScreenShotActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.whatsapp.WhatsAppCleanerActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.whatsapp.WhatsAppMessageCleanActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
<activity
android:name=
".activity.MainActivity"
android:name=
".activity.MainActivity"
android:exported=
"false"
android:exported=
"false"
android:launchMode=
"singleTop"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.privacyspace.PrivacyPinTwoActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.privacyspace.PrivacyPinOneActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.privacyspace.PrivacyImportActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.privacyspace.PrivacySpaceActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
<activity
android:name=
".activity.FileRecoveredActivity"
android:name=
".activity.FileRecoveredActivity"
android:exported=
"false"
android:exported=
"false"
...
...
app/src/main/java/com/base/datarecovery/activity/FileScanActivity.kt
View file @
7304dac9
...
@@ -122,7 +122,7 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() {
...
@@ -122,7 +122,7 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() {
private
fun
requestPermission
()
{
private
fun
requestPermission
()
{
showGerPermission
(
null
,
deny
=
{
finishToMain
()
},
allow
=
{
showGerPermission
(
null
,
deny
=
{
},
allow
=
{
requestStorePermission
(
launcher
,
jumpAction
=
{},
result
=
{
flag
->
requestStorePermission
(
launcher
,
jumpAction
=
{},
result
=
{
flag
->
if
(
flag
)
beginScan
()
if
(
flag
)
beginScan
()
...
...
app/src/main/java/com/base/datarecovery/activity/PinActivity.kt
deleted
100644 → 0
View file @
b8601506
package
com.base.datarecovery.activity
import
android.os.Bundle
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.databinding.ActivityPinBinding
import
com.base.datarecovery.help.BaseActivity
class
PinActivity
:
BaseActivity
<
ActivityPinBinding
>()
{
override
val
binding
:
ActivityPinBinding
by
lazy
{
ActivityPinBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/activity/ScreenShotActivity.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.activity
import
android.annotation.SuppressLint
import
android.graphics.Color
import
android.os.Environment
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.adapter.ScreenShotAdapter
import
com.base.datarecovery.ads.AdmobInterstitialUtils
import
com.base.datarecovery.bean.ScreenPhotoBean
import
com.base.datarecovery.bean.ScreenshotBean
import
com.base.datarecovery.databinding.ActivityScreenShotBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.FileHelp
import
com.base.datarecovery.help.KotlinExt.toFormatSize
import
com.base.datarecovery.help.PermissionHelp.checkStorePermission
import
com.base.datarecovery.help.PermissionHelp.requestStorePermission
import
com.base.datarecovery.utils.BarUtils
import
com.base.datarecovery.view.DialogViews.showGerPermission
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.async
import
kotlinx.coroutines.launch
import
java.io.File
import
java.text.SimpleDateFormat
import
java.util.Locale
import
kotlin.collections.HashSet
class
ScreenShotActivity
:
BaseActivity
<
ActivityScreenShotBinding
>()
{
private
lateinit
var
screenShotAdapter
:
ScreenShotAdapter
override
val
binding
:
ActivityScreenShotBinding
by
lazy
{
ActivityScreenShotBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
binding
.
root
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
screenShotAdapter
=
ScreenShotAdapter
{
size
->
setCleanUpUi
(
size
)
}
binding
.
rv
.
adapter
=
screenShotAdapter
if
(
checkStorePermission
())
{
initData
()
}
else
{
dialog
=
showGerPermission
(
null
,
deny
=
{},
allow
=
{
requestStorePermission
(
launcher
,
result
=
{
flag
->
if
(
flag
)
initData
()
else
finishToMain
()
})
})
}
}
@SuppressLint
(
"SetTextI18n"
)
private
fun
setCleanUpUi
(
size
:
Int
)
{
if
(
size
>
0
)
{
binding
.
tvClean
.
isEnabled
=
true
binding
.
tvClean
.
text
=
"CLEAN(${size})"
}
else
{
binding
.
tvClean
.
isEnabled
=
false
binding
.
tvClean
.
text
=
"CLEAN"
}
binding
.
llSelectAll
.
isSelected
=
screenShotAdapter
.
isAllSelect
()
}
private
fun
initData
()
=
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
list
=
getScreenshotBean
()
launch
(
Dispatchers
.
Main
)
{
screenShotAdapter
.
setData
(
list
)
val
size
=
list
.
sumOf
{
it
.
screenPhotoBean
.
sumOf
{
ss
->
ss
.
file
.
length
()
}
}
val
sizeF
=
size
.
toFormatSize
().
split
(
" "
)
binding
.
tvSize
.
text
=
sizeF
[
0
]
binding
.
tvUnit
.
text
=
sizeF
[
1
]
}
}
override
fun
initListener
()
{
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
onBackPressedDispatcher
.
addCallback
{
AdmobInterstitialUtils
.
showInterstitialAd
(
this
@ScreenShotActivity
)
{
finishToMain
()
}
}
binding
.
llSelectAll
.
setOnClickListener
{
binding
.
llSelectAll
.
isSelected
=
!
binding
.
llSelectAll
.
isSelected
screenShotAdapter
.
toggleSelect
(
binding
.
llSelectAll
.
isSelected
)
val
size
=
screenShotAdapter
.
getSelectDataSize
()
setCleanUpUi
(
size
)
}
binding
.
tvClean
.
setOnClickListener
{
val
files
=
screenShotAdapter
.
getSelectData
()
AdmobInterstitialUtils
.
showInterstitialAd
(
this
)
{
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
async
{
files
.
forEach
{
screenFile
->
runCatching
{
val
file
=
screenFile
.
file
if
(
file
.
exists
())
file
.
delete
()
}
}
}.
await
()
launch
(
Dispatchers
.
Main
)
{
screenShotAdapter
.
removeData
(
files
)
}
}
}
}
}
private
fun
getScreenshotBean
():
ArrayList
<
ScreenshotBean
>
{
val
dcim
=
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_DCIM
)
val
screenFiles
=
FileHelp
.
getDirFiles
(
dcim
)
val
hash
=
HashMap
<
String
,
HashSet
<
File
>>()
val
formatter
=
SimpleDateFormat
(
"yyyy/MM"
,
Locale
.
getDefault
())
screenFiles
.
forEach
{
file
->
val
time
=
formatter
.
format
(
file
.
lastModified
())
if
(
hash
[
time
]
==
null
)
{
hash
[
time
]
=
HashSet
()
}
val
set
=
hash
[
time
]
set
?.
add
(
file
)
}
val
beans
=
arrayListOf
<
ScreenshotBean
>()
hash
.
forEach
{
(
t
,
u
)
->
val
arrayList
=
arrayListOf
<
ScreenPhotoBean
>()
val
mapList
=
u
.
map
{
file
->
ScreenPhotoBean
(
file
)
}
arrayList
.
addAll
(
mapList
)
beans
.
add
(
ScreenshotBean
(
t
,
arrayList
))
}
return
beans
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/activity/SplashActivity.kt
View file @
7304dac9
...
@@ -11,6 +11,7 @@ import android.view.View
...
@@ -11,6 +11,7 @@ import android.view.View
import
androidx.lifecycle.lifecycleScope
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.ads.AdmobNativeUtils
import
com.base.datarecovery.ads.AdmobNativeUtils
import
com.base.datarecovery.ads.AdmobOpenUtils
import
com.base.datarecovery.ads.AdmobOpenUtils
import
com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
import
com.base.datarecovery.databinding.ActivitySplashBinding
import
com.base.datarecovery.databinding.ActivitySplashBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.ConfigHelper
import
com.base.datarecovery.help.ConfigHelper
...
@@ -34,14 +35,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
...
@@ -34,14 +35,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
private
val
progress
=
MutableSharedFlow
<
Int
>()
private
val
progress
=
MutableSharedFlow
<
Int
>()
private
val
progressFlow
:
SharedFlow
<
Int
>
=
progress
private
val
progressFlow
:
SharedFlow
<
Int
>
=
progress
private
var
oneClickStart
:
Boolean
=
false
private
var
oneClickStart
:
Boolean
=
false
var
ifAgreePrivacy
=
false
get
()
{
return
SPUtils
.
getInstance
().
getBoolean
(
"ifAgreePrivacy"
,
field
)
}
set
(
value
)
{
field
=
value
SPUtils
.
getInstance
().
put
(
"ifAgreePrivacy"
,
value
,
true
)
}
override
val
binding
:
ActivitySplashBinding
by
lazy
{
override
val
binding
:
ActivitySplashBinding
by
lazy
{
ActivitySplashBinding
.
inflate
(
layoutInflater
)
ActivitySplashBinding
.
inflate
(
layoutInflater
)
...
...
app/src/main/java/com/base/datarecovery/activity/PrivacyImportActivity.kt
→
app/src/main/java/com/base/datarecovery/activity/
privacyspace/
PrivacyImportActivity.kt
View file @
7304dac9
package
com.base.datarecovery.activity
package
com.base.datarecovery.activity
.privacyspace
import
android.annotation.SuppressLint
import
android.annotation.SuppressLint
import
android.content.Intent
import
android.content.Intent
import
android.graphics.Color
import
android.graphics.Color
import
android.view.View
import
android.view.View
import
android.widget.Toast
import
androidx.activity.addCallback
import
androidx.activity.addCallback
import
androidx.core.view.isVisible
import
androidx.core.view.isVisible
import
androidx.fragment.app.Fragment
import
androidx.fragment.app.Fragment
...
@@ -22,7 +21,6 @@ import com.base.datarecovery.help.MediaStoreHelp.updateMediaStore
...
@@ -22,7 +21,6 @@ import com.base.datarecovery.help.MediaStoreHelp.updateMediaStore
import
com.base.datarecovery.utils.BarUtils
import
com.base.datarecovery.utils.BarUtils
import
com.base.datarecovery.utils.LogEx
import
com.base.datarecovery.utils.LogEx
import
com.base.datarecovery.view.DialogViews.showRemoveOriginalTip
import
com.base.datarecovery.view.DialogViews.showRemoveOriginalTip
import
com.google.android.gms.ads.MediationUtils
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
import
java.io.File
import
java.io.File
...
@@ -135,12 +133,12 @@ class PrivacyImportActivity : BaseActivity<ActivityPrivacyImportBinding>() {
...
@@ -135,12 +133,12 @@ class PrivacyImportActivity : BaseActivity<ActivityPrivacyImportBinding>() {
binding
.
flProgress
.
visibility
=
View
.
VISIBLE
binding
.
flProgress
.
visibility
=
View
.
VISIBLE
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
allSelect
.
forEach
{
allSelect
.
forEach
{
LogEx
.
logDebug
(
TAG
,
it
.
mi
nt
ype
)
LogEx
.
logDebug
(
TAG
,
it
.
mi
meT
ype
)
val
dir
=
filesDir
val
dir
=
filesDir
val
file
=
File
(
it
.
path
)
val
file
=
File
(
it
.
path
)
runCatching
{
runCatching
{
if
(
it
.
mi
nt
ype
.
contains
(
"image"
))
{
if
(
it
.
mi
meT
ype
.
contains
(
"image"
))
{
val
imageDir
=
File
(
dir
,
"photos"
)
val
imageDir
=
File
(
dir
,
"photos"
)
file
.
copyTo
(
File
(
imageDir
,
file
.
name
),
true
)
file
.
copyTo
(
File
(
imageDir
,
file
.
name
),
true
)
}
else
{
}
else
{
...
...
app/src/main/java/com/base/datarecovery/activity/privacyspace/PrivacyPinOneActivity.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.activity.privacyspace
import
android.content.Intent
import
android.graphics.Color
import
android.os.Build
import
android.view.KeyEvent
import
androidx.activity.addCallback
import
androidx.annotation.RequiresApi
import
androidx.core.content.ContextCompat
import
androidx.core.widget.addTextChangedListener
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.R
import
com.base.datarecovery.bean.ConstObject.privacyPinPassword
import
com.base.datarecovery.databinding.ActivityPrivacyPinOneBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.KotlinExt.array2String
import
com.base.datarecovery.utils.BarUtils
import
com.base.datarecovery.utils.LogEx
import
com.base.datarecovery.view.AsteriskPasswordTransformationMethod
import
com.base.datarecovery.view.DialogViews.showPinReEnterDialog
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
class
PrivacyPinOneActivity
:
BaseActivity
<
ActivityPrivacyPinOneBinding
>()
{
private
val
TAG
=
"PrivacyPinActivity"
private
val
firstInput
=
arrayOf
(
""
,
""
,
""
,
""
)
override
val
binding
:
ActivityPrivacyPinOneBinding
by
lazy
{
ActivityPrivacyPinOneBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
}
@RequiresApi
(
Build
.
VERSION_CODES
.
O
)
override
fun
initListener
()
{
binding
.
flFanhui
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
onBackPressedDispatcher
.
addCallback
{
finishToMain
()
}
setInput
()
setDeleteKey
()
}
private
fun
setDeleteKey
()
{
arrayOf
(
binding
.
edit1
,
binding
.
edit2
,
binding
.
edit3
,
binding
.
edit4
).
forEach
{
it
.
setOnKeyListener
{
v
,
actionId
,
event
->
if
((
event
.
action
==
KeyEvent
.
ACTION_DOWN
)
&&
(
event
.
keyCode
==
KeyEvent
.
KEYCODE_DEL
))
{
if
(
binding
.
edit1
.
hasFocus
())
{
binding
.
edit1
.
setText
(
""
)
}
if
(
binding
.
edit2
.
hasFocus
())
{
binding
.
edit2
.
setText
(
""
)
binding
.
edit1
.
requestFocus
()
}
if
(
binding
.
edit3
.
hasFocus
())
{
binding
.
edit3
.
setText
(
""
)
binding
.
edit2
.
requestFocus
()
}
if
(
binding
.
edit4
.
hasFocus
())
{
binding
.
edit4
.
setText
(
""
)
binding
.
edit3
.
requestFocus
()
}
true
}
else
{
false
}
}
}
}
private
fun
startJump
()
{
if
(
privacyPinPassword
.
isNotEmpty
())
{
if
(
privacyPinPassword
==
firstInput
.
array2String
())
{
startActivity
(
Intent
(
this
,
PrivacySpaceActivity
::
class
.
java
))
finish
()
}
else
{
warmPassword
()
}
}
else
{
launcher
.
launch
(
Intent
(
this
,
PrivacyPinTwoActivity
::
class
.
java
).
apply
{
addFlags
(
Intent
.
FLAG_ACTIVITY_NO_ANIMATION
)
putExtra
(
"FirstInput"
,
firstInput
.
array2String
())
}
)
{
startActivity
(
Intent
(
this
,
PrivacySpaceActivity
::
class
.
java
))
finish
()
}
}
}
private
fun
setInput
()
{
binding
.
edit1
.
setOnFocusChangeListener
{
v
,
hasFocus
->
cancelWarmPassword
()
binding
.
fl1
.
isSelected
=
hasFocus
}
binding
.
edit2
.
setOnFocusChangeListener
{
v
,
hasFocus
->
cancelWarmPassword
()
binding
.
fl2
.
isSelected
=
hasFocus
}
binding
.
edit3
.
setOnFocusChangeListener
{
v
,
hasFocus
->
cancelWarmPassword
()
binding
.
fl3
.
isSelected
=
hasFocus
}
binding
.
edit4
.
setOnFocusChangeListener
{
v
,
hasFocus
->
cancelWarmPassword
()
binding
.
fl4
.
isSelected
=
hasFocus
}
binding
.
edit1
.
transformationMethod
=
AsteriskPasswordTransformationMethod
()
binding
.
edit2
.
transformationMethod
=
AsteriskPasswordTransformationMethod
()
binding
.
edit3
.
transformationMethod
=
AsteriskPasswordTransformationMethod
()
binding
.
edit4
.
transformationMethod
=
AsteriskPasswordTransformationMethod
()
binding
.
edit1
.
requestFocus
()
binding
.
edit1
.
addTextChangedListener
{
val
text
=
it
.
toString
()
LogEx
.
logDebug
(
TAG
,
"text=$text"
)
if
(
text
.
isNotEmpty
())
{
firstInput
[
0
]
=
text
binding
.
edit2
.
requestFocus
()
}
}
binding
.
edit2
.
addTextChangedListener
{
val
text
=
it
.
toString
()
LogEx
.
logDebug
(
TAG
,
"text=$text"
)
if
(
text
.
isNotEmpty
())
{
firstInput
[
1
]
=
text
binding
.
edit3
.
requestFocus
()
}
}
binding
.
edit3
.
addTextChangedListener
{
val
text
=
it
.
toString
()
LogEx
.
logDebug
(
TAG
,
"text=$text"
)
if
(
text
.
isNotEmpty
())
{
firstInput
[
2
]
=
text
binding
.
edit4
.
requestFocus
()
}
}
binding
.
edit4
.
addTextChangedListener
{
val
text
=
it
.
toString
()
LogEx
.
logDebug
(
TAG
,
"text=$text"
)
if
(
text
.
isNotEmpty
())
{
firstInput
[
3
]
=
text
startJump
()
}
}
}
private
fun
warmPassword
()
{
binding
.
fl1
.
tag
=
true
binding
.
fl1
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin_warm
)
binding
.
fl2
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin_warm
)
binding
.
fl3
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin_warm
)
binding
.
fl4
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin_warm
)
binding
.
edit1
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_fa020b
))
binding
.
edit2
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_fa020b
))
binding
.
edit3
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_fa020b
))
binding
.
edit4
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_fa020b
))
val
dialog
=
showPinReEnterDialog
()
lifecycleScope
.
launch
{
delay
(
2000
)
dialog
.
dismiss
()
}
}
private
fun
cancelWarmPassword
()
{
if
(
binding
.
fl1
.
tag
==
true
)
{
binding
.
fl1
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin
)
binding
.
fl2
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin
)
binding
.
fl3
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin
)
binding
.
fl4
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin
)
binding
.
edit1
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
black
))
binding
.
edit2
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
black
))
binding
.
edit3
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
black
))
binding
.
edit4
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
black
))
binding
.
fl1
.
tag
=
false
}
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/activity/privacyspace/PrivacyPinTwoActivity.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.activity.privacyspace
import
android.graphics.Color
import
android.view.KeyEvent
import
android.view.View
import
android.view.inputmethod.InputMethodManager
import
androidx.activity.addCallback
import
androidx.core.content.ContextCompat
import
androidx.core.widget.addTextChangedListener
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.R
import
com.base.datarecovery.bean.ConstObject.privacyPinPassword
import
com.base.datarecovery.databinding.ActivityPrivacyPinTwoBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.KotlinExt.array2String
import
com.base.datarecovery.utils.BarUtils
import
com.base.datarecovery.utils.LogEx
import
com.base.datarecovery.view.AsteriskPasswordTransformationMethod
import
com.base.datarecovery.view.DialogViews.showPinReEnterDialog
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
class
PrivacyPinTwoActivity
:
BaseActivity
<
ActivityPrivacyPinTwoBinding
>()
{
private
var
firstInput
=
"null"
private
val
secondInput
=
arrayOf
(
""
,
""
,
""
,
""
)
private
val
TAG
=
"PrivacyPinTwoActivity"
override
val
binding
:
ActivityPrivacyPinTwoBinding
by
lazy
{
ActivityPrivacyPinTwoBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
firstInput
=
intent
.
extras
?.
getString
(
"FirstInput"
)
?:
"null"
LogEx
.
logDebug
(
TAG
,
"firstInput=$firstInput"
)
}
override
fun
initListener
()
{
binding
.
flFanhui
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
onBackPressedDispatcher
.
addCallback
{
finish
()
}
setInput
()
setDeleteKey
()
}
private
fun
hideInput
()
{
val
imm
=
getSystemService
(
INPUT_METHOD_SERVICE
)
as
InputMethodManager
imm
.
hideSoftInputFromWindow
(
binding
.
edit4
.
windowToken
,
0
)
binding
.
edit4
.
clearFocus
()
}
private
fun
warmPassword
()
{
binding
.
fl1
.
tag
=
true
binding
.
fl1
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin_warm
)
binding
.
fl2
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin_warm
)
binding
.
fl3
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin_warm
)
binding
.
fl4
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin_warm
)
binding
.
edit1
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_fa020b
))
binding
.
edit2
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_fa020b
))
binding
.
edit3
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_fa020b
))
binding
.
edit4
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_fa020b
))
val
dialog
=
showPinReEnterDialog
()
lifecycleScope
.
launch
{
delay
(
2000
)
dialog
.
dismiss
()
}
}
private
fun
cancelWarmPassword
()
{
if
(
binding
.
fl1
.
tag
==
true
)
{
binding
.
fl1
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin
)
binding
.
fl2
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin
)
binding
.
fl3
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin
)
binding
.
fl4
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_border_pin
)
binding
.
edit1
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
black
))
binding
.
edit2
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
black
))
binding
.
edit3
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
black
))
binding
.
edit4
.
setTextColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
black
))
binding
.
fl1
.
tag
=
false
}
}
private
fun
startJump
()
{
binding
.
llInput
.
visibility
=
View
.
GONE
binding
.
llRememberTip
.
visibility
=
View
.
VISIBLE
hideInput
()
onBackPressedDispatcher
.
addCallback
{
setResult
(
0
,
intent
)
finish
()
}
binding
.
flFanhui
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
}
private
fun
setInput
()
{
binding
.
edit1
.
setOnFocusChangeListener
{
v
,
hasFocus
->
cancelWarmPassword
()
binding
.
fl1
.
isSelected
=
hasFocus
}
binding
.
edit2
.
setOnFocusChangeListener
{
v
,
hasFocus
->
cancelWarmPassword
()
binding
.
fl2
.
isSelected
=
hasFocus
}
binding
.
edit3
.
setOnFocusChangeListener
{
v
,
hasFocus
->
cancelWarmPassword
()
binding
.
fl3
.
isSelected
=
hasFocus
}
binding
.
edit4
.
setOnFocusChangeListener
{
v
,
hasFocus
->
cancelWarmPassword
()
binding
.
fl4
.
isSelected
=
hasFocus
}
binding
.
edit1
.
transformationMethod
=
AsteriskPasswordTransformationMethod
()
binding
.
edit2
.
transformationMethod
=
AsteriskPasswordTransformationMethod
()
binding
.
edit3
.
transformationMethod
=
AsteriskPasswordTransformationMethod
()
binding
.
edit4
.
transformationMethod
=
AsteriskPasswordTransformationMethod
()
binding
.
edit1
.
requestFocus
()
binding
.
edit1
.
addTextChangedListener
{
val
text
=
it
.
toString
()
LogEx
.
logDebug
(
TAG
,
"text=$text"
)
if
(
text
.
isNotEmpty
())
{
secondInput
[
0
]
=
text
binding
.
edit2
.
requestFocus
()
}
}
binding
.
edit2
.
addTextChangedListener
{
val
text
=
it
.
toString
()
LogEx
.
logDebug
(
TAG
,
"text=$text"
)
if
(
text
.
isNotEmpty
())
{
secondInput
[
1
]
=
text
binding
.
edit3
.
requestFocus
()
}
}
binding
.
edit3
.
addTextChangedListener
{
val
text
=
it
.
toString
()
LogEx
.
logDebug
(
TAG
,
"text=$text"
)
if
(
text
.
isNotEmpty
())
{
secondInput
[
2
]
=
text
binding
.
edit4
.
requestFocus
()
}
}
binding
.
edit4
.
addTextChangedListener
{
val
text
=
it
.
toString
()
LogEx
.
logDebug
(
TAG
,
"text=$text"
)
if
(
text
.
isNotEmpty
())
{
secondInput
[
3
]
=
text
if
(
firstInput
==
secondInput
.
array2String
())
{
privacyPinPassword
=
firstInput
startJump
()
}
else
{
warmPassword
()
}
}
}
}
private
fun
setDeleteKey
()
{
arrayOf
(
binding
.
edit1
,
binding
.
edit2
,
binding
.
edit3
,
binding
.
edit4
).
forEach
{
it
.
setOnKeyListener
{
v
,
actionId
,
event
->
if
((
event
.
action
==
KeyEvent
.
ACTION_DOWN
)
&&
(
event
.
keyCode
==
KeyEvent
.
KEYCODE_DEL
))
{
if
(
binding
.
edit1
.
hasFocus
())
{
binding
.
edit1
.
setText
(
""
)
}
if
(
binding
.
edit2
.
hasFocus
())
{
binding
.
edit2
.
setText
(
""
)
binding
.
edit1
.
requestFocus
()
}
if
(
binding
.
edit3
.
hasFocus
())
{
binding
.
edit3
.
setText
(
""
)
binding
.
edit2
.
requestFocus
()
}
if
(
binding
.
edit4
.
hasFocus
())
{
binding
.
edit4
.
setText
(
""
)
binding
.
edit3
.
requestFocus
()
}
true
}
else
{
false
}
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/activity/PrivacySpaceActivity.kt
→
app/src/main/java/com/base/datarecovery/activity/
privacyspace/
PrivacySpaceActivity.kt
View file @
7304dac9
package
com.base.datarecovery.activity
package
com.base.datarecovery.activity
.privacyspace
import
android.annotation.SuppressLint
import
android.content.Intent
import
android.graphics.Color
import
android.graphics.Color
import
android.os.Bundle
import
android.view.View
import
android.view.View
import
androidx.activity.addCallback
import
androidx.activity.addCallback
import
androidx.activity.enableEdgeToEdge
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.view.ViewCompat
import
androidx.core.view.WindowInsetsCompat
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.datarecovery.
R
import
com.base.datarecovery.
bean.ConstObject.privacyPinPassword
import
com.base.datarecovery.databinding.ActivityPrivacySpaceBinding
import
com.base.datarecovery.databinding.ActivityPrivacySpaceBinding
import
com.base.datarecovery.fragment.PrivacyPageFragment
import
com.base.datarecovery.fragment.PrivacyPageFragment
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.BaseActivity
...
@@ -37,6 +34,7 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
...
@@ -37,6 +34,7 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
}
}
@SuppressLint
(
"SetTextI18n"
)
override
fun
initView
()
{
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
...
@@ -64,13 +62,24 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
...
@@ -64,13 +62,24 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
}
}
}
}
})
})
if
(
privacyPinPassword
.
isEmpty
())
{
binding
.
tvUninstallTip
.
setTextColor
(
Color
.
parseColor
(
"#FAB44B"
))
binding
.
tvGoOrSetting
.
text
=
"Setting"
}
else
{
binding
.
tvPinTip
.
visibility
=
View
.
GONE
binding
.
tvGoOrSetting
.
text
=
"Got it"
}
}
}
override
fun
initListener
()
{
override
fun
initListener
()
{
super
.
initListener
()
super
.
initListener
()
binding
.
tvGoIt
.
setOnClickListener
{
binding
.
tvGoOrSetting
.
setOnClickListener
{
binding
.
llUninstallTip
.
visibility
=
View
.
GONE
if
(
privacyPinPassword
.
isEmpty
())
{
startActivity
(
Intent
(
this
,
PrivacyPinOneActivity
::
class
.
java
))
}
else
{
binding
.
llTip
.
visibility
=
View
.
GONE
}
}
}
binding
.
llPhotos
.
setOnClickListener
{
binding
.
llPhotos
.
setOnClickListener
{
binding
.
viewpager2
.
currentItem
=
0
binding
.
viewpager2
.
currentItem
=
0
...
...
app/src/main/java/com/base/datarecovery/activity/whatsapp/WhatsAppCleanerActivity.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.activity.whatsapp
import
android.content.Intent
import
android.graphics.Color
import
android.os.Environment
import
androidx.activity.addCallback
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.R
import
com.base.datarecovery.adapter.WhatsAppCleanerAdapter
import
com.base.datarecovery.ads.AdmobInterstitialUtils
import
com.base.datarecovery.ads.AdmobNativeUtils
import
com.base.datarecovery.bean.WhatsAppCleanerBean
import
com.base.datarecovery.databinding.ActivityWhatsAppCleanerBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.FileHelp.getDirFiles
import
com.base.datarecovery.help.KotlinExt.toFormatSize
import
com.base.datarecovery.help.PermissionHelp.checkStorePermission
import
com.base.datarecovery.help.PermissionHelp.requestStorePermission
import
com.base.datarecovery.utils.BarUtils
import
com.base.datarecovery.utils.FileHexEx.isImage
import
com.base.datarecovery.utils.FileHexEx.isVideo
import
com.base.datarecovery.utils.LogEx
import
com.base.datarecovery.view.DialogViews.showGerPermission
import
com.google.gson.Gson
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
java.io.File
class
WhatsAppCleanerActivity
:
BaseActivity
<
ActivityWhatsAppCleanerBinding
>()
{
private
val
TAG
=
"WhatsAppCleanerActivity"
private
lateinit
var
adapter
:
WhatsAppCleanerAdapter
override
val
binding
:
ActivityWhatsAppCleanerBinding
by
lazy
{
ActivityWhatsAppCleanerBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
adapter
=
WhatsAppCleanerAdapter
{
startActivity
(
Intent
(
this
,
WhatsAppMessageCleanActivity
::
class
.
java
).
apply
{
putExtra
(
"PathList"
,
Gson
().
toJson
(
it
.
subFile
.
toTypedArray
()))
putExtra
(
"Tittle"
,
it
.
tittle
)
})
finish
()
}
binding
.
rv
.
adapter
=
adapter
if
(
checkStorePermission
())
{
initData
()
}
else
{
showGerPermission
(
null
,
deny
=
{
finishToMain
()
},
allow
=
{
requestStorePermission
(
launcher
,
result
=
{
flag
->
if
(
flag
)
{
initData
()
}
else
{
finishToMain
()
}
},
)
})
}
AdmobNativeUtils
.
showNativeAd
(
this
,
binding
.
flAd
)
}
override
fun
initListener
()
{
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
onBackPressedDispatcher
.
addCallback
{
AdmobInterstitialUtils
.
showInterstitialAd
(
this
@WhatsAppCleanerActivity
)
{
finishToMain
()
}
}
binding
.
tvTvGotIt
.
setOnClickListener
{
}
}
private
fun
initData
()
=
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
whatsAppRoot
=
File
(
Environment
.
getExternalStorageDirectory
(),
"Android/media/com.whatsapp/WhatsApp/Media/"
)
LogEx
.
logDebug
(
TAG
,
whatsAppRoot
.
absolutePath
)
val
list
=
arrayListOf
<
WhatsAppCleanerBean
>()
list
.
add
(
WhatsAppCleanerBean
(
R
.
mipmap
.
videomessages
,
"Video Messages"
))
list
.
add
(
WhatsAppCleanerBean
(
R
.
mipmap
.
imagemessages
,
"Image Messages"
))
list
.
add
(
WhatsAppCleanerBean
(
R
.
mipmap
.
audiomessages
,
"Audio Messages"
))
var
totalSize
=
0L
whatsAppRoot
.
listFiles
()
?.
forEach
{
file
->
if
(
file
.
name
==
"WhatsApp Video"
)
{
LogEx
.
logDebug
(
TAG
,
"whatsapp file=${file.absolutePath}"
)
val
bean
=
list
.
find
{
it
.
tittle
==
"Video Messages"
}
val
subFile
=
getDirFiles
(
file
).
filter
{
isVideo
(
it
)
}
val
size
=
subFile
.
sumOf
{
it
.
length
()
}
bean
?.
size
=
size
totalSize
+=
size
bean
?.
subFile
=
subFile
.
map
{
it
.
absolutePath
}
// subFile.forEach { path ->
// LogEx.logDebug(TAG, "path=$path")
// }
}
if
(
file
.
name
==
"WhatsApp Images"
)
{
val
bean
=
list
.
find
{
it
.
tittle
==
"Image Messages"
}
val
subFile
=
getDirFiles
(
file
).
filter
{
isImage
(
it
)
}
val
size
=
subFile
.
sumOf
{
it
.
length
()
}
bean
?.
size
=
size
totalSize
+=
size
bean
?.
subFile
=
subFile
.
map
{
it
.
absolutePath
}
}
if
(
file
.
name
==
"WhatsApp Audio"
)
{
val
bean
=
list
.
find
{
it
.
tittle
==
"Audio Messages"
}
val
subFile
=
getDirFiles
(
file
).
filter
{
it
.
name
.
contains
(
".mp3"
)
}
val
size
=
subFile
.
sumOf
{
it
.
length
()
}
bean
?.
size
=
size
totalSize
+=
size
bean
?.
subFile
=
subFile
.
map
{
it
.
absolutePath
}
}
}
launch
(
Dispatchers
.
Main
)
{
adapter
.
setData
(
list
)
val
split
=
totalSize
.
toFormatSize
().
split
(
" "
)
binding
.
tvSize
.
text
=
split
[
0
]
binding
.
tvUnit
.
text
=
split
[
1
]
}
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/activity/whatsapp/WhatsAppMessageCleanActivity.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.activity.whatsapp
import
android.content.Intent
import
android.graphics.Color
import
androidx.activity.addCallback
import
androidx.recyclerview.widget.GridLayoutManager
import
androidx.recyclerview.widget.LinearLayoutManager
import
com.base.datarecovery.adapter.WhatsAppMediaAdapter
import
com.base.datarecovery.ads.AdmobInterstitialUtils
import
com.base.datarecovery.ads.AdmobNativeUtils
import
com.base.datarecovery.bean.MediaBean
import
com.base.datarecovery.databinding.ActivityWhatsAppMessageCleanBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.KotlinExt.toFormatSize
import
com.base.datarecovery.utils.BarUtils
import
com.google.gson.Gson
import
java.io.File
class
WhatsAppMessageCleanActivity
:
BaseActivity
<
ActivityWhatsAppMessageCleanBinding
>()
{
private
val
pathList
by
lazy
{
val
json
=
intent
.
extras
?.
getString
(
"PathList"
)
val
list
=
Gson
().
fromJson
(
json
,
Array
<
String
>
::
class
.
java
)
list
.
map
{
MediaBean
(
it
)
}
}
private
lateinit
var
adapter
:
WhatsAppMediaAdapter
override
val
binding
:
ActivityWhatsAppMessageCleanBinding
by
lazy
{
ActivityWhatsAppMessageCleanBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
val
tittle
=
intent
.
extras
?.
getString
(
"Tittle"
)
?:
""
binding
.
tvTitle
.
text
=
tittle
var
isList
=
false
when
(
tittle
)
{
"Audio Messages"
->
{
binding
.
rv
.
layoutManager
=
LinearLayoutManager
(
this
)
isList
=
true
}
else
->
{
binding
.
rv
.
layoutManager
=
GridLayoutManager
(
this
,
3
)
}
}
adapter
=
WhatsAppMediaAdapter
(
isList
)
{
binding
.
llSelectAll
.
isSelected
=
it
binding
.
tvClean
.
isEnabled
=
adapter
.
getSelectData
().
isNotEmpty
()
val
split
=
adapter
.
getSelectDataSize
().
toFormatSize
().
split
(
" "
)
binding
.
tvSize
.
text
=
split
[
0
]
binding
.
tvUnit
.
text
=
split
[
1
]
}
binding
.
rv
.
adapter
=
adapter
adapter
.
setData
(
pathList
)
AdmobNativeUtils
.
showNativeAd
(
this
,
binding
.
flAd
)
}
override
fun
initListener
()
{
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
onBackPressedDispatcher
.
addCallback
{
AdmobInterstitialUtils
.
showInterstitialAd
(
this
@WhatsAppMessageCleanActivity
,
isShowInterVal
=
false
)
{
finishToMain
()
}
}
binding
.
llSelectAll
.
setOnClickListener
{
it
.
isSelected
=
!
it
.
isSelected
adapter
.
toggleSelect
(
it
.
isSelected
)
binding
.
tvClean
.
isEnabled
=
it
.
isSelected
val
split
=
adapter
.
getSelectDataSize
().
toFormatSize
().
split
(
" "
)
binding
.
tvSize
.
text
=
split
[
0
]
binding
.
tvUnit
.
text
=
split
[
1
]
}
binding
.
tvClean
.
setOnClickListener
{
AdmobInterstitialUtils
.
showInterstitialAd
(
this
)
{
val
list
=
adapter
.
getSelectData
()
runCatching
{
list
.
forEach
{
File
(
it
).
delete
()
}
}
finish
()
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/adapter/ScreenShotAdapter.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.adapter
import
android.annotation.SuppressLint
import
android.view.View
import
android.view.ViewGroup
import
androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView.ViewHolder
import
com.base.datarecovery.R
import
com.base.datarecovery.bean.ScreenPhotoBean
import
com.base.datarecovery.bean.ScreenshotBean
import
com.base.datarecovery.databinding.ItemScreenPhotoBinding
import
com.base.datarecovery.databinding.ItemScreenshotBinding
import
com.base.datarecovery.view.XmlEx.inflate
import
com.bumptech.glide.Glide
class
ScreenShotAdapter
(
val
select
:
(
size
:
Int
)
->
Unit
)
:
RecyclerView
.
Adapter
<
ScreenShotAdapter
.
SSS
>()
{
private
var
beans
=
arrayListOf
<
ScreenshotBean
>()
inner
class
SSS
(
view
:
View
)
:
ViewHolder
(
view
)
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
SSS
{
return
SSS
(
R
.
layout
.
item_screenshot
.
inflate
(
parent
))
}
override
fun
getItemCount
():
Int
{
return
beans
.
size
}
@SuppressLint
(
"NotifyDataSetChanged"
)
override
fun
onBindViewHolder
(
holder
:
SSS
,
position
:
Int
)
{
val
binding
=
ItemScreenshotBinding
.
bind
(
holder
.
itemView
)
val
context
=
holder
.
itemView
.
context
val
bean
=
beans
[
position
]
binding
.
tvSelectAll
.
text
=
if
(
bean
.
isSelect
)
"UNSELECT ALL"
else
"SELECT ALL"
binding
.
tvSelectAll
.
setOnClickListener
{
bean
.
isSelect
=
!
bean
.
isSelect
bean
.
screenPhotoBean
.
forEach
{
subBean
->
subBean
.
isSelect
=
bean
.
isSelect
}
notifyItemChanged
(
position
)
select
.
invoke
(
getSelectDataSize
())
}
binding
.
tvTime
.
text
=
bean
.
time
binding
.
group
.
removeAllViews
()
bean
.
screenPhotoBean
.
forEach
{
screenPhotoBean
->
val
itemView
=
R
.
layout
.
item_screen_photo
.
inflate
(
binding
.
group
)
val
photoBinding
=
ItemScreenPhotoBinding
.
bind
(
itemView
)
Glide
.
with
(
context
).
load
(
screenPhotoBean
.
file
).
centerCrop
().
into
(
photoBinding
.
iv
)
photoBinding
.
ivSelector
.
isSelected
=
screenPhotoBean
.
isSelect
arrayOf
(
photoBinding
.
root
,
photoBinding
.
ivSelector
).
forEach
{
it
.
setOnClickListener
{
screenPhotoBean
.
isSelect
=
!
screenPhotoBean
.
isSelect
photoBinding
.
ivSelector
.
isSelected
=
screenPhotoBean
.
isSelect
bean
.
isSelect
=
bean
.
screenPhotoBean
.
all
{
it
.
isSelect
}
notifyDataSetChanged
()
select
.
invoke
(
getSelectDataSize
())
}
}
binding
.
group
.
addView
(
itemView
)
}
if
(
bean
.
screenPhotoBean
.
size
<
3
)
{
repeat
(
2
)
{
val
itemView
=
R
.
layout
.
item_screen_photo
.
inflate
(
binding
.
group
)
itemView
.
visibility
=
View
.
INVISIBLE
binding
.
group
.
addView
(
itemView
)
}
}
}
@SuppressLint
(
"NotifyDataSetChanged"
)
fun
setData
(
screenshotBean
:
List
<
ScreenshotBean
>)
{
beans
.
clear
()
beans
.
addAll
(
screenshotBean
)
notifyDataSetChanged
()
}
@SuppressLint
(
"NotifyDataSetChanged"
)
fun
toggleSelect
(
selected
:
Boolean
)
{
beans
.
forEach
{
it
.
isSelect
=
selected
it
.
screenPhotoBean
.
forEach
{
it
.
isSelect
=
selected
}
}
notifyDataSetChanged
()
}
fun
isAllSelect
():
Boolean
{
return
beans
.
all
{
bean
->
bean
.
screenPhotoBean
.
all
{
it
.
isSelect
}
}
}
fun
getSelectDataSize
():
Int
{
return
beans
.
sumOf
{
bean
->
bean
.
screenPhotoBean
.
filter
{
it
.
isSelect
}.
size
}
}
fun
getSelectData
():
List
<
ScreenPhotoBean
>
{
return
beans
.
flatMap
{
bean
->
bean
.
screenPhotoBean
.
filter
{
it
.
isSelect
}
}
}
@SuppressLint
(
"NotifyDataSetChanged"
)
fun
removeData
(
files
:
List
<
ScreenPhotoBean
>)
{
beans
.
forEach
{
screenshotBean
->
screenshotBean
.
screenPhotoBean
.
removeAll
(
files
.
toSet
())
}
beans
.
removeIf
{
it
.
screenPhotoBean
.
isEmpty
()
}
notifyDataSetChanged
()
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/adapter/WhatsAppCleanerAdapter.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.adapter
import
android.annotation.SuppressLint
import
android.graphics.Color
import
android.view.View
import
android.view.ViewGroup
import
androidx.core.content.ContextCompat
import
androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView.ViewHolder
import
com.base.datarecovery.R
import
com.base.datarecovery.bean.WhatsAppCleanerBean
import
com.base.datarecovery.databinding.ItemWhatsappBinding
import
com.base.datarecovery.help.KotlinExt.toFormatSize
import
com.base.datarecovery.utils.ScreenUtil.dpToPx
import
com.base.datarecovery.view.XmlEx.inflate
import
com.bumptech.glide.Glide
import
com.bumptech.glide.load.resource.bitmap.CenterCrop
import
com.bumptech.glide.load.resource.bitmap.RoundedCorners
import
com.bumptech.glide.request.RequestOptions
class
WhatsAppCleanerAdapter
(
val
click
:
(
bean
:
WhatsAppCleanerBean
)
->
Unit
)
:
RecyclerView
.
Adapter
<
WhatsAppCleanerAdapter
.
Whats
>()
{
private
val
beanList
=
arrayListOf
<
WhatsAppCleanerBean
>()
class
Whats
(
view
:
View
)
:
ViewHolder
(
view
)
{
}
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
Whats
{
return
Whats
(
R
.
layout
.
item_whatsapp
.
inflate
(
parent
))
}
override
fun
getItemCount
():
Int
{
return
beanList
.
size
}
override
fun
onBindViewHolder
(
holder
:
Whats
,
position
:
Int
)
{
val
binding
=
ItemWhatsappBinding
.
bind
(
holder
.
itemView
)
val
context
=
holder
.
itemView
.
context
val
bean
=
beanList
[
position
]
binding
.
iv
.
setImageDrawable
(
ContextCompat
.
getDrawable
(
context
,
bean
.
icon
))
binding
.
tvTitle
.
text
=
bean
.
tittle
if
(
bean
.
subFile
.
isEmpty
())
{
binding
.
llIv
.
visibility
=
View
.
GONE
binding
.
tvSize
.
setTextColor
(
Color
.
parseColor
(
"#999999"
))
binding
.
ivArrow
.
setImageDrawable
(
ContextCompat
.
getDrawable
(
context
,
R
.
mipmap
.
jianotu_whatsapp
))
binding
.
tvNoMessage
.
visibility
=
View
.
VISIBLE
}
else
{
binding
.
llIv
.
visibility
=
View
.
VISIBLE
runCatching
{
val
options
=
RequestOptions
().
transform
(
CenterCrop
(),
RoundedCorners
(
context
.
dpToPx
(
10
)))
val
image1
=
bean
.
subFile
[
0
]
Glide
.
with
(
context
).
load
(
image1
).
apply
(
options
).
into
(
binding
.
iv1
)
val
image2
=
bean
.
subFile
[
1
]
Glide
.
with
(
context
).
load
(
image2
).
apply
(
options
).
into
(
binding
.
iv2
)
val
image3
=
bean
.
subFile
[
2
]
Glide
.
with
(
context
).
load
(
image3
).
apply
(
options
).
into
(
binding
.
iv3
)
}
binding
.
tvSize
.
setTextColor
(
Color
.
parseColor
(
"#355BEA"
))
binding
.
tvSize
.
text
=
bean
.
size
.
toFormatSize
()
binding
.
ivArrow
.
setImageDrawable
(
ContextCompat
.
getDrawable
(
context
,
R
.
mipmap
.
jianotul_whatsapp
))
binding
.
tvNoMessage
.
visibility
=
View
.
GONE
}
binding
.
root
.
setOnClickListener
{
if
(
bean
.
subFile
.
isEmpty
())
{
return
@setOnClickListener
}
click
.
invoke
(
bean
)
}
}
@SuppressLint
(
"NotifyDataSetChanged"
)
fun
setData
(
list
:
List
<
WhatsAppCleanerBean
>)
{
beanList
.
clear
()
beanList
.
addAll
(
list
)
notifyDataSetChanged
()
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/adapter/WhatsAppMediaAdapter.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.adapter
import
android.annotation.SuppressLint
import
android.view.View
import
android.view.ViewGroup
import
androidx.core.content.ContextCompat
import
androidx.recyclerview.widget.RecyclerView
import
com.base.datarecovery.R
import
com.base.datarecovery.bean.MediaBean
import
com.base.datarecovery.databinding.ItemMediaFileBinding
import
com.base.datarecovery.databinding.ItemMediaSelectBinding
import
com.base.datarecovery.help.KotlinExt.toFormatSize
import
com.base.datarecovery.view.XmlEx.inflate
import
com.bumptech.glide.Glide
import
java.io.File
class
WhatsAppMediaAdapter
(
private
val
isList
:
Boolean
=
false
,
private
val
click
:
(
allSelect
:
Boolean
)
->
Unit
)
:
RecyclerView
.
Adapter
<
WhatsAppMediaAdapter
.
WhatMedia
>()
{
private
val
beanList
=
arrayListOf
<
MediaBean
>()
class
WhatMedia
(
view
:
View
)
:
RecyclerView
.
ViewHolder
(
view
)
override
fun
getItemViewType
(
position
:
Int
):
Int
{
return
if
(
isList
)
0
else
1
}
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
WhatMedia
{
val
layout
=
if
(
viewType
==
0
)
R
.
layout
.
item_media_file
else
R
.
layout
.
item_media_select
return
WhatMedia
(
layout
.
inflate
(
parent
))
}
override
fun
getItemCount
():
Int
{
return
beanList
.
size
}
override
fun
onBindViewHolder
(
holder
:
WhatMedia
,
position
:
Int
)
{
}
override
fun
onBindViewHolder
(
holder
:
WhatMedia
,
position
:
Int
,
payloads
:
MutableList
<
Any
>)
{
val
context
=
holder
.
itemView
.
context
val
bean
=
beanList
[
position
]
if
(
isList
)
{
val
binding
=
ItemMediaFileBinding
.
bind
(
holder
.
itemView
)
if
(
payloads
.
isEmpty
())
{
binding
.
iv
.
setImageDrawable
(
ContextCompat
.
getDrawable
(
context
,
R
.
mipmap
.
audiomessages
))
val
file
=
File
(
bean
.
path
)
binding
.
tvName
.
text
=
file
.
name
binding
.
tvSize
.
text
=
file
.
length
().
toFormatSize
()
binding
.
ivSelector
.
isSelected
=
bean
.
isSelect
binding
.
root
.
setOnClickListener
{
binding
.
ivSelector
.
isSelected
=
!
binding
.
ivSelector
.
isSelected
bean
.
isSelect
=
binding
.
ivSelector
.
isSelected
notifyItemChanged
(
position
,
"sdd"
)
click
.
invoke
(
beanList
.
all
{
it
.
isSelect
})
}
}
else
{
binding
.
ivSelector
.
isSelected
=
bean
.
isSelect
super
.
onBindViewHolder
(
holder
,
position
,
payloads
)
}
}
else
{
val
binding
=
ItemMediaSelectBinding
.
bind
(
holder
.
itemView
)
if
(
payloads
.
isEmpty
())
{
Glide
.
with
(
context
).
load
(
bean
.
path
).
centerCrop
().
into
(
binding
.
iv
)
binding
.
ivSelector
.
isSelected
=
bean
.
isSelect
binding
.
root
.
setOnClickListener
{
binding
.
ivSelector
.
isSelected
=
!
binding
.
ivSelector
.
isSelected
bean
.
isSelect
=
binding
.
ivSelector
.
isSelected
notifyItemChanged
(
position
,
"sdd"
)
click
.
invoke
(
beanList
.
all
{
it
.
isSelect
})
}
}
else
{
binding
.
ivSelector
.
isSelected
=
bean
.
isSelect
super
.
onBindViewHolder
(
holder
,
position
,
payloads
)
}
}
}
@SuppressLint
(
"NotifyDataSetChanged"
)
fun
setData
(
pathList
:
List
<
MediaBean
>)
{
beanList
.
clear
()
beanList
.
addAll
(
pathList
)
notifyDataSetChanged
()
}
@SuppressLint
(
"NotifyDataSetChanged"
)
fun
toggleSelect
(
select
:
Boolean
)
{
beanList
.
forEach
{
it
.
isSelect
=
select
}
notifyDataSetChanged
()
}
fun
getSelectData
():
List
<
String
>
{
return
beanList
.
filter
{
it
.
isSelect
}.
map
{
it
.
path
}
}
fun
getSelectDataSize
():
Long
{
return
getSelectData
().
map
{
File
(
it
)
}.
sumOf
{
it
.
length
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/ads/AdmobInterstitialUtils.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.ads
import
android.annotation.SuppressLint
import
android.app.Activity
import
android.app.Dialog
import
android.os.CountDownTimer
import
android.widget.Toast
import
com.base.datarecovery.BuildConfig
import
com.base.datarecovery.R
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.view.CustomDialog
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.interstitial.InterstitialAd
import
com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
import
org.json.JSONObject
import
java.util.UUID
object
AdmobInterstitialUtils
{
private
var
interAd
:
InterstitialAd
?
=
null
private
var
interLoadTime
=
Long
.
MAX_VALUE
private
var
adLastDisplayTime
:
Long
=
0
private
val
mRequest
=
AdRequest
.
Builder
().
build
()
@SuppressLint
(
"StaticFieldLeak"
)
private
var
customDialog
:
CustomDialog
?
=
null
private
fun
isAdExpired
():
Boolean
{
return
System
.
currentTimeMillis
()
-
interLoadTime
>
1000
*
60
*
60
}
fun
showInterstitialAd
(
activity
:
Activity
,
isLoadAdNow
:
Boolean
=
false
,
isShowInterVal
:
Boolean
=
true
,
onHidden
:
(()
->
Unit
)?
=
null
)
{
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
val
obj
=
JSONObject
()
obj
.
put
(
"ad_unit"
,
"interAd"
)
// EventUtils.event("ad_prepare_show", ext = obj)
if
(
isAdExpired
())
{
val
obj
=
JSONObject
()
obj
.
put
(
"ad_unit"
,
"interAd"
)
// EventUtils.event("ad_expire", ext = obj)
interAd
=
null
loadInterstitialAd
(
activity
)
onHidden
?.
invoke
()
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
())
{
onHidden
?.
invoke
()
return
}
if
(
interAd
!=
null
)
{
showIntervalDialogAndShowAd
(
activity
,
isLoadAdNow
,
isShowInterVal
,
onHidden
,
2
)
}
else
{
showAdDialogAndLoadInterstitial
(
activity
,
isLoadAdNow
,
isShowInterVal
,
onHidden
)
}
}
fun
loadInterstitialAd
(
activity
:
Activity
,
onLoad
:
(()
->
Unit
)?
=
null
)
{
if
(
interAd
!=
null
)
{
onLoad
?.
invoke
()
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
())
{
onLoad
?.
invoke
()
return
}
val
reqId
=
UUID
.
randomUUID
().
toString
()
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"ad_type"
,
"interAd"
)
obj
.
put
(
"from"
,
activity
.
javaClass
.
simpleName
)
// EventUtils.event("ad_pull_start", ext = obj)
InterstitialAd
.
load
(
activity
,
ConfigHelper
.
interAdmobId
,
mRequest
,
object
:
InterstitialAdLoadCallback
()
{
override
fun
onAdFailedToLoad
(
p0
:
LoadAdError
)
{
interAd
=
null
onLoad
?.
invoke
()
pullAd
(
p0
.
responseInfo
,
"interAd"
,
p0
.
message
,
reqId
=
reqId
)
if
(
BuildConfig
.
DEBUG
)
{
Toast
.
makeText
(
BaseApplication
.
context
,
"拉取失败"
+
p0
.
message
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
override
fun
onAdLoaded
(
ad
:
InterstitialAd
)
{
interAd
=
ad
onLoad
?.
invoke
()
interLoadTime
=
System
.
currentTimeMillis
()
pullAd
(
ad
.
responseInfo
,
"interAd"
,
reqId
=
reqId
)
ad
.
onPaidEventListener
=
AdmobEvent
.
EventOnPaidEventListener
(
ad
)
}
})
}
private
fun
showIntervalDialogAndShowAd
(
activity
:
Activity
,
isLoadAdNow
:
Boolean
,
isShowInterVal
:
Boolean
,
onHidden
:
(()
->
Unit
)?,
interval
:
Int
)
{
if
(
customDialog
!=
null
&&
customDialog
?.
isShowing
==
true
)
{
return
// 如果对话框已经显示,则不再显示
}
customDialog
=
CustomDialog
(
activity
,
R
.
layout
.
dialog_ad_loading
)
customDialog
?.
setCountdownText
(
R
.
id
.
dialog_ad_loading_text
)
val
countdownTimer
=
object
:
CountDownTimer
((
interval
*
1000
).
toLong
(),
1000
)
{
override
fun
onTick
(
millisUntilFinished
:
Long
)
{
val
seconds
=
(
millisUntilFinished
/
1000
).
toInt
()
customDialog
?.
updateCountdownText
(
"Advertising in preparation ($seconds"
+
"s)..."
)
}
override
fun
onFinish
()
{
displayInterstitialAd
(
activity
,
onHidden
)
if
(!
activity
.
isDestroyed
&&
!
activity
.
isFinishing
)
{
customDialog
?.
dismiss
()
}
customDialog
=
null
}
}
countdownTimer
.
start
()
customDialog
?.
show
()
}
private
fun
showAdDialogAndLoadInterstitial
(
activity
:
Activity
,
isLoadAdNow
:
Boolean
,
isShowInterVal
:
Boolean
,
onHidden
:
(()
->
Unit
)?
)
{
var
mDialog
:
Dialog
?
=
null
if
(!
activity
.
isFinishing
&&
!
activity
.
isDestroyed
)
{
mDialog
=
CustomDialog
(
activity
,
R
.
layout
.
dialog_ad_loading
)
// 设置对话框的样式和内容
mDialog
.
show
()
}
loadInterstitialAd
(
activity
)
{
mDialog
?.
dismiss
()
if
(!
isLoadAdNow
)
{
showInterstitialAd
(
activity
,
true
,
isShowInterVal
)
{
onHidden
?.
invoke
()
}
}
}
if
(
isLoadAdNow
)
{
mDialog
?.
dismiss
()
onHidden
?.
invoke
()
}
}
private
fun
displayInterstitialAd
(
activity
:
Activity
,
onHidden
:
(()
->
Unit
)?
=
null
)
{
val
thisInterAd
=
interAd
interAd
=
null
thisInterAd
?.
fullScreenContentCallback
=
object
:
FullScreenContentCallback
()
{
override
fun
onAdClicked
()
{
clickAd
(
thisInterAd
?.
responseInfo
,
"interAd"
)
AdDisplayUtils
.
getInstance
().
incrementAdClickCount
()
isMultiClick
(
thisInterAd
)
}
override
fun
onAdDismissedFullScreenContent
()
{
interAd
=
null
onHidden
?.
invoke
()
loadInterstitialAd
(
activity
)
}
override
fun
onAdFailedToShowFullScreenContent
(
p0
:
AdError
)
{
interAd
=
null
onHidden
?.
invoke
()
loadInterstitialAd
(
activity
)
}
override
fun
onAdShowedFullScreenContent
()
{
showAd
(
thisInterAd
?.
responseInfo
,
"interAd"
,
activity
)
AdDisplayUtils
.
getInstance
().
incrementAdDisplayCount
()
adLastDisplayTime
=
System
.
currentTimeMillis
()
/
1000
}
}
thisInterAd
?.
show
(
activity
)
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/bean/ConstObject.kt
View file @
7304dac9
...
@@ -35,4 +35,15 @@ object ConstObject {
...
@@ -35,4 +35,15 @@ object ConstObject {
field
=
value
field
=
value
SPUtils
.
getInstance
().
put
(
"rememberRemove"
,
value
,
true
)
SPUtils
.
getInstance
().
put
(
"rememberRemove"
,
value
,
true
)
}
}
var
privacyPinPassword
=
""
get
()
{
return
SPUtils
.
getInstance
().
getString
(
"privacyPinPassword"
,
field
)
}
set
(
value
)
{
field
=
value
SPUtils
.
getInstance
().
put
(
"privacyPinPassword"
,
value
,
true
)
}
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/bean/MediaBean.kt
View file @
7304dac9
...
@@ -6,7 +6,7 @@ data class MediaBean(
...
@@ -6,7 +6,7 @@ data class MediaBean(
val
path
:
String
=
""
,
val
path
:
String
=
""
,
val
uri
:
Uri
=
Uri
.
EMPTY
,
val
uri
:
Uri
=
Uri
.
EMPTY
,
val
time
:
Long
=
0
,
val
time
:
Long
=
0
,
val
mi
ntype
:
String
,
val
mi
meType
:
String
=
""
,
)
{
)
{
var
isSelect
:
Boolean
=
false
var
isSelect
:
Boolean
=
false
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/bean/ScreenshotBean.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.bean
import
java.io.File
data class
ScreenshotBean
(
val
time
:
String
,
val
screenPhotoBean
:
ArrayList
<
ScreenPhotoBean
>
){
var
isSelect
:
Boolean
=
false
}
data class
ScreenPhotoBean
(
val
file
:
File
)
{
var
isSelect
:
Boolean
=
false
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/bean/WhatsAppCleanerBean.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.bean
data class
WhatsAppCleanerBean
(
val
icon
:
Int
,
val
tittle
:
String
,
var
size
:
Long
=
0L
,
var
subFile
:
List
<
String
>
=
listOf
()
)
app/src/main/java/com/base/datarecovery/fragment/HomeFragment.kt
View file @
7304dac9
...
@@ -7,11 +7,15 @@ import android.content.Intent
...
@@ -7,11 +7,15 @@ import android.content.Intent
import
android.view.View
import
android.view.View
import
android.view.animation.AccelerateDecelerateInterpolator
import
android.view.animation.AccelerateDecelerateInterpolator
import
com.base.datarecovery.activity.FileScanActivity
import
com.base.datarecovery.activity.FileScanActivity
import
com.base.datarecovery.activity.PrivacySpaceActivity
import
com.base.datarecovery.activity.ScreenShotActivity
import
com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity
import
com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
import
com.base.datarecovery.activity.whatsapp.WhatsAppCleanerActivity
import
com.base.datarecovery.ads.AdmobNativeUtils
import
com.base.datarecovery.ads.AdmobNativeUtils
import
com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import
com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import
com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import
com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import
com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import
com.base.datarecovery.bean.ConstObject.privacyPinPassword
import
com.base.datarecovery.databinding.FragmentHomeBinding
import
com.base.datarecovery.databinding.FragmentHomeBinding
import
com.base.datarecovery.help.BaseFragment
import
com.base.datarecovery.help.BaseFragment
...
@@ -45,9 +49,17 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
...
@@ -45,9 +49,17 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
})
})
}
}
binding
.
cardPrivacySpace
.
setOnClickListener
{
binding
.
cardPrivacySpace
.
setOnClickListener
{
startActivity
(
Intent
(
requireContext
(),
PrivacySpaceActivity
::
class
.
java
).
apply
{
if
(
privacyPinPassword
.
isNotEmpty
())
{
startActivity
(
Intent
(
requireContext
(),
PrivacyPinOneActivity
::
class
.
java
))
}
else
{
startActivity
(
Intent
(
requireContext
(),
PrivacySpaceActivity
::
class
.
java
).
apply
{
})
})
}
}
binding
.
cardScreenshot
.
setOnClickListener
{
startActivity
(
Intent
(
requireContext
(),
ScreenShotActivity
::
class
.
java
))
}
}
...
...
app/src/main/java/com/base/datarecovery/fragment/PrivacyFileImportFragment.kt
View file @
7304dac9
...
@@ -2,7 +2,7 @@ package com.base.datarecovery.fragment
...
@@ -2,7 +2,7 @@ package com.base.datarecovery.fragment
import
android.annotation.SuppressLint
import
android.annotation.SuppressLint
import
androidx.lifecycle.lifecycleScope
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.activity.PrivacyImportActivity
import
com.base.datarecovery.activity.
privacyspace.
PrivacyImportActivity
import
com.base.datarecovery.adapter.MediaAdapter
import
com.base.datarecovery.adapter.MediaAdapter
import
com.base.datarecovery.bean.MediaBean
import
com.base.datarecovery.bean.MediaBean
import
com.base.datarecovery.bean.MediaTimeBean
import
com.base.datarecovery.bean.MediaTimeBean
...
...
app/src/main/java/com/base/datarecovery/fragment/PrivacyPageFragment.kt
View file @
7304dac9
...
@@ -3,16 +3,18 @@ package com.base.datarecovery.fragment
...
@@ -3,16 +3,18 @@ package com.base.datarecovery.fragment
import
android.content.Intent
import
android.content.Intent
import
android.view.View
import
android.view.View
import
android.widget.Toast
import
android.widget.Toast
import
androidx.activity.result.ActivityResult
import
androidx.lifecycle.lifecycleScope
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.activity.PrivacyImportActivity
import
com.base.datarecovery.activity.
privacyspace.
PrivacyImportActivity
import
com.base.datarecovery.activity.PrivacySpaceActivity
import
com.base.datarecovery.activity.
privacyspace.
PrivacySpaceActivity
import
com.base.datarecovery.adapter.FileGridAdapter
import
com.base.datarecovery.adapter.FileGridAdapter
import
com.base.datarecovery.databinding.FragmentPrivacyPageBinding
import
com.base.datarecovery.databinding.FragmentPrivacyPageBinding
import
com.base.datarecovery.help.BaseFragment
import
com.base.datarecovery.help.BaseFragment
import
com.base.datarecovery.help.FileHelp.loadFileByFilter
import
com.base.datarecovery.help.FileHelp.loadFileByFilter
import
com.base.datarecovery.help.PermissionHelp.checkStorePermission
import
com.base.datarecovery.help.PermissionHelp.requestStorePermission
import
com.base.datarecovery.utils.LogEx
import
com.base.datarecovery.utils.LogEx
import
com.base.datarecovery.view.DialogViews.showCameraSettingDialog
import
com.base.datarecovery.view.DialogViews.showCameraSettingDialog
import
com.base.datarecovery.view.DialogViews.showGerPermission
import
com.base.datarecovery.view.DialogViews.showImageImportDialog
import
com.base.datarecovery.view.DialogViews.showImageImportDialog
import
java.io.File
import
java.io.File
import
kotlin.random.Random
import
kotlin.random.Random
...
@@ -32,7 +34,25 @@ class PrivacyPageFragment(
...
@@ -32,7 +34,25 @@ class PrivacyPageFragment(
override
fun
setView
()
{
override
fun
setView
()
{
adapter
=
FileGridAdapter
()
adapter
=
FileGridAdapter
()
binding
.
rv
.
adapter
=
adapter
binding
.
rv
.
adapter
=
adapter
initData
()
if
(
requireContext
().
checkStorePermission
())
{
initData
()
}
else
{
val
activity
=
(
requireActivity
()
as
PrivacySpaceActivity
)
requireContext
().
showGerPermission
(
null
,
deny
=
{
activity
.
finishToMain
()
},
allow
=
{
requireContext
().
requestStorePermission
(
activity
.
launcher
,
result
=
{
if
(
it
)
{
initData
()
}
else
{
activity
.
finishToMain
()
}
})
})
}
}
}
override
fun
setListener
()
{
override
fun
setListener
()
{
...
...
app/src/main/java/com/base/datarecovery/help/BaseActivity.kt
View file @
7304dac9
...
@@ -30,7 +30,7 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
...
@@ -30,7 +30,7 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
protected
open
fun
initListener
()
{}
protected
open
fun
initListener
()
{}
protected
fun
finishToMain
()
{
fun
finishToMain
()
{
if
(
this
!
is
MainActivity
&&
!
ActivityManagerUtils
.
getInstance
().
isActivityInStack
(
MainActivity
::
class
.
java
))
{
if
(
this
!
is
MainActivity
&&
!
ActivityManagerUtils
.
getInstance
().
isActivityInStack
(
MainActivity
::
class
.
java
))
{
startActivity
(
Intent
(
this
,
MainActivity
::
class
.
java
))
startActivity
(
Intent
(
this
,
MainActivity
::
class
.
java
))
}
}
...
...
app/src/main/java/com/base/datarecovery/help/FileHelp.kt
View file @
7304dac9
...
@@ -78,4 +78,34 @@ object FileHelp {
...
@@ -78,4 +78,34 @@ object FileHelp {
}
}
return
data
return
data
}
}
fun
getDirFiles
(
folder
:
File
,
):
ArrayList
<
File
>
{
val
result
=
arrayListOf
<
File
>()
//添加第一层文件到链表
val
linkList
=
LinkedList
<
File
>()
folder
.
listFiles
()
?.
forEach
{
if
(
it
.
isDirectory
)
{
linkList
.
add
(
it
)
}
else
{
result
.
add
(
it
)
}
}
//链表取文件
var
tempFile
:
File
while
(!
linkList
.
isEmpty
())
{
tempFile
=
linkList
.
removeFirst
()
val
tempFileList
=
tempFile
.
listFiles
()
tempFileList
?.
forEach
{
if
(
it
.
isDirectory
)
{
linkList
.
add
(
it
)
}
else
{
result
.
add
(
it
)
}
}
}
return
result
}
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/help/KotlinExt.kt
View file @
7304dac9
...
@@ -28,4 +28,13 @@ object KotlinExt {
...
@@ -28,4 +28,13 @@ object KotlinExt {
fun
Long
.
toFormatTime
():
String
{
fun
Long
.
toFormatTime
():
String
{
return
SimpleDateFormat
(
"MMM dd,yyyy"
,
Locale
.
getDefault
()).
format
(
this
)
return
SimpleDateFormat
(
"MMM dd,yyyy"
,
Locale
.
getDefault
()).
format
(
this
)
}
}
fun
Array
<
String
>.
array2String
():
String
{
val
stringBuilder
=
StringBuilder
()
forEach
{
stringBuilder
.
append
(
it
)
}
return
stringBuilder
.
toString
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/datarecovery/utils/LogEx.kt
View file @
7304dac9
...
@@ -7,7 +7,8 @@ object LogEx {
...
@@ -7,7 +7,8 @@ object LogEx {
val
isOpen
=
true
val
isOpen
=
true
val
filterTAG
=
arrayOf
(
val
filterTAG
=
arrayOf
(
"FileScanActivity"
,
"FileScanActivity"
,
"FileHexEx"
"FileHexEx"
,
"FileGridAdapter"
)
)
fun
logDebug
(
tag
:
String
,
content
:
String
,
isMust
:
Boolean
=
false
)
{
fun
logDebug
(
tag
:
String
,
content
:
String
,
isMust
:
Boolean
=
false
)
{
...
...
app/src/main/java/com/base/datarecovery/view/AsteriskPasswordTransformationMethod.java
0 → 100644
View file @
7304dac9
package
com
.
base
.
datarecovery
.
view
;
import
android.text.method.PasswordTransformationMethod
;
import
android.view.View
;
import
androidx.annotation.NonNull
;
/**
* 必须制作单独的 java 文件,不懂为啥
*/
public
class
AsteriskPasswordTransformationMethod
extends
PasswordTransformationMethod
{
@Override
public
CharSequence
getTransformation
(
CharSequence
source
,
View
view
)
{
return
new
PasswordCharSequence
(
source
);
}
private
static
class
PasswordCharSequence
implements
CharSequence
{
private
final
CharSequence
mSource
;
public
PasswordCharSequence
(
CharSequence
source
)
{
mSource
=
source
;
// Store char sequence
}
public
char
charAt
(
int
index
)
{
return
'*'
;
// This is the important part
}
public
int
length
()
{
return
mSource
.
length
();
// Return default
}
@NonNull
public
CharSequence
subSequence
(
int
start
,
int
end
)
{
return
mSource
.
subSequence
(
start
,
end
);
// Return default
}
}
}
app/src/main/java/com/base/datarecovery/view/CustomDialog.kt
0 → 100644
View file @
7304dac9
package
com.base.datarecovery.view
import
android.app.Dialog
import
android.content.Context
import
android.view.Gravity
import
android.view.View
import
android.widget.TextView
class
CustomDialog
(
context
:
Context
,
layoutId
:
Int
)
:
Dialog
(
context
)
{
private
var
countdownText
:
TextView
?
=
null
init
{
setContentView
(
layoutId
)
val
window
=
window
window
?.
apply
{
setGravity
(
Gravity
.
CENTER
)
setBackgroundDrawableResource
(
android
.
R
.
color
.
transparent
)
}
setCancelable
(
false
)
}
fun
setButtonClickListener
(
viewId
:
Int
,
listener
:
()
->
Unit
)
{
val
button
=
findViewById
<
View
>(
viewId
)
as
?
TextView
button
?.
setOnClickListener
{
listener
.
invoke
()
}
}
fun
setCountdownText
(
viewId
:
Int
)
{
countdownText
=
findViewById
(
viewId
)
}
fun
updateCountdownText
(
seconds
:
String
)
{
countdownText
?.
text
=
seconds
}
}
app/src/main/java/com/base/datarecovery/view/DialogViews.kt
View file @
7304dac9
...
@@ -204,8 +204,13 @@ object DialogViews {
...
@@ -204,8 +204,13 @@ object DialogViews {
dialog
.
dismiss
()
dialog
.
dismiss
()
click
.
invoke
(
binding
.
ivSelector
.
isSelected
,
false
)
click
.
invoke
(
binding
.
ivSelector
.
isSelected
,
false
)
}
}
}
fun
Context
.
showPinReEnterDialog
():
CustomDialog
{
val
dialog
=
CustomDialog
(
this
,
R
.
layout
.
dialog_pin_re_enter
)
dialog
.
window
?.
setDimAmount
(
0f
)
dialog
.
show
()
return
dialog
}
}
}
}
app/src/main/res/drawable/bg_355bea_10.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<solid
android:color=
"#355BEA"
/>
<corners
android:radius=
"10dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_bebebe_10.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<solid
android:color=
"#BEBEBE"
/>
<corners
android:radius=
"10dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_border_pin.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<item
android:drawable=
"@drawable/bg_pin_normal"
android:state_selected=
"false"
/>
<item
android:drawable=
"@drawable/bg_pin_enable"
android:state_selected=
"true"
/>
</selector>
\ No newline at end of file
app/src/main/res/drawable/bg_border_pin_warm.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<stroke
android:width=
"1dp"
android:color=
"#FA020B"
/>
<corners
android:radius=
"15dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_button_enable_selector.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<item
android:drawable=
"@drawable/bg_355bea_10"
android:state_enabled=
"true"
/>
<item
android:drawable=
"@drawable/bg_bebebe_10"
android:state_enabled=
"false"
/>
</selector>
\ No newline at end of file
app/src/main/res/drawable/bg_pin_enable.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<stroke
android:width=
"1dp"
android:color=
"#1CC6FA"
/>
<corners
android:radius=
"15dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_pin_normal.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<stroke
android:width=
"1dp"
android:color=
"#B8B7BD"
/>
<corners
android:radius=
"15dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/circle_progress_bar.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<rotate
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:fromDegrees=
"0"
android:toDegrees=
"360"
>
<shape
android:innerRadiusRatio=
"3"
android:shape=
"ring"
android:thicknessRatio=
"7.0"
>
<size
android:height=
"48dp"
android:width=
"48dp"
/>
<gradient
android:centerColor=
"#355bea"
android:endColor=
"#355bea"
android:startColor=
"#355bea"
android:type=
"sweep"
android:useLevel=
"false"
/>
<stroke
android:width=
"3dp"
android:color=
"#FFFFFF"
/>
<corners
android:radius=
"3dp"
/>
</shape>
</rotate>
app/src/main/res/drawable/shape_splash_s.xml
View file @
7304dac9
...
@@ -2,23 +2,23 @@
...
@@ -2,23 +2,23 @@
<layer-list
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<layer-list
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<item
android:id=
"@android:id/background"
>
<item
android:id=
"@android:id/background"
>
<shape>
<shape>
<stroke
<!-- <stroke-->
android:width=
"1px"
<!-- android:width="1px"-->
android:color=
"#FF3835"
/>
<!-- android:color="#FF3835" />-->
<corners
android:radius=
"6dp"
/>
<solid
android:color=
"#E5E5E5"
/>
<corners
android:radius=
"10dp"
/>
</shape>
</shape>
</item>
</item>
<item
android:id=
"@android:id/progress"
<!-- android:bottom="3dp"-->
android:bottom=
"3dp"
<!-- android:end="3dp"-->
android:end=
"3dp"
<!-- android:start="3dp"-->
android:start=
"3dp"
<!-- android:top="3dp"-->
android:top=
"3dp
"
>
<item
android:id=
"@android:id/progress
"
>
<scale
android:scaleWidth=
"100%"
>
<scale
android:scaleWidth=
"100%"
>
<shape>
<shape>
<corners
android:radius=
"5dp"
/>
<corners
android:radius=
"10dp"
/>
<solid
android:color=
"#577DFD"
/>
<solid
android:color=
"#FF3835"
/>
</shape>
</shape>
</scale>
</scale>
</item>
</item>
...
...
app/src/main/res/layout/activity_privacy_import.xml
View file @
7304dac9
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#F4F4F6"
android:background=
"#F4F4F6"
android:orientation=
"vertical"
android:orientation=
"vertical"
tools:context=
".activity.PrivacyImportActivity"
>
tools:context=
".activity.
privacyspace.
PrivacyImportActivity"
>
<View
<View
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
...
...
app/src/main/res/layout/activity_privacy_pin_one.xml
0 → 100644
View file @
7304dac9
<?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:id=
"@+id/main"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
tools:context=
".activity.privacyspace.PrivacyPinOneActivity"
>
<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=
"18dp"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/v_top"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/quit"
tools:ignore=
"ContentDescription"
/>
</FrameLayout>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:text=
"Please enter PlN"
android:textSize=
"18sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"8dp"
android:clickable=
"true"
android:focusable=
"true"
android:orientation=
"horizontal"
>
<FrameLayout
android:id=
"@+id/fl_1"
android:layout_width=
"60dp"
android:layout_height=
"60dp"
android:layout_margin=
"8dp"
android:background=
"@drawable/bg_border_pin"
>
<EditText
android:id=
"@+id/edit_1"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"@null"
android:gravity=
"center"
android:inputType=
"numberPassword"
android:maxLength=
"1"
android:textColor=
"@color/black"
android:textSize=
"20sp"
tools:ignore=
"Autofill,LabelFor"
tools:text=
"1"
/>
</FrameLayout>
<FrameLayout
android:id=
"@+id/fl_2"
android:layout_width=
"60dp"
android:layout_height=
"60dp"
android:layout_margin=
"8dp"
android:background=
"@drawable/bg_border_pin"
android:clickable=
"true"
android:focusable=
"true"
>
<EditText
android:id=
"@+id/edit_2"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"@null"
android:gravity=
"center"
android:inputType=
"numberPassword"
android:maxLength=
"1"
android:textColor=
"@color/black"
android:textSize=
"20sp"
tools:ignore=
"Autofill,LabelFor"
tools:text=
"1"
/>
</FrameLayout>
<FrameLayout
android:id=
"@+id/fl_3"
android:layout_width=
"60dp"
android:layout_height=
"60dp"
android:layout_margin=
"8dp"
android:background=
"@drawable/bg_border_pin"
android:clickable=
"true"
android:focusable=
"true"
>
<EditText
android:id=
"@+id/edit_3"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"@null"
android:gravity=
"center"
android:inputType=
"numberPassword"
android:maxLength=
"1"
android:textColor=
"@color/black"
android:textSize=
"20sp"
tools:ignore=
"Autofill,LabelFor"
tools:text=
"1"
/>
</FrameLayout>
<FrameLayout
android:id=
"@+id/fl_4"
android:layout_width=
"60dp"
android:layout_height=
"60dp"
android:layout_margin=
"8dp"
android:background=
"@drawable/bg_border_pin"
android:clickable=
"true"
android:focusable=
"true"
>
<EditText
android:id=
"@+id/edit_4"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"@null"
android:gravity=
"center"
android:inputType=
"numberPassword"
android:maxLength=
"1"
android:textColor=
"@color/black"
android:textSize=
"20sp"
tools:ignore=
"Autofill,LabelFor"
tools:text=
"1"
/>
</FrameLayout>
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/activity_privacy_pin_two.xml
0 → 100644
View file @
7304dac9
<?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:id=
"@+id/main"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
tools:context=
".activity.privacyspace.PrivacyPinOneActivity"
>
<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=
"18dp"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/v_top"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/quit"
tools:ignore=
"ContentDescription"
/>
</FrameLayout>
<LinearLayout
android:id=
"@+id/ll_input"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:text=
"Please confirm PIN"
android:textSize=
"18sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"8dp"
android:clickable=
"true"
android:focusable=
"true"
android:orientation=
"horizontal"
>
<FrameLayout
android:id=
"@+id/fl_1"
android:layout_width=
"60dp"
android:layout_height=
"60dp"
android:layout_margin=
"8dp"
android:background=
"@drawable/bg_border_pin"
>
<EditText
android:id=
"@+id/edit_1"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"@null"
android:gravity=
"center"
android:inputType=
"numberPassword"
android:maxLength=
"1"
android:textColor=
"@color/black"
android:textSize=
"20sp"
tools:ignore=
"Autofill,LabelFor"
tools:text=
"1"
/>
</FrameLayout>
<FrameLayout
android:id=
"@+id/fl_2"
android:layout_width=
"60dp"
android:layout_height=
"60dp"
android:layout_margin=
"8dp"
android:background=
"@drawable/bg_border_pin"
android:clickable=
"true"
android:focusable=
"true"
>
<EditText
android:id=
"@+id/edit_2"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"@null"
android:gravity=
"center"
android:inputType=
"numberPassword"
android:maxLength=
"1"
android:textColor=
"@color/black"
android:textSize=
"20sp"
tools:ignore=
"Autofill,LabelFor"
tools:text=
"1"
/>
</FrameLayout>
<FrameLayout
android:id=
"@+id/fl_3"
android:layout_width=
"60dp"
android:layout_height=
"60dp"
android:layout_margin=
"8dp"
android:background=
"@drawable/bg_border_pin"
android:clickable=
"true"
android:focusable=
"true"
>
<EditText
android:id=
"@+id/edit_3"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"@null"
android:gravity=
"center"
android:inputType=
"numberPassword"
android:maxLength=
"1"
android:textColor=
"@color/black"
android:textSize=
"20sp"
tools:ignore=
"Autofill,LabelFor"
tools:text=
"1"
/>
</FrameLayout>
<FrameLayout
android:id=
"@+id/fl_4"
android:layout_width=
"60dp"
android:layout_height=
"60dp"
android:layout_margin=
"8dp"
android:background=
"@drawable/bg_border_pin"
android:clickable=
"true"
android:focusable=
"true"
>
<EditText
android:id=
"@+id/edit_4"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"@null"
android:gravity=
"center"
android:inputType=
"numberPassword"
android:maxLength=
"1"
android:textColor=
"@color/black"
android:textSize=
"20sp"
tools:ignore=
"Autofill,LabelFor"
tools:text=
"1"
/>
</FrameLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:visibility=
"gone"
android:id=
"@+id/ll_remember_tip"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:src=
"@mipmap/shezhimimaicon"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"48dp"
android:text=
"Remember your PIN"
android:textColor=
"@color/black"
android:textSize=
"18sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"15dp"
android:gravity=
"center"
android:text=
"Secret space can't be opened again if you \nforget the PlN"
android:textColor=
"#666666"
android:textSize=
"15sp"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/activity_privacy_space.xml
View file @
7304dac9
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#F2F2F4"
android:background=
"#F2F2F4"
android:orientation=
"vertical"
android:orientation=
"vertical"
tools:context=
".activity.PrivacySpaceActivity"
>
tools:context=
".activity.
privacyspace.
PrivacySpaceActivity"
>
<View
<View
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
...
@@ -26,55 +26,68 @@
...
@@ -26,55 +26,68 @@
tools:ignore=
"ContentDescription"
/>
tools:ignore=
"ContentDescription"
/>
</FrameLayout>
</FrameLayout>
<FrameLayout
android:id=
"@+id/fl_tip"
<LinearLayout
android:id=
"@+id/ll_tip"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"#F5EEDE"
android:orientation=
"horizontal"
android:paddingVertical=
"16dp"
tools:ignore=
"UselessParent"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"20dp"
android:src=
"@mipmap/tishi"
tools:ignore=
"ContentDescription,MissingPrefix"
/>
<LinearLayout
<LinearLayout
android:id=
"@+id/ll_uninstall_tip"
android:layout_width=
"0dp"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"85dp"
android:layout_gravity=
"center_vertical"
android:layout_gravity=
"center"
android:layout_marginStart=
"8dp"
android:background=
"#F5EEDE"
android:layout_weight=
"1"
android:orientation=
"horizontal"
android:orientation=
"vertical"
>
tools:ignore=
"UselessParent"
>
<ImageView
<TextView
android:id=
"@+id/tv_pin_tip"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:text=
"Protect your private photos adnd videos by creating PIN"
android:layout_marginStart=
"20dp"
tools:ignore=
"HardcodedText"
/>
android:src=
"@mipmap/tishi"
tools:ignore=
"ContentDescription,MissingPrefix"
/>
<TextView
<TextView
android:layout_width=
"0dp"
android:id=
"@+id/tv_uninstall_tip"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_gravity=
"center_vertical"
android:layout_margin
Start
=
"8dp"
android:layout_margin
Top
=
"8dp"
android:layout_marginEnd=
"16dp"
android:layout_marginEnd=
"16dp"
android:layout_weight=
"1"
android:text=
"If you uninstall the app or clear the app data, the content of Secret Space may be lost"
android:text=
"If you uninstall the app or clear the app data, the content of Secret Space may be lost"
tools:ignore=
"HardcodedText"
/>
tools:ignore=
"HardcodedText"
/>
<TextView
android:id=
"@+id/tv_go_it"
android:layout_width=
"85dp"
android:layout_height=
"35dp"
android:layout_gravity=
"center_vertical"
android:layout_marginEnd=
"24dp"
android:background=
"@drawable/bg_577dfd_17_5"
android:gravity=
"center"
android:text=
"Got it"
android:textColor=
"@color/white"
android:textSize=
"15sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
<TextView
android:id=
"@+id/tv_go_or_setting"
android:layout_width=
"85dp"
android:layout_height=
"35dp"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"8dp"
android:layout_marginEnd=
"24dp"
android:background=
"@drawable/bg_577dfd_17_5"
android:gravity=
"center"
android:text=
"Got it"
android:textColor=
"@color/white"
android:textSize=
"15sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
<LinearLayout
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
...
...
app/src/main/res/layout/activity_screen_shot.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
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"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#F4F5F9"
android:orientation=
"vertical"
tools:ignore=
"UselessParent"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@color/white"
>
<FrameLayout
android:id=
"@+id/fl_back"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"20dp"
android:padding=
"8dp"
app:layout_constraintBottom_toBottomOf=
"@id/tv_title"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"@id/tv_title"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/fanhui"
android:tint=
"@color/black"
tools:ignore=
"ContentDescription,UseAppTint"
/>
</FrameLayout>
<TextView
android:id=
"@+id/tv_title"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Screenshot Cleaner"
android:textSize=
"19sp"
android:textStyle=
"bold"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintVertical_bias=
"0.1"
tools:ignore=
"HardcodedText"
/>
<FrameLayout
android:id=
"@+id/fl_recycle_bin"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"20dp"
android:layout_marginEnd=
"16dp"
android:padding=
"8dp"
android:visibility=
"gone"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintVertical_bias=
"0.3"
/>
<LinearLayout
android:id=
"@+id/ll_size"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"16dp"
android:layout_marginTop=
"20dp"
android:orientation=
"horizontal"
app:layout_constraintEnd_toEndOf=
"@id/tv_title"
app:layout_constraintStart_toStartOf=
"@id/tv_title"
app:layout_constraintTop_toBottomOf=
"@id/tv_title"
>
<TextView
android:id=
"@+id/tv_size"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:textColor=
"@color/theme_color"
android:textSize=
"40sp"
android:textStyle=
"bold"
tools:text=
"90.1"
/>
<TextView
android:id=
"@+id/tv_unit"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"start"
android:includeFontPadding=
"false"
android:textColor=
"@color/theme_color"
android:textSize=
"16sp"
tools:text=
"MB"
/>
</LinearLayout>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"12dp"
android:layout_marginBottom=
"30dp"
android:text=
"Screenshots totally"
android:textColor=
"#666666"
android:textSize=
"15sp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"@id/tv_title"
app:layout_constraintStart_toStartOf=
"@id/tv_title"
app:layout_constraintTop_toBottomOf=
"@id/ll_size"
tools:ignore=
"HardcodedText"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_weight=
"1"
app:layoutManager=
"androidx.recyclerview.widget.LinearLayoutManager"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"80dp"
>
<LinearLayout
android:id=
"@+id/ll_select_all"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"30dp"
android:orientation=
"vertical"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:minWidth=
"23dp"
android:minHeight=
"23dp"
android:src=
"@drawable/bg_square_selector"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Select All"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
<TextView
android:id=
"@+id/tv_clean"
android:layout_width=
"266dp"
android:layout_height=
"50dp"
android:background=
"@drawable/bg_button_enable_selector"
android:enabled=
"false"
android:gravity=
"center"
android:text=
"CLEAN"
android:textColor=
"@color/white"
android:textSize=
"19sp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toEndOf=
"@id/ll_select_all"
app:layout_constraintTop_toTopOf=
"parent"
tools:ignore=
"HardcodedText"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
app/src/main/res/layout/activity_splash.xml
View file @
7304dac9
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
android:id=
"@+id/pb"
android:id=
"@+id/pb"
style=
"@style/Widget.AppCompat.ProgressBar.Horizontal"
style=
"@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"1
5
dp"
android:layout_height=
"1
0
dp"
android:layout_marginHorizontal=
"32dp"
android:layout_marginHorizontal=
"32dp"
android:layout_marginTop=
"5dp"
android:layout_marginTop=
"5dp"
android:max=
"100"
android:max=
"100"
...
...
app/src/main/res/layout/activity_whats_app_cleaner.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
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=
"#F4F5F9"
android:orientation=
"vertical"
tools:context=
".activity.whatsapp.WhatsAppCleanerActivity"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
tools:ignore=
"UselessParent"
>
<View
android:layout_width=
"match_parent"
android:layout_height=
"40dp"
android:background=
"@color/white"
/>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@color/white"
>
<FrameLayout
android:id=
"@+id/fl_back"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:padding=
"15dp"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/fanhui"
android:tint=
"@color/black"
tools:ignore=
"ContentDescription,UseAppTint"
/>
</FrameLayout>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:text=
"WhatsApp Cleaner"
android:textColor=
"@color/black"
android:textSize=
"19sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
</FrameLayout>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@color/white"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:layout_marginVertical=
"25dp"
android:orientation=
"vertical"
tools:ignore=
"UselessParent"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:id=
"@+id/tv_size"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:textColor=
"#4772FF"
android:textSize=
"45sp"
android:textStyle=
"bold"
tools:text=
"108.7"
/>
<TextView
android:id=
"@+id/tv_unit"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"start"
android:layout_marginStart=
"8dp"
android:textColor=
"#4772FF"
android:textSize=
"12sp"
android:textStyle=
"bold"
tools:text=
"KB"
/>
</LinearLayout>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"14dp"
android:text=
"Cleanable"
android:textColor=
"#666666"
android:textSize=
"15sp"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
</FrameLayout>
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_marginTop=
"16dp"
android:layout_weight=
"1"
android:background=
"@color/white"
android:paddingVertical=
"8dp"
app:layoutManager=
"androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem=
"@layout/item_whatsapp"
/>
<FrameLayout
android:id=
"@+id/fl_ad"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"top"
/>
<TextView
android:id=
"@+id/tv_tv_got_it"
android:layout_width=
"match_parent"
android:layout_height=
"48dp"
android:layout_marginHorizontal=
"40dp"
android:layout_marginVertical=
"20dp"
android:gravity=
"center"
android:text=
"Got it"
android:textColor=
"@color/white"
android:textSize=
"18sp"
android:textStyle=
"bold"
android:background=
"@drawable/bg_355bea_10"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
app/src/main/res/layout/activity_whats_app_message_clean.xml
0 → 100644
View file @
7304dac9
<?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:id=
"@+id/main"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#F4F5F9"
android:orientation=
"vertical"
tools:context=
".activity.whatsapp.WhatsAppMessageCleanActivity"
>
<View
android:layout_width=
"match_parent"
android:layout_height=
"40dp"
android:background=
"@color/white"
/>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@color/white"
>
<FrameLayout
android:id=
"@+id/fl_back"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:padding=
"15dp"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/fanhui"
android:tint=
"@color/black"
tools:ignore=
"ContentDescription,UseAppTint"
/>
</FrameLayout>
<TextView
android:id=
"@+id/tv_title"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:textColor=
"@color/black"
android:textSize=
"19sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
tools:text=
"Image Messages"
/>
</FrameLayout>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@color/white"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:layout_marginVertical=
"25dp"
android:orientation=
"vertical"
tools:ignore=
"UselessParent"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:id=
"@+id/tv_size"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"0"
android:textColor=
"#4772FF"
android:textSize=
"45sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<TextView
android:id=
"@+id/tv_unit"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"start"
android:layout_marginStart=
"8dp"
android:text=
"KB"
android:textColor=
"#4772FF"
android:textSize=
"12sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"14dp"
android:text=
"Cleanable"
android:textColor=
"#666666"
android:textSize=
"15sp"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
</FrameLayout>
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_marginTop=
"16dp"
android:layout_weight=
"1"
android:background=
"@color/white"
tools:listitem=
"@layout/item_media_select"
/>
<FrameLayout
android:id=
"@+id/fl_ad"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"80dp"
android:background=
"@color/white"
>
<LinearLayout
android:id=
"@+id/ll_select_all"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"30dp"
android:orientation=
"vertical"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:minWidth=
"23dp"
android:minHeight=
"23dp"
android:src=
"@drawable/bg_square_selector"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Select All"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
<TextView
android:id=
"@+id/tv_clean"
android:layout_width=
"266dp"
android:layout_height=
"50dp"
android:background=
"@drawable/bg_button_enable_selector"
android:enabled=
"false"
android:gravity=
"center"
android:text=
"CLEAN"
android:textColor=
"@color/white"
android:textSize=
"19sp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toEndOf=
"@id/ll_select_all"
app:layout_constraintTop_toTopOf=
"parent"
tools:ignore=
"HardcodedText"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
\ No newline at end of file
app/src/main/res/layout/dialog_ad_loading.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"90dp"
android:background=
"@drawable/bg_ffffff_10"
android:gravity=
"center"
android:orientation=
"horizontal"
>
<ProgressBar
android:id=
"@+id/progressBar"
style=
"?android:attr/progressBarStyle"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"18dp"
android:indeterminate=
"true"
android:indeterminateDrawable=
"@drawable/circle_progress_bar"
/>
<TextView
android:id=
"@+id/dialog_ad_loading_text"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"11dp"
android:layout_marginEnd=
"18dp"
android:text=
"Advertising in preparation..."
android:textColor=
"#ff000000"
android:textSize=
"14sp"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
app/src/main/res/layout/dialog_pin_re_enter.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
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=
"250dp"
android:layout_height=
"80dp"
app:cardBackgroundColor=
"@color/black"
app:cardCornerRadius=
"15dp"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:layout_margin=
"20dp"
android:gravity=
"center"
android:text=
"Password does not match,\nplease re-enter"
android:textColor=
"@color/white"
android:textSize=
"15sp"
tools:ignore=
"HardcodedText"
/>
</androidx.cardview.widget.CardView>
\ No newline at end of file
app/src/main/res/layout/fragment_home.xml
View file @
7304dac9
...
@@ -171,6 +171,8 @@
...
@@ -171,6 +171,8 @@
android:layout_height=
"70dp"
android:layout_height=
"70dp"
android:layout_marginHorizontal=
"8dp"
android:layout_marginHorizontal=
"8dp"
android:layout_weight=
"1"
android:layout_weight=
"1"
android:clickable=
"true"
android:focusable=
"true"
app:cardBackgroundColor=
"#F8F8F8"
app:cardBackgroundColor=
"#F8F8F8"
app:cardCornerRadius=
"10dp"
app:cardCornerRadius=
"10dp"
app:cardElevation=
"0dp"
>
app:cardElevation=
"0dp"
>
...
@@ -254,10 +256,13 @@
...
@@ -254,10 +256,13 @@
</androidx.cardview.widget.CardView>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
<androidx.cardview.widget.CardView
android:id=
"@+id/card_screenshot"
android:layout_width=
"0dp"
android:layout_width=
"0dp"
android:layout_height=
"70dp"
android:layout_height=
"70dp"
android:layout_marginHorizontal=
"8dp"
android:layout_marginHorizontal=
"8dp"
android:layout_weight=
"1"
android:layout_weight=
"1"
android:clickable=
"true"
android:focusable=
"true"
app:cardBackgroundColor=
"#F8F8F8"
app:cardBackgroundColor=
"#F8F8F8"
app:cardCornerRadius=
"10dp"
app:cardCornerRadius=
"10dp"
app:cardElevation=
"0dp"
>
app:cardElevation=
"0dp"
>
...
...
app/src/main/res/layout/item_media_file.xml
0 → 100644
View file @
7304dac9
<?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_toStartOf=
"@id/fl_select"
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:singleLine=
"true"
android:textColor=
"#333333"
android:textSize=
"15sp"
tools:text=
"VID_20240210_200748.mp3"
/>
<TextView
android:id=
"@+id/tv_size"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"8dp"
android:textColor=
"#999999"
android:textSize=
"14sp"
tools:text=
"8.7 MB"
/>
</LinearLayout>
<FrameLayout
android:id=
"@+id/fl_select"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:padding=
"10dp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<ImageView
android:id=
"@+id/iv_selector"
android:layout_width=
"24dp"
android:layout_height=
"24dp"
android:background=
"@drawable/bg_circle_selector"
tools:ignore=
"ContentDescription"
/>
</FrameLayout>
<View
android:layout_width=
"0dp"
android:layout_height=
"1dp"
android:layout_marginTop=
"12dp"
android:layout_marginEnd=
"10dp"
android:background=
"#F4F4F4"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"@id/fl_select"
app:layout_constraintStart_toStartOf=
"@id/ll"
app:layout_constraintTop_toBottomOf=
"@id/ll"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/item_media_select.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
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=
"109dp"
android:layout_height=
"109dp"
android:layout_margin=
"8dp"
app:cardCornerRadius=
"5dp"
app:cardElevation=
"0dp"
>
<ImageView
android:id=
"@+id/iv"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:ignore=
"ContentDescription"
/>
<ImageView
android:id=
"@+id/iv_selector"
android:layout_width=
"25dp"
android:layout_height=
"25dp"
android:layout_gravity=
"end"
android:layout_margin=
"10dp"
android:src=
"@drawable/bg_circle_selector"
tools:ignore=
"ContentDescription"
/>
</androidx.cardview.widget.CardView>
\ No newline at end of file
app/src/main/res/layout/item_screen_photo.xml
0 → 100644
View file @
7304dac9
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
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=
"0dp"
android:layout_weight=
"1"
android:layout_columnWeight=
"1"
android:layout_height=
"109dp"
android:layout_margin=
"4dp"
app:cardCornerRadius=
"5dp"
>
<ImageView
android:id=
"@+id/iv"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:ignore=
"ContentDescription"
/>
<ImageView
android:id=
"@+id/iv_selector"
android:layout_width=
"25dp"
android:layout_height=
"25dp"
android:layout_gravity=
"end"
android:layout_margin=
"5dp"
android:importantForAccessibility=
"no"
android:src=
"@drawable/bg_circle_selector"
/>
</androidx.cardview.widget.CardView>
app/src/main/res/layout/item_screenshot.xml
0 → 100644
View file @
7304dac9
<?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=
"wrap_content"
android:layout_margin=
"15dp"
android:orientation=
"vertical"
>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
tools:ignore=
"UselessParent"
>
<TextView
android:id=
"@+id/tv_time"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical|start"
android:textColor=
"@color/black"
android:textSize=
"15sp"
tools:ignore=
"HardcodedText"
tools:text=
"3024/06"
/>
<TextView
android:id=
"@+id/tv_select_all"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical|end"
android:text=
"SELECT ALL"
android:textColor=
"@color/theme_color"
android:textSize=
"15sp"
tools:ignore=
"HardcodedText"
/>
</FrameLayout>
<GridLayout
android:id=
"@+id/group"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"8dp"
android:columnCount=
"3"
/>
</LinearLayout>
\ No newline at end of file
app/src/main/res/layout/item_whatsapp.xml
0 → 100644
View file @
7304dac9
<?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=
"16dp"
android:layout_marginVertical=
"8dp"
android:orientation=
"vertical"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<ImageView
android:id=
"@+id/iv"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
tools:ignore=
"ContentDescription"
tools:src=
"@mipmap/audiomessages"
/>
<LinearLayout
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"8dp"
android:layout_weight=
"1"
android:orientation=
"vertical"
>
<TextView
android:id=
"@+id/tv_title"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Video Messages"
android:textColor=
"@color/black"
android:textSize=
"15sp"
tools:ignore=
"HardcodedText"
/>
<TextView
android:id=
"@+id/tv_no_message"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"5dp"
android:text=
"No video messages found."
android:textColor=
"#999999"
android:textSize=
"12sp"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
<TextView
android:id=
"@+id/tv_size"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:text=
"0 KB"
android:textColor=
"#999999"
android:textSize=
"14sp"
tools:ignore=
"HardcodedText"
/>
<ImageView
android:id=
"@+id/iv_arrow"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"5dp"
android:src=
"@mipmap/jianotu_whatsapp"
tools:ignore=
"ContentDescription"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"55dp"
android:orientation=
"vertical"
>
<LinearLayout
android:id=
"@+id/ll_iv"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:paddingTop=
"12dp"
android:visibility=
"gone"
>
<ImageView
android:id=
"@+id/iv_1"
android:layout_width=
"90dp"
android:layout_height=
"90dp"
tools:ignore=
"ContentDescription"
/>
<ImageView
android:id=
"@+id/iv_2"
android:layout_width=
"90dp"
android:layout_height=
"90dp"
android:layout_marginStart=
"12dp"
tools:ignore=
"ContentDescription"
/>
<ImageView
android:id=
"@+id/iv_3"
android:layout_width=
"90dp"
android:layout_height=
"90dp"
android:layout_marginStart=
"12dp"
tools:ignore=
"ContentDescription"
/>
</LinearLayout>
<View
android:layout_width=
"match_parent"
android:layout_height=
"1px"
android:layout_marginTop=
"16dp"
android:background=
"#EEEEEE"
/>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
app/src/main/res/mipmap-hdpi/imagemessages.png
0 → 100644
View file @
7304dac9
3.72 KB
app/src/main/res/mipmap-hdpi/jianotu_whatsapp.png
0 → 100644
View file @
7304dac9
1.15 KB
app/src/main/res/mipmap-hdpi/jianotul_whatsapp.png
0 → 100644
View file @
7304dac9
1.23 KB
app/src/main/res/mipmap-xxhdpi/audiomessages.png
0 → 100644
View file @
7304dac9
4.6 KB
app/src/main/res/mipmap-xxhdpi/logo.png
0 → 100644
View file @
7304dac9
72.6 KB
app/src/main/res/mipmap-xxhdpi/qdylogo.png
View replaced file @
b8601506
View file @
7304dac9
39.5 KB
|
W:
|
H:
34.2 KB
|
W:
|
H:
2-up
Swipe
Onion skin
app/src/main/res/mipmap-xxhdpi/shezhimimaicon.png
0 → 100644
View file @
7304dac9
10 KB
app/src/main/res/mipmap-xxhdpi/videomessages.png
0 → 100644
View file @
7304dac9
4.24 KB
app/src/main/res/values/colors.xml
View file @
7304dac9
...
@@ -3,4 +3,6 @@
...
@@ -3,4 +3,6 @@
<color
name=
"black"
>
#FF000000
</color>
<color
name=
"black"
>
#FF000000
</color>
<color
name=
"white"
>
#FFFFFFFF
</color>
<color
name=
"white"
>
#FFFFFFFF
</color>
<color
name=
"color_747474"
>
#747474
</color>
<color
name=
"color_747474"
>
#747474
</color>
<color
name=
"color_fa020b"
>
#FA020B
</color>
<color
name=
"theme_color"
>
#50B3FA
</color>
</resources>
</resources>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
7304dac9
<resources>
<resources>
<string
name=
"app_name"
>
Data
Recovery
</string>
<string
name=
"app_name"
>
File
Recovery
</string>
<!-- TODO: Remove or change this placeholder text -->
<!-- TODO: Remove or change this placeholder text -->
<string
name=
"hello_blank_fragment"
>
Hello blank fragment
</string>
<string
name=
"hello_blank_fragment"
>
Hello blank fragment
</string>
<string
name=
"facebook_app_id"
>
11
</string>
<string
name=
"facebook_app_id"
>
11
</string>
...
...
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