Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
A
appzxhy
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
appzxhy
Commits
d00f1ecb
Commit
d00f1ecb
authored
Jun 10, 2025
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
5d17874e
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
34 changed files
with
2085 additions
and
2548 deletions
+2085
-2548
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+7
-20
BaseActivity.kt
app/src/main/java/com/base/appzxhy/base/BaseActivity.kt
+0
-31
FolderBean.kt
...rc/main/java/com/base/appzxhy/bean/recovery/FolderBean.kt
+10
-10
RecoveryBean.kt
.../main/java/com/base/appzxhy/bean/recovery/RecoveryBean.kt
+53
-53
RecoveryFilterBean.kt
...java/com/base/appzxhy/bean/recovery/RecoveryFilterBean.kt
+7
-7
LanguageActivity.kt
...ain/java/com/base/appzxhy/ui/language/LanguageActivity.kt
+16
-0
Home2Fragment.kt
app/src/main/java/com/base/appzxhy/ui/main/Home2Fragment.kt
+0
-99
HomeFragment.kt
app/src/main/java/com/base/appzxhy/ui/main/HomeFragment.kt
+2
-69
MainActivity.kt
app/src/main/java/com/base/appzxhy/ui/main/MainActivity.kt
+2
-172
MainViewModel.kt
app/src/main/java/com/base/appzxhy/ui/main/MainViewModel.kt
+0
-11
RecoveryFragment.kt
...rc/main/java/com/base/appzxhy/ui/main/RecoveryFragment.kt
+46
-46
FileFolderAdapter.kt
...in/java/com/base/appzxhy/ui/recovery/FileFolderAdapter.kt
+116
-116
FileHexEx.kt
app/src/main/java/com/base/appzxhy/ui/recovery/FileHexEx.kt
+187
-187
FileRecoveredActivity.kt
...ava/com/base/appzxhy/ui/recovery/FileRecoveredActivity.kt
+75
-75
FileRecoveryActivity.kt
...java/com/base/appzxhy/ui/recovery/FileRecoveryActivity.kt
+363
-363
FileScanDialog.kt
.../main/java/com/base/appzxhy/ui/recovery/FileScanDialog.kt
+92
-92
FileScanResultActivity.kt
...va/com/base/appzxhy/ui/recovery/FileScanResultActivity.kt
+382
-382
FileTimeColumnsAdapter.kt
...va/com/base/appzxhy/ui/recovery/FileTimeColumnsAdapter.kt
+275
-275
RecoveringDialog.kt
...ain/java/com/base/appzxhy/ui/recovery/RecoveringDialog.kt
+97
-97
RecoveryFilterAdapter.kt
...ava/com/base/appzxhy/ui/recovery/RecoveryFilterAdapter.kt
+61
-61
RecycleBinAdapter.kt
.../java/com/base/appzxhy/ui/recyclebin/RecycleBinAdapter.kt
+45
-45
RecycleBinDetailActivity.kt
...om/base/appzxhy/ui/recyclebin/RecycleBinDetailActivity.kt
+96
-96
RecycleBinFragment.kt
...java/com/base/appzxhy/ui/recyclebin/RecycleBinFragment.kt
+38
-38
RecycleBinUtils.kt
...in/java/com/base/appzxhy/ui/recyclebin/RecycleBinUtils.kt
+74
-74
SimilarPhotosActivity.kt
...java/com/base/appzxhy/ui/similar/SimilarPhotosActivity.kt
+0
-3
SplashActivity.kt
...rc/main/java/com/base/appzxhy/ui/splash/SplashActivity.kt
+0
-2
bg_splash_button.xml
app/src/main/res/drawable/bg_splash_button.xml
+2
-2
activity_language.xml
app/src/main/res/layout/activity_language.xml
+17
-0
activity_main.xml
app/src/main/res/layout/activity_main.xml
+5
-38
fragment_home.xml
app/src/main/res/layout/fragment_home.xml
+1
-82
fragment_home3.xml
app/src/main/res/layout/fragment_home3.xml
+14
-0
logo.png
app/src/main/res/mipmap-xxhdpi/logo.png
+0
-0
colors.xml
app/src/main/res/values/colors.xml
+1
-1
strings.xml
app/src/main/res/values/strings.xml
+1
-1
No files found.
app/src/main/AndroidManifest.xml
View file @
d00f1ecb
...
@@ -29,9 +29,8 @@
...
@@ -29,9 +29,8 @@
android:supportsRtl=
"true"
android:supportsRtl=
"true"
android:theme=
"@style/Theme.AppTheme"
android:theme=
"@style/Theme.AppTheme"
tools:targetApi=
"31"
>
tools:targetApi=
"31"
>
<activity
android:name=
".ui.TestActivity"
android:exported=
"false"
/>
<activity
<activity
android:name=
".ui.splash.SplashActivity"
android:name=
".ui.splash.SplashActivity"
android:exported=
"true"
android:exported=
"true"
...
@@ -49,6 +48,11 @@
...
@@ -49,6 +48,11 @@
android:exported=
"false"
android:exported=
"false"
android:screenOrientation=
"portrait"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".ui.language.LanguageActivity"
android:exported=
"false"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
<activity
android:name=
".ui.guide.GuideActivity"
android:name=
".ui.guide.GuideActivity"
android:exported=
"false"
android:exported=
"false"
...
@@ -93,18 +97,6 @@
...
@@ -93,18 +97,6 @@
android:exported=
"false"
android:exported=
"false"
android:screenOrientation=
"portrait"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".ui.recovery.FileScanResultActivity"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".ui.recovery.FileRecoveredActivity"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".ui.recovery.FileRecoveryActivity"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
<activity
android:name=
".ui.set.SettingActivity"
android:name=
".ui.set.SettingActivity"
android:exported=
"false"
android:exported=
"false"
...
@@ -115,11 +107,6 @@
...
@@ -115,11 +107,6 @@
android:exported=
"false"
android:exported=
"false"
android:screenOrientation=
"portrait"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".ui.recyclebin.RecycleBinDetailActivity"
android:exported=
"false"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<provider
<provider
android:name=
"androidx.core.content.FileProvider"
android:name=
"androidx.core.content.FileProvider"
...
...
app/src/main/java/com/base/appzxhy/base/BaseActivity.kt
View file @
d00f1ecb
...
@@ -33,7 +33,6 @@ import com.base.appzxhy.SpConstObject.appLanguageCountrySp
...
@@ -33,7 +33,6 @@ import com.base.appzxhy.SpConstObject.appLanguageCountrySp
import
com.base.appzxhy.SpConstObject.appLanguageSp
import
com.base.appzxhy.SpConstObject.appLanguageSp
import
com.base.appzxhy.R
import
com.base.appzxhy.R
import
com.base.appzxhy.SpConstObject.cleanedSize
import
com.base.appzxhy.SpConstObject.cleanedSize
import
com.base.appzxhy.base.goToAc
import
com.base.appzxhy.bean.FeatureBean.Companion.BATTERY_INFO
import
com.base.appzxhy.bean.FeatureBean.Companion.BATTERY_INFO
import
com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
import
com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
import
com.base.appzxhy.bean.FeatureBean.Companion.LARGE_FILE_CLEAN
import
com.base.appzxhy.bean.FeatureBean.Companion.LARGE_FILE_CLEAN
...
@@ -56,12 +55,6 @@ import com.base.appzxhy.ui.dialog.FunctionBackDialog
...
@@ -56,12 +55,6 @@ import com.base.appzxhy.ui.dialog.FunctionBackDialog
import
com.base.appzxhy.ui.largefile.LargeFileCleanActivity
import
com.base.appzxhy.ui.largefile.LargeFileCleanActivity
import
com.base.appzxhy.ui.main.MainActivity
import
com.base.appzxhy.ui.main.MainActivity
import
com.base.appzxhy.ui.photocompression.PhotoCompressionActivity
import
com.base.appzxhy.ui.photocompression.PhotoCompressionActivity
import
com.base.appzxhy.ui.recovery.FileScanResultActivity
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_AUDIOS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_DOCUMENTS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils
import
com.base.appzxhy.ui.screenshot.ScreenshotCleanActivity
import
com.base.appzxhy.ui.screenshot.ScreenshotCleanActivity
import
com.base.appzxhy.ui.similar.SimilarPhotosActivity
import
com.base.appzxhy.ui.similar.SimilarPhotosActivity
import
com.base.appzxhy.utils.ActivityLauncher
import
com.base.appzxhy.utils.ActivityLauncher
...
@@ -462,29 +455,6 @@ fun Activity.jumpAction(key: String) {
...
@@ -462,29 +455,6 @@ fun Activity.jumpAction(key: String) {
goToAc
(
PhotoCompressionActivity
::
class
.
java
)
goToAc
(
PhotoCompressionActivity
::
class
.
java
)
}
}
RECOVERY_PHOTOS
->
{
goToAc
(
FileScanResultActivity
::
class
.
java
,
exb
=
{
putExtra
(
"ScanType"
,
SCAN_PHOTOS
)
})
}
RECOVERY_VIDEOS
->
{
goToAc
(
FileScanResultActivity
::
class
.
java
,
exb
=
{
putExtra
(
"ScanType"
,
SCAN_VIDEOS
)
})
}
RECOVERY_DOCUMENTS
->
{
goToAc
(
FileScanResultActivity
::
class
.
java
,
exb
=
{
putExtra
(
"ScanType"
,
SCAN_DOCUMENTS
)
})
}
RECOVERY_AUDIOS
->
{
goToAc
(
FileScanResultActivity
::
class
.
java
,
exb
=
{
putExtra
(
"ScanType"
,
SCAN_AUDIOS
)
})
}
}
}
}
}
...
@@ -509,7 +479,6 @@ fun AppCompatActivity.cleanFileBeans(list: List<FileBean>) {
...
@@ -509,7 +479,6 @@ fun AppCompatActivity.cleanFileBeans(list: List<FileBean>) {
paths
.
forEach
{
paths
.
forEach
{
val
file
=
File
(
it
)
val
file
=
File
(
it
)
cleanedSize
=
cleanedSize
+
file
.
length
()
cleanedSize
=
cleanedSize
+
file
.
length
()
RecycleBinUtils
.
addRecycleBinFile
(
file
)
FileUtils
.
deleteFile
(
it
)
FileUtils
.
deleteFile
(
it
)
}
}
launch
(
Dispatchers
.
Main
)
{
MediaUtils
.
updateMedia
(
applicationContext
,
paths
)
}
launch
(
Dispatchers
.
Main
)
{
MediaUtils
.
updateMedia
(
applicationContext
,
paths
)
}
...
...
app/src/main/java/com/base/appzxhy/bean/recovery/FolderBean.kt
View file @
d00f1ecb
package
com.base.appzxhy.bean.recovery
//package com.base.appzxhy.bean.recovery
//
//
data class
FolderBean
(
//data class FolderBean(
val
folder
:
String
=
""
,
// val folder: String = "",
val
time
:
String
=
""
,
// val time: String = "",
val
recoveryList
:
ArrayList
<
RecoveryBean
>
=
arrayListOf
()
// val recoveryList: ArrayList<RecoveryBean> = arrayListOf()
)
{
//) {
var
isSelect
:
Boolean
=
false
// var isSelect: Boolean = false
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/bean/recovery/RecoveryBean.kt
View file @
d00f1ecb
package
com.base.appzxhy.bean.recovery
//package com.base.appzxhy.bean.recovery
//
import
com.base.appzxhy.ui.recovery.FileHexEx.isDoc
//import com.base.appzxhy.ui.recovery.FileHexEx.isDoc
import
com.base.appzxhy.ui.recovery.FileHexEx.isDocx
//import com.base.appzxhy.ui.recovery.FileHexEx.isDocx
import
com.base.appzxhy.ui.recovery.FileHexEx.isFlac
//import com.base.appzxhy.ui.recovery.FileHexEx.isFlac
import
com.base.appzxhy.ui.recovery.FileHexEx.isMp3
//import com.base.appzxhy.ui.recovery.FileHexEx.isMp3
import
com.base.appzxhy.ui.recovery.FileHexEx.isPPT
//import com.base.appzxhy.ui.recovery.FileHexEx.isPPT
import
com.base.appzxhy.ui.recovery.FileHexEx.isPPTX
//import com.base.appzxhy.ui.recovery.FileHexEx.isPPTX
import
com.base.appzxhy.ui.recovery.FileHexEx.isPdf
//import com.base.appzxhy.ui.recovery.FileHexEx.isPdf
import
com.base.appzxhy.ui.recovery.FileHexEx.isWav
//import com.base.appzxhy.ui.recovery.FileHexEx.isWav
import
com.base.appzxhy.ui.recovery.FileHexEx.isXls
//import com.base.appzxhy.ui.recovery.FileHexEx.isXls
import
com.base.appzxhy.ui.recovery.FileHexEx.isXlsx
//import com.base.appzxhy.ui.recovery.FileHexEx.isXlsx
import
java.io.File
//import java.io.File
//
data class
RecoveryBean
(
//data class RecoveryBean(
val
path
:
String
=
""
,
// val path: String = "",
)
{
//) {
var
isSelect
:
Boolean
=
false
// var isSelect: Boolean = false
var
isThumbnails
:
Boolean
=
false
// var isThumbnails: Boolean = false
var
type
:
String
=
""
// var type: String = ""
//
companion
object
{
// companion object {
fun
RecoveryBean
.
setDocumentType
()
{
// fun RecoveryBean.setDocumentType() {
val
file
=
File
(
path
)
// val file = File(path)
if
(
isPdf
(
file
))
{
// if (isPdf(file)) {
type
=
"PDF"
// type = "PDF"
}
// }
if
(
isDocx
(
file
)
||
isDoc
(
file
))
{
// if (isDocx(file) || isDoc(file)) {
type
=
"DOC"
// type = "DOC"
}
// }
if
(
isXlsx
(
file
)
||
isXls
(
file
))
{
// if (isXlsx(file) || isXls(file)) {
type
=
"XLS"
// type = "XLS"
}
// }
if
(
isPPTX
(
file
)
||
isPPT
(
file
))
{
// if (isPPTX(file) || isPPT(file)) {
type
=
"PPT"
// type = "PPT"
}
// }
}
// }
//
fun
RecoveryBean
.
setAudioType
()
{
// fun RecoveryBean.setAudioType() {
val
file
=
File
(
path
)
// val file = File(path)
if
(
isMp3
(
file
))
{
// if (isMp3(file)) {
type
=
"MP3"
// type = "MP3"
}
// }
if
(
isWav
(
file
))
{
// if (isWav(file)) {
type
=
"WAV"
// type = "WAV"
}
// }
if
(
isFlac
(
file
))
{
// if (isFlac(file)) {
type
=
"FLAC"
// type = "FLAC"
}
// }
}
// }
//
}
// }
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/bean/recovery/RecoveryFilterBean.kt
View file @
d00f1ecb
package
com.base.appzxhy.bean.recovery
//package com.base.appzxhy.bean.recovery
//
class
RecoveryFilterBean
(
//class RecoveryFilterBean(
val
tittle
:
String
=
"ALL"
,
// val tittle: String = "ALL",
var
type
:
String
,
// var type: String,
var
isSelect
:
Boolean
=
false
,
// var isSelect: Boolean = false,
)
//)
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/language/LanguageActivity.kt
0 → 100644
View file @
d00f1ecb
package
com.base.appzxhy.ui.language
import
com.base.appzxhy.base.BaseActivity
import
com.base.appzxhy.databinding.ActivityLanguageBinding
class
LanguageActivity
:
BaseActivity
<
ActivityLanguageBinding
>(
ActivityLanguageBinding
::
inflate
)
{
override
fun
initView
()
{
super
.
initView
()
}
override
fun
initListener
()
{
super
.
initListener
()
}
}
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/main/Home2Fragment.kt
deleted
100644 → 0
View file @
5d17874e
package
com.base.appzxhy.ui.main
import
android.annotation.SuppressLint
import
android.view.View
import
androidx.lifecycle.lifecycleScope
import
com.base.appzxhy.R
import
com.base.appzxhy.base.BaseFragment
import
com.base.appzxhy.base.goToAc
import
com.base.appzxhy.base.jumpAction
import
com.base.appzxhy.bean.FeatureBean.Companion.BATTERY_INFO
import
com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
import
com.base.appzxhy.bean.FeatureBean.Companion.LARGE_FILE_CLEAN
import
com.base.appzxhy.bean.FeatureBean.Companion.PHOTO_COMPRESSION
import
com.base.appzxhy.bean.FeatureBean.Companion.SCREENSHOT_CLEAN
import
com.base.appzxhy.bean.FeatureBean.Companion.SIMILAR_PHOTOS
import
com.base.appzxhy.business.ads.AdsMgr
import
com.base.appzxhy.databinding.FragmentHome2Binding
import
com.base.appzxhy.ui.dialog.permissionStorageJump
import
com.base.appzxhy.ui.set.SettingActivity
import
com.base.appzxhy.ui.similar.SimilarPhotosActivity
import
com.base.appzxhy.utils.KotlinExt.toFormatSize
import
com.base.appzxhy.utils.Utils
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.async
import
kotlinx.coroutines.launch
class
Home2Fragment
:
BaseFragment
<
FragmentHome2Binding
>(
FragmentHome2Binding
::
inflate
)
{
override
fun
initView
()
{
super
.
initView
()
AdsMgr
.
showNative
(
binding
.
flAd
,
R
.
layout
.
layout_admob_native_custom
)
initData
()
}
override
fun
initListener
()
{
super
.
initListener
()
binding
.
ivSet
.
setOnClickListener
{
goToAc
(
SettingActivity
::
class
.
java
)
}
binding
.
flClean
.
setOnClickListener
{
(
requireActivity
()
as
MainActivity
).
permissionStorageJump
(
JUNK_CLEAN
)
}
binding
.
tvClean
.
setOnClickListener
{
(
requireActivity
()
as
MainActivity
).
permissionStorageJump
(
JUNK_CLEAN
)
}
binding
.
llClean
.
setOnClickListener
{
(
requireActivity
()
as
MainActivity
).
permissionStorageJump
(
JUNK_CLEAN
)
}
binding
.
llBattery
.
setOnClickListener
{
(
requireActivity
()
as
MainActivity
).
jumpAction
(
BATTERY_INFO
)
}
binding
.
llLarge
.
setOnClickListener
{
(
requireActivity
()
as
MainActivity
).
permissionStorageJump
(
LARGE_FILE_CLEAN
)
}
binding
.
llDuplicate
.
setOnClickListener
{
(
requireActivity
()
as
MainActivity
).
permissionStorageJump
(
SIMILAR_PHOTOS
)
}
binding
.
llScreenshot
.
setOnClickListener
{
(
requireActivity
()
as
MainActivity
).
permissionStorageJump
(
SCREENSHOT_CLEAN
)
}
binding
.
llPhotoCompression
.
setOnClickListener
{
(
requireActivity
()
as
MainActivity
).
permissionStorageJump
(
PHOTO_COMPRESSION
)
}
binding
.
ivScrollBottom
.
setOnClickListener
{
binding
.
scrollView
.
smoothScrollTo
(
0
,
binding
.
scrollView
.
getChildAt
(
0
).
measuredHeight
)
}
}
@SuppressLint
(
"SetTextI18n"
)
private
fun
initData
()
{
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
totalStorageSize
=
async
{
Utils
.
getTotalStorageSize
()
}.
await
()
val
availableStorageSize
=
async
{
Utils
.
getAvailableStorageSize
()
}.
await
()
val
usedStorageSize
=
totalStorageSize
-
availableStorageSize
val
totalStorage
=
Utils
.
getSizeFormat
(
totalStorageSize
)
val
usedStorage
=
Utils
.
getSizeFormat
(
usedStorageSize
)
val
percent
=
(
usedStorageSize
*
100
/
totalStorageSize
).
toInt
()
launch
(
Dispatchers
.
Main
)
{
binding
.
tvUsed
.
text
=
usedStorage
binding
.
tvTotal
.
text
=
" / $totalStorage"
binding
.
circleProgress
.
setProgressWithAnimation
(
percent
.
toFloat
(),
1000
)
}
}
}
override
fun
onResume
()
{
super
.
onResume
()
if
(
SimilarPhotosActivity
.
similarSize
!=
0L
)
{
binding
.
tvDupSize
.
visibility
=
View
.
VISIBLE
binding
.
tvDupSize
.
text
=
SimilarPhotosActivity
.
similarSize
.
toFormatSize
()
}
else
{
binding
.
tvDupSize
.
visibility
=
View
.
INVISIBLE
}
}
}
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/main/HomeFragment.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.main
package
com.base.appzxhy.ui.main
import
androidx.lifecycle.lifecycleScope
import
androidx.recyclerview.widget.ConcatAdapter
import
com.base.appzxhy.R
import
com.base.appzxhy.base.BaseFragment
import
com.base.appzxhy.base.BaseFragment
import
com.base.appzxhy.base.jumpAction
import
com.base.appzxhy.bean.FeatureBean
import
com.base.appzxhy.bean.FeatureBean.Companion.BATTERY_INFO
import
com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
import
com.base.appzxhy.bean.FeatureBean.Companion.LARGE_FILE_CLEAN
import
com.base.appzxhy.bean.FeatureBean.Companion.PHOTO_COMPRESSION
import
com.base.appzxhy.bean.FeatureBean.Companion.SCREENSHOT_CLEAN
import
com.base.appzxhy.bean.FeatureBean.Companion.SIMILAR_PHOTOS
import
com.base.appzxhy.databinding.FragmentHomeBinding
import
com.base.appzxhy.databinding.FragmentHomeBinding
import
com.base.appzxhy.ui.dialog.permissionStorageJump
import
com.base.appzxhy.utils.Utils
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.async
import
kotlinx.coroutines.launch
class
HomeFragment
:
BaseFragment
<
FragmentHomeBinding
>(
FragmentHomeBinding
::
inflate
)
{
class
HomeFragment
:
BaseFragment
<
FragmentHomeBinding
>(
FragmentHomeBinding
::
inflate
)
{
private
val
concatAdapter
=
ConcatAdapter
()
private
val
featureList
=
listOf
(
FeatureBean
(
JUNK_CLEAN
,
R
.
string
.
junk_clean
,
R
.
drawable
.
h_junkclean
).
apply
{
span
=
1
},
FeatureBean
(
BATTERY_INFO
,
R
.
string
.
battery_info
,
R
.
drawable
.
h_battery
).
apply
{
span
=
1
},
FeatureBean
(
LARGE_FILE_CLEAN
,
R
.
string
.
large_file_clean
,
R
.
drawable
.
h_lagre
).
apply
{
span
=
1
},
FeatureBean
(
SCREENSHOT_CLEAN
,
R
.
string
.
screenshot_clean
,
R
.
drawable
.
h_screenshot
).
apply
{
span
=
3
},
FeatureBean
(
PHOTO_COMPRESSION
,
R
.
string
.
photo_compression
,
R
.
drawable
.
h_compression
).
apply
{
span
=
3
},
FeatureBean
(
SIMILAR_PHOTOS
,
R
.
string
.
similar_photos
,
R
.
drawable
.
h_similar
).
apply
{
span
=
3
},
)
override
fun
initView
()
{
super
.
initView
()
binding
.
rv
.
adapter
=
concatAdapter
concatAdapter
.
addAdapter
(
YuanAdapter2
().
apply
{
submitList
(
listOf
(
arrayOf
(
""
,
""
)))
cleanClick
=
{
(
requireActivity
()
as
MainActivity
).
permissionStorageJump
(
JUNK_CLEAN
)
}
initData
(
this
)
})
concatAdapter
.
addAdapter
(
FeatureAdapter
().
apply
{
submitList
(
listOf
(
featureList
))
itemClick
=
{
bean
->
if
(
bean
.
key
==
BATTERY_INFO
)
{
requireActivity
().
jumpAction
(
bean
.
key
)
}
else
{
requireActivity
().
permissionStorageJump
(
bean
.
key
)
}
}
})
}
override
fun
initListener
()
{
super
.
initListener
()
}
private
fun
initData
(
adapter
:
YuanAdapter2
)
{
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
totalStorageSize
=
async
{
Utils
.
getTotalStorageSize
()
}.
await
()
val
availableStorageSize
=
async
{
Utils
.
getAvailableStorageSize
()
}.
await
()
val
usedStorageSize
=
totalStorageSize
-
availableStorageSize
val
totalStorage
=
Utils
.
getSizeFormat
(
totalStorageSize
)
val
usedStorage
=
Utils
.
getSizeFormat
(
usedStorageSize
)
val
percent
=
(
usedStorageSize
*
100
/
totalStorageSize
).
toInt
()
launch
(
Dispatchers
.
Main
)
{
adapter
.
submitList
(
listOf
(
arrayOf
(
usedStorage
,
totalStorage
,
"$percent"
))
)
}
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/main/MainActivity.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.main
package
com.base.appzxhy.ui.main
import
android.graphics.Color
import
android.view.LayoutInflater
import
android.view.View
import
android.widget.FrameLayout
import
android.widget.TextView
import
androidx.constraintlayout.widget.ConstraintLayout
import
androidx.core.content.ContextCompat
import
androidx.fragment.app.Fragment
import
androidx.lifecycle.ViewModelProvider
import
androidx.lifecycle.lifecycleScope
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.widget.ViewPager2
import
com.base.appzxhy.R
import
com.base.appzxhy.SpConstObject.mainPageCount
import
com.base.appzxhy.base.BaseActivity
import
com.base.appzxhy.base.BaseActivity
import
com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
import
com.base.appzxhy.bean.HomeTabUIBean
import
com.base.appzxhy.bean.config.AdConfigBean
import
com.base.appzxhy.business.ads.AdsMgr
import
com.base.appzxhy.databinding.ActivityMainBinding
import
com.base.appzxhy.databinding.ActivityMainBinding
import
com.base.appzxhy.databinding.ItemHomeTabBinding
import
com.base.appzxhy.ui.dialog.AppExitDialog
import
com.base.appzxhy.ui.dialog.NotificationTurnOnDialog
import
com.base.appzxhy.ui.dialog.RateDialog
import
com.base.appzxhy.ui.dialog.StoragePermissionDialog
import
com.base.appzxhy.ui.dialog.permissionStorageJump
import
com.base.appzxhy.ui.recyclebin.RecycleBinFragment
import
com.base.appzxhy.utils.PermissionUtils.requestNotificationPermission
import
com.base.appzxhy.utils.PermissionUtils.requestStoragePermission
import
com.google.android.material.tabs.TabLayout
import
com.google.android.material.tabs.TabLayout.OnTabSelectedListener
import
kotlinx.coroutines.flow.collectLatest
import
kotlinx.coroutines.launch
class
MainActivity
:
BaseActivity
<
ActivityMainBinding
>(
ActivityMainBinding
::
inflate
)
{
class
MainActivity
:
BaseActivity
<
ActivityMainBinding
>(
ActivityMainBinding
::
inflate
)
{
val
viewModel
by
lazy
{
ViewModelProvider
(
this
)[
MainViewModel
::
class
.
java
]
}
private
val
fragmentList
=
listOf
(
Home2Fragment
(),
RecoveryFragment
(),
RecycleBinFragment
()
)
private
val
viewPagerAdapter
by
lazy
{
object
:
FragmentStateAdapter
(
this
)
{
override
fun
getItemCount
():
Int
=
fragmentList
.
size
override
fun
createFragment
(
position
:
Int
):
Fragment
=
fragmentList
[
position
]
}
}
override
fun
initView
()
{
override
fun
initView
()
{
super
.
initView
()
super
.
initView
()
initTab
()
initViewPager2
()
initDialogFlow
()
AdsMgr
.
showBanner
(
binding
.
flBanner
,
false
)
val
lp
=
binding
.
flBottom
.
layoutParams
as
ConstraintLayout
.
LayoutParams
if
(!
AdConfigBean
.
adsConfigBean
.
isAdShow
)
{
lp
.
setMargins
(
0
,
0
,
0
,
0
)
}
else
{
lp
.
setMargins
(
0
,
0
,
0
,
resources
.
getDimensionPixelSize
(
R
.
dimen
.
dp_60
))
}
binding
.
flBottom
.
layoutParams
=
lp
}
private
fun
initDialogFlow
()
{
lifecycleScope
.
launch
{
viewModel
.
dialogFlow
.
collectLatest
{
dialogType
->
when
(
dialogType
)
{
"StoreDialog"
->
{
val
dialog
=
StoragePermissionDialog
(
this
@MainActivity
)
dialog
.
action
=
{
requestStoragePermission
(
launcher
)
{
viewModel
.
nextShowDialog
=
false
}
}
dialog
.
showDialog
()
}
"NotificationDialog"
->
{
val
dialog
=
NotificationTurnOnDialog
(
this
@MainActivity
)
dialog
.
action
=
{
requestNotificationPermission
(
launcher
)
{
viewModel
.
nextShowDialog
=
false
}
}
dialog
.
showDialog
()
}
"RateDialog"
->
{
val
dialog
=
RateDialog
(
this
@MainActivity
)
dialog
.
showDialog
(
false
)
}
}
}
}
}
}
private
fun
initViewPager2
()
{
override
fun
initListener
()
{
binding
.
viewPager2
.
adapter
=
viewPagerAdapter
super
.
initListener
()
binding
.
viewPager2
.
registerOnPageChangeCallback
(
object
:
ViewPager2
.
OnPageChangeCallback
()
{
override
fun
onPageSelected
(
position
:
Int
)
{
val
defaultTab
=
binding
.
tabLayout
.
getTabAt
(
position
)
defaultTab
?.
select
()
defaultTab
?.
setSelected
()
}
}
})
}
private
fun
initTab
()
{
arrayOf
(
HomeTabUIBean
(
R
.
drawable
.
tab_clean_selector
,
getString
(
R
.
string
.
clean
)),
HomeTabUIBean
(
R
.
drawable
.
tab_recovery_selector
,
getString
(
R
.
string
.
recovery
)),
HomeTabUIBean
(
R
.
drawable
.
tab_recyclebin_selector
,
getString
(
R
.
string
.
recyclebin
)),
).
forEachIndexed
{
index
,
homeTab
->
val
tab
=
binding
.
tabLayout
.
newTab
()
val
view
=
LayoutInflater
.
from
(
this
).
inflate
(
R
.
layout
.
item_home_tab
,
null
)
val
tabBinding
=
ItemHomeTabBinding
.
bind
(
view
)
tabBinding
.
ivIcon
.
setImageResource
(
homeTab
.
icon
)
tabBinding
.
tvTab
.
text
=
homeTab
.
tab
// tabBinding.tvTab.setTextColor(ContextCompat.getColor(this, R.color.color_tab_home))
tab
.
customView
=
tabBinding
.
root
tab
.
id
=
index
if
(
index
==
1
)
{
tabBinding
.
vDian
.
visibility
=
View
.
VISIBLE
}
else
{
tabBinding
.
vDian
.
visibility
=
View
.
GONE
}
binding
.
tabLayout
.
addTab
(
tab
)
}
binding
.
tabLayout
.
addOnTabSelectedListener
(
object
:
OnTabSelectedListener
{
override
fun
onTabSelected
(
tab
:
TabLayout
.
Tab
?)
{
tab
?.
let
{
if
(
binding
.
viewPager2
.
currentItem
==
tab
.
id
)
return
binding
.
viewPager2
.
setCurrentItem
(
tab
.
id
,
false
)
}
}
override
fun
onTabUnselected
(
tab
:
TabLayout
.
Tab
?)
{
tab
?.
setUnselected
()
}
override
fun
onTabReselected
(
tab
:
TabLayout
.
Tab
?)
{
}
})
}
fun
TabLayout
.
Tab
.
setSelected
()
{
val
textView
=
customView
?.
findViewById
<
TextView
>(
R
.
id
.
tv_tab
)
textView
?.
setTextColor
(
ContextCompat
.
getColor
(
this
@MainActivity
,
R
.
color
.
colorPrimary
)
)
}
fun
TabLayout
.
Tab
.
setUnselected
()
{
val
textView
=
customView
?.
findViewById
<
TextView
>(
R
.
id
.
tv_tab
)
textView
?.
setTextColor
(
Color
.
parseColor
(
"#999999"
))
}
override
fun
onResumeOneShoot
()
{
super
.
onResumeOneShoot
()
mainPageCount
=
mainPageCount
+
1
viewModel
.
checkDialog
(
this
)
viewModel
.
refreshRecycleBin
()
}
override
fun
handleBackCallBack
()
{
val
dialog
=
AppExitDialog
(
this
)
dialog
.
action
=
{
permissionStorageJump
(
JUNK_CLEAN
)
}
dialog
.
showDialog
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/main/MainViewModel.kt
View file @
d00f1ecb
...
@@ -2,17 +2,12 @@ package com.base.appzxhy.ui.main
...
@@ -2,17 +2,12 @@ package com.base.appzxhy.ui.main
import
android.content.Context
import
android.content.Context
import
androidx.lifecycle.ViewModel
import
androidx.lifecycle.ViewModel
import
androidx.lifecycle.viewModelScope
import
com.base.appzxhy.SpConstObject.isScoreRated
import
com.base.appzxhy.SpConstObject.isScoreRated
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getRecycleBinData
import
com.base.appzxhy.utils.PermissionUtils.areNotificationsEnabled
import
com.base.appzxhy.utils.PermissionUtils.areNotificationsEnabled
import
com.base.appzxhy.utils.PermissionUtils.checkNotificationPermission
import
com.base.appzxhy.utils.PermissionUtils.checkNotificationPermission
import
com.base.appzxhy.utils.PermissionUtils.checkStorePermission
import
com.base.appzxhy.utils.PermissionUtils.checkStorePermission
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.flow.MutableStateFlow
import
kotlinx.coroutines.flow.MutableStateFlow
import
kotlinx.coroutines.flow.update
import
kotlinx.coroutines.flow.update
import
kotlinx.coroutines.launch
import
java.io.File
class
MainViewModel
:
ViewModel
()
{
class
MainViewModel
:
ViewModel
()
{
...
@@ -44,10 +39,4 @@ class MainViewModel : ViewModel() {
...
@@ -44,10 +39,4 @@ class MainViewModel : ViewModel() {
return
return
}
}
}
}
var
recycleBinFileFlow
:
MutableStateFlow
<
List
<
File
>>
=
MutableStateFlow
(
listOf
())
fun
refreshRecycleBin
()
=
viewModelScope
.
launch
(
Dispatchers
.
IO
)
{
recycleBinFileFlow
.
update
{
getRecycleBinData
()
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/main/RecoveryFragment.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.main
//package com.base.appzxhy.ui.main
//
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.base.BaseFragment
//import com.base.appzxhy.base.BaseFragment
import
com.base.appzxhy.base.goToAc
//import com.base.appzxhy.base.goToAc
import
com.base.appzxhy.business.ads.AdsMgr
//import com.base.appzxhy.business.ads.AdsMgr
import
com.base.appzxhy.databinding.FragmentRecoveryBinding
//import com.base.appzxhy.databinding.FragmentRecoveryBinding
import
com.base.appzxhy.ui.recovery.FileScanResultActivity
//import com.base.appzxhy.ui.recovery.FileScanResultActivity
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_AUDIOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_AUDIOS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_DOCUMENTS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_DOCUMENTS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
//
class
RecoveryFragment
:
BaseFragment
<
FragmentRecoveryBinding
>(
FragmentRecoveryBinding
::
inflate
)
{
//class RecoveryFragment : BaseFragment<FragmentRecoveryBinding>(FragmentRecoveryBinding::inflate) {
//
//
override
fun
initView
()
{
// override fun initView() {
super
.
initView
()
// super.initView()
AdsMgr
.
showNative
(
binding
.
flAd
,
R
.
layout
.
layout_admob_native_custom
)
// AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
}
// }
//
override
fun
initListener
()
{
// override fun initListener() {
super
.
initListener
()
// super.initListener()
binding
.
llPhoto
.
setOnClickListener
{
// binding.llPhoto.setOnClickListener {
goToAc
(
FileScanResultActivity
::
class
.
java
)
{
// goToAc(FileScanResultActivity::class.java) {
putExtra
(
"ScanType"
,
SCAN_PHOTOS
)
// putExtra("ScanType", SCAN_PHOTOS)
}
// }
}
// }
binding
.
llVideo
.
setOnClickListener
{
// binding.llVideo.setOnClickListener {
goToAc
(
FileScanResultActivity
::
class
.
java
)
{
// goToAc(FileScanResultActivity::class.java) {
putExtra
(
"ScanType"
,
SCAN_VIDEOS
)
// putExtra("ScanType", SCAN_VIDEOS)
}
// }
}
// }
binding
.
llDocument
.
setOnClickListener
{
// binding.llDocument.setOnClickListener {
goToAc
(
FileScanResultActivity
::
class
.
java
)
{
// goToAc(FileScanResultActivity::class.java) {
putExtra
(
"ScanType"
,
SCAN_DOCUMENTS
)
// putExtra("ScanType", SCAN_DOCUMENTS)
}
// }
}
// }
binding
.
llAudio
.
setOnClickListener
{
// binding.llAudio.setOnClickListener {
goToAc
(
FileScanResultActivity
::
class
.
java
)
{
// goToAc(FileScanResultActivity::class.java) {
putExtra
(
"ScanType"
,
SCAN_AUDIOS
)
// putExtra("ScanType", SCAN_AUDIOS)
}
// }
}
// }
//
}
// }
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/recovery/FileFolderAdapter.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.recovery
//package com.base.appzxhy.ui.recovery
//
import
android.annotation.SuppressLint
//import android.annotation.SuppressLint
import
android.content.Context
//import android.content.Context
import
android.view.LayoutInflater
//import android.view.LayoutInflater
import
android.view.View
//import android.view.View
import
android.view.ViewGroup
//import android.view.ViewGroup
import
androidx.recyclerview.widget.RecyclerView
//import androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView.ViewHolder
//import androidx.recyclerview.widget.RecyclerView.ViewHolder
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.bean.recovery.FolderBean
//import com.base.appzxhy.bean.recovery.FolderBean
import
com.base.appzxhy.databinding.ItemFolderBinding
//import com.base.appzxhy.databinding.ItemFolderBinding
import
com.base.appzxhy.databinding.ItemFolderRecoveryBinding
//import com.base.appzxhy.databinding.ItemFolderRecoveryBinding
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
import
com.bumptech.glide.Glide
//import com.bumptech.glide.Glide
import
com.bumptech.glide.load.resource.bitmap.CenterCrop
//import com.bumptech.glide.load.resource.bitmap.CenterCrop
import
com.bumptech.glide.load.resource.bitmap.RoundedCorners
//import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import
com.bumptech.glide.request.RequestOptions
//import com.bumptech.glide.request.RequestOptions
//
class
FileFolderAdapter
(
//class FileFolderAdapter(
private
val
scanType
:
Int
,
private
val
click
:
(
bean
:
FolderBean
)
->
Unit
// private val scanType: Int, private val click: (bean: FolderBean) -> Unit
)
:
RecyclerView
.
Adapter
<
FileFolderAdapter
.
FF
>()
{
//) : RecyclerView.Adapter<FileFolderAdapter.FF>() {
//
private
val
TAG
=
"FileFolderAdapter"
// private val TAG = "FileFolderAdapter"
private
val
beanList
=
arrayListOf
<
FolderBean
>()
// private val beanList = arrayListOf<FolderBean>()
//
class
FF
(
view
:
View
)
:
ViewHolder
(
view
)
// class FF(view: View) : ViewHolder(view)
//
fun
Int
.
inflate
(
parent
:
ViewGroup
,
attachToRoot
:
Boolean
=
false
):
View
{
// fun Int.inflate(parent: ViewGroup, attachToRoot: Boolean = false): View {
return
LayoutInflater
.
from
(
parent
.
context
).
inflate
(
this
,
parent
,
attachToRoot
)
// return LayoutInflater.from(parent.context).inflate(this, parent, attachToRoot)
}
// }
//
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
FF
{
// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FF {
val
layout
=
when
(
scanType
)
{
// val layout = when (scanType) {
SCAN_PHOTOS
,
SCAN_VIDEOS
->
R
.
layout
.
item_folder_recovery
// SCAN_PHOTOS, SCAN_VIDEOS -> R.layout.item_folder_recovery
else
->
R
.
layout
.
item_folder
// else -> R.layout.item_folder
}
// }
return
FF
(
layout
.
inflate
(
parent
))
// return FF(layout.inflate(parent))
}
// }
//
override
fun
getItemCount
():
Int
{
// override fun getItemCount(): Int {
return
beanList
.
size
// return beanList.size
}
// }
//
fun
Context
.
dpToPx
(
dps
:
Int
):
Int
{
// fun Context.dpToPx(dps: Int): Int {
return
Math
.
round
(
resources
.
displayMetrics
.
density
*
dps
)
// return Math.round(resources.displayMetrics.density * dps)
}
// }
//
@SuppressLint
(
"SetTextI18n"
,
"CheckResult"
)
// @SuppressLint("SetTextI18n", "CheckResult")
override
fun
onBindViewHolder
(
holder
:
FF
,
position
:
Int
)
{
// override fun onBindViewHolder(holder: FF, position: Int) {
//
val
bean
=
beanList
[
position
]
// val bean = beanList[position]
val
context
=
holder
.
itemView
.
context
// val context = holder.itemView.context
//
when
(
scanType
)
{
// when (scanType) {
SCAN_PHOTOS
,
SCAN_VIDEOS
->
{
// SCAN_PHOTOS, SCAN_VIDEOS -> {
val
binding
=
ItemFolderRecoveryBinding
.
bind
(
holder
.
itemView
)
// val binding = ItemFolderRecoveryBinding.bind(holder.itemView)
runCatching
{
// runCatching {
val
options
=
RequestOptions
().
transform
(
CenterCrop
(),
RoundedCorners
(
context
.
dpToPx
(
10
)))
// val options = RequestOptions().transform(CenterCrop(), RoundedCorners(context.dpToPx(10)))
val
image1
=
bean
.
recoveryList
[
0
].
path
// val image1 = bean.recoveryList[0].path
val
request1
=
Glide
.
with
(
context
).
load
(
image1
).
apply
(
options
)
// val request1 = Glide.with(context).load(image1).apply(options)
if
(
scanType
==
SCAN_VIDEOS
)
{
// if (scanType == SCAN_VIDEOS) {
request1
.
error
(
R
.
drawable
.
videotu
)
// request1.error(R.drawable.videotu)
}
// }
request1
.
into
(
binding
.
iv1
)
// request1.into(binding.iv1)
//
val
image2
=
bean
.
recoveryList
[
1
].
path
// val image2 = bean.recoveryList[1].path
val
request2
=
Glide
.
with
(
context
).
load
(
image2
).
apply
(
options
)
// val request2 = Glide.with(context).load(image2).apply(options)
if
(
scanType
==
SCAN_VIDEOS
)
{
// if (scanType == SCAN_VIDEOS) {
request2
.
error
(
R
.
drawable
.
videotu
)
// request2.error(R.drawable.videotu)
}
// }
request2
.
into
(
binding
.
iv2
)
// request2.into(binding.iv2)
//
val
image3
=
bean
.
recoveryList
[
2
].
path
// val image3 = bean.recoveryList[2].path
val
request3
=
Glide
.
with
(
context
).
load
(
image3
).
apply
(
options
)
// val request3 = Glide.with(context).load(image3).apply(options)
if
(
scanType
==
SCAN_VIDEOS
)
{
// if (scanType == SCAN_VIDEOS) {
request3
.
error
(
R
.
drawable
.
videotu
)
// request3.error(R.drawable.videotu)
}
// }
request3
.
into
(
binding
.
iv3
)
// request3.into(binding.iv3)
}
// }
//
binding
.
tvFolder
.
text
=
bean
.
folder
// binding.tvFolder.text = bean.folder
binding
.
tvFolderNumber
.
text
=
"(${bean.recoveryList.size})"
// binding.tvFolderNumber.text = "(${bean.recoveryList.size})"
binding
.
root
.
setOnClickListener
{
// binding.root.setOnClickListener {
click
.
invoke
(
bean
)
// click.invoke(bean)
}
// }
}
// }
//
else
->
{
// else -> {
// LogEx.logDebug(TAG, "scanType=$scanType")
//// LogEx.logDebug(TAG, "scanType=$scanType")
val
binding
=
ItemFolderBinding
.
bind
(
holder
.
itemView
)
// val binding = ItemFolderBinding.bind(holder.itemView)
binding
.
tvFolder
.
text
=
bean
.
folder
// binding.tvFolder.text = bean.folder
binding
.
tvFileNumber
.
text
=
"${bean.recoveryList.size}"
// binding.tvFileNumber.text = "${bean.recoveryList.size}"
binding
.
root
.
setOnClickListener
{
// binding.root.setOnClickListener {
click
.
invoke
(
bean
)
// click.invoke(bean)
}
// }
}
// }
}
// }
//
//
}
// }
//
@SuppressLint
(
"NotifyDataSetChanged"
)
// @SuppressLint("NotifyDataSetChanged")
fun
setData
(
list
:
List
<
FolderBean
>)
{
// fun setData(list: List<FolderBean>) {
beanList
.
clear
()
// beanList.clear()
beanList
.
addAll
(
list
)
// beanList.addAll(list)
notifyDataSetChanged
()
// notifyDataSetChanged()
}
// }
//
@SuppressLint
(
"NotifyDataSetChanged"
)
// @SuppressLint("NotifyDataSetChanged")
fun
addData
(
list
:
List
<
FolderBean
>)
{
// fun addData(list: List<FolderBean>) {
beanList
.
addAll
(
list
)
// beanList.addAll(list)
notifyDataSetChanged
()
// notifyDataSetChanged()
}
// }
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/recovery/FileHexEx.kt
View file @
d00f1ecb
This diff is collapsed.
Click to expand it.
app/src/main/java/com/base/appzxhy/ui/recovery/FileRecoveredActivity.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.recovery
//package com.base.appzxhy.ui.recovery
//
import
android.annotation.SuppressLint
//import android.annotation.SuppressLint
import
android.os.Bundle
//import android.os.Bundle
import
android.os.Environment
//import android.os.Environment
import
androidx.activity.addCallback
//import androidx.activity.addCallback
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.base.BaseActivity
//import com.base.appzxhy.base.BaseActivity
import
com.base.appzxhy.business.ads.AdsMgr
//import com.base.appzxhy.business.ads.AdsMgr
import
com.base.appzxhy.business.ads.AdsShowCallBack
//import com.base.appzxhy.business.ads.AdsShowCallBack
import
com.base.appzxhy.databinding.ActivityFileRecoveredBinding
//import com.base.appzxhy.databinding.ActivityFileRecoveredBinding
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_AUDIOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_AUDIOS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_DOCUMENTS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_DOCUMENTS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
import
java.io.File
//import java.io.File
//
class
FileRecoveredActivity
:
BaseActivity
<
ActivityFileRecoveredBinding
>(
ActivityFileRecoveredBinding
::
inflate
)
{
//class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>(ActivityFileRecoveredBinding::inflate) {
//
//
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
// override fun onCreate(savedInstanceState: Bundle?) {
super
.
onCreate
(
savedInstanceState
)
// super.onCreate(savedInstanceState)
initView
()
// initView()
initListener
()
// initListener()
}
// }
//
@SuppressLint
(
"SetTextI18n"
)
// @SuppressLint("SetTextI18n")
override
fun
initView
()
{
// override fun initView() {
super
.
initView
()
// super.initView()
//
val
number
=
intent
.
extras
?.
getInt
(
"Number"
)
?:
0
// val number = intent.extras?.getInt("Number") ?: 0
val
scanType
=
intent
.
extras
?.
getInt
(
"ScanType"
)
// val scanType = intent.extras?.getInt("ScanType")
val
path
:
String
?
=
intent
.
extras
?.
getString
(
"Path"
)
// val path: String? = intent.extras?.getString("Path")
//
binding
.
tvNumber
.
text
=
number
.
toString
()
// binding.tvNumber.text = number.toString()
val
type
=
when
(
scanType
)
{
// val type = when (scanType) {
SCAN_PHOTOS
->
if
(
number
==
1
)
"Photo"
else
"Photos"
// SCAN_PHOTOS -> if (number == 1) "Photo" else "Photos"
SCAN_VIDEOS
->
if
(
number
==
1
)
"Video"
else
"Videos"
// SCAN_VIDEOS -> if (number == 1) "Video" else "Videos"
SCAN_DOCUMENTS
->
if
(
number
==
1
)
"Document"
else
"Documents"
// SCAN_DOCUMENTS -> if (number == 1) "Document" else "Documents"
SCAN_AUDIOS
->
if
(
number
==
1
)
"Audio"
else
"Audios"
// SCAN_AUDIOS -> if (number == 1) "Audio" else "Audios"
else
->
""
// else -> ""
}
// }
binding
.
tvType
.
text
=
type
// binding.tvType.text = type
//
val
appName
=
getString
(
R
.
string
.
app_name
).
replace
(
"/"
,
" "
)
// val appName = getString(R.string.app_name).replace("/", " ")
val
appDir
=
File
(
Environment
.
getExternalStorageDirectory
(),
appName
)
// val appDir = File(Environment.getExternalStorageDirectory(), appName)
binding
.
tvDir
.
text
=
"Recovered in $appDir"
// binding.tvDir.text = "Recovered in $appDir"
}
// }
//
override
fun
initListener
()
{
// override fun initListener() {
//
binding
.
ivBack
.
setOnClickListener
{
// binding.ivBack.setOnClickListener {
onBackPressedDispatcher
.
onBackPressed
()
// onBackPressedDispatcher.onBackPressed()
}
// }
onBackPressedDispatcher
.
addCallback
{
// onBackPressedDispatcher.addCallback {
AdsMgr
.
showInsert
(
this
@FileRecoveredActivity
,
showCallBack
=
object
:
AdsShowCallBack
()
{
// AdsMgr.showInsert(this@FileRecoveredActivity, showCallBack = object : AdsShowCallBack() {
override
fun
next
()
{
// override fun next() {
finishToMainTop
()
// finishToMainTop()
}
// }
})
// })
}
// }
binding
.
tvContinue
.
setOnClickListener
{
// binding.tvContinue.setOnClickListener {
AdsMgr
.
showInsert
(
this
@FileRecoveredActivity
,
showCallBack
=
object
:
AdsShowCallBack
()
{
// AdsMgr.showInsert(this@FileRecoveredActivity, showCallBack = object : AdsShowCallBack() {
override
fun
next
()
{
// override fun next() {
finish
()
// finish()
}
// }
})
// })
}
// }
binding
.
tvFinish
.
setOnClickListener
{
// binding.tvFinish.setOnClickListener {
onBackPressedDispatcher
.
onBackPressed
()
// onBackPressedDispatcher.onBackPressed()
}
// }
}
// }
//
//
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/recovery/FileRecoveryActivity.kt
View file @
d00f1ecb
This diff is collapsed.
Click to expand it.
app/src/main/java/com/base/appzxhy/ui/recovery/FileScanDialog.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.recovery
//package com.base.appzxhy.ui.recovery
//
import
android.animation.ValueAnimator
//import android.animation.ValueAnimator
import
android.annotation.SuppressLint
//import android.annotation.SuppressLint
import
android.app.AlertDialog
//import android.app.AlertDialog
import
android.view.LayoutInflater
//import android.view.LayoutInflater
import
android.view.View
//import android.view.View
import
android.view.animation.LinearInterpolator
//import android.view.animation.LinearInterpolator
import
androidx.appcompat.app.AppCompatActivity
//import androidx.appcompat.app.AppCompatActivity
import
androidx.lifecycle.lifecycleScope
//import androidx.lifecycle.lifecycleScope
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.business.ads.AdsMgr
//import com.base.appzxhy.business.ads.AdsMgr
import
com.base.appzxhy.databinding.DialogFileScanBinding
//import com.base.appzxhy.databinding.DialogFileScanBinding
import
kotlinx.coroutines.Dispatchers
//import kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.flow.SharedFlow
//import kotlinx.coroutines.flow.SharedFlow
import
kotlinx.coroutines.flow.collectLatest
//import kotlinx.coroutines.flow.collectLatest
import
kotlinx.coroutines.launch
//import kotlinx.coroutines.launch
//
class
FileScanDialog
(
//class FileScanDialog(
val
activity
:
AppCompatActivity
,
// val activity: AppCompatActivity,
)
{
//) {
private
val
TAG
=
"FileScanDialog"
// private val TAG = "FileScanDialog"
private
val
a1
=
ValueAnimator
.
ofFloat
(
0f
,
-
360f
)
// private val a1 = ValueAnimator.ofFloat(0f, -360f)
private
val
dialog
=
AlertDialog
.
Builder
(
activity
).
create
()
// private val dialog = AlertDialog.Builder(activity).create()
private
val
binding
=
DialogFileScanBinding
.
inflate
(
LayoutInflater
.
from
(
activity
))
// private val binding = DialogFileScanBinding.inflate(LayoutInflater.from(activity))
//
//
@SuppressLint
(
"SetTextI18n"
)
// @SuppressLint("SetTextI18n")
fun
showFileScanDialog
(
// fun showFileScanDialog(
pathFlow
:
SharedFlow
<
String
>,
// pathFlow: SharedFlow<String>,
foundFlow
:
SharedFlow
<
Pair
<
Int
,
String
>>,
// foundFlow: SharedFlow<Pair<Int, String>>,
foundAction
:
((
path
:
String
)
->
Unit
)?
=
null
// foundAction: ((path: String) -> Unit)? = null
):
AlertDialog
{
// ): AlertDialog {
dialog
?.
setView
(
binding
.
root
)
// dialog?.setView(binding.root)
dialog
?.
setCanceledOnTouchOutside
(
false
)
// dialog?.setCanceledOnTouchOutside(false)
dialog
?.
setCancelable
(
false
)
// dialog?.setCancelable(false)
dialog
?.
show
()
// dialog?.show()
//
dialog
?.
window
?.
setBackgroundDrawableResource
(
R
.
color
.
transparent
)
// dialog?.window?.setBackgroundDrawableResource(R.color.transparent)
val
params
=
dialog
?.
window
?.
attributes
// val params = dialog?.window?.attributes
params
?.
width
=
activity
.
resources
.
getDimensionPixelOffset
(
R
.
dimen
.
dp_300
)
// params?.width = activity.resources.getDimensionPixelOffset(R.dimen.dp_300)
dialog
?.
window
?.
attributes
=
params
// dialog?.window?.attributes = params
//
a1
.
run
{
// a1.run {
duration
=
1000
// duration = 1000
repeatMode
=
ValueAnimator
.
RESTART
// repeatMode = ValueAnimator.RESTART
repeatCount
=
ValueAnimator
.
INFINITE
// repeatCount = ValueAnimator.INFINITE
interpolator
=
LinearInterpolator
()
// interpolator = LinearInterpolator()
addUpdateListener
{
// addUpdateListener {
binding
.
iv
.
rotation
=
it
.
animatedValue
as
Float
// binding.iv.rotation = it.animatedValue as Float
}
// }
start
()
// start()
}
// }
//
dialog
?.
setOnDismissListener
{
// dialog?.setOnDismissListener {
a1
.
cancel
()
// a1.cancel()
}
// }
//
AdsMgr
.
showNative
(
binding
.
flAd
,
R
.
layout
.
layout_admob_native_custom
)
// AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
//
var
pathShowed
=
false
// var pathShowed = false
activity
.
lifecycleScope
.
launch
(
Dispatchers
.
Main
)
{
// activity.lifecycleScope.launch(Dispatchers.Main) {
pathFlow
.
collectLatest
{
path
->
// pathFlow.collectLatest { path ->
if
(!
pathShowed
)
{
// if (!pathShowed) {
pathShowed
=
true
// pathShowed = true
binding
.
tvPath
.
visibility
=
View
.
VISIBLE
// binding.tvPath.visibility = View.VISIBLE
}
// }
binding
.
tvPath
.
text
=
path
// binding.tvPath.text = path
}
// }
}
// }
activity
.
lifecycleScope
.
launch
{
// activity.lifecycleScope.launch {
foundFlow
.
collectLatest
{
// foundFlow.collectLatest {
binding
.
tvFoundNumber
.
text
=
"Found ${it.first} files"
// binding.tvFoundNumber.text = "Found ${it.first} files"
foundAction
?.
invoke
(
it
.
second
)
// foundAction?.invoke(it.second)
}
// }
}
// }
//
return
dialog
// return dialog
}
// }
//
@SuppressLint
(
"SetTextI18n"
)
// @SuppressLint("SetTextI18n")
fun
finishScan
(
clickAction
:
()
->
Unit
)
{
// fun finishScan(clickAction: () -> Unit) {
a1
.
cancel
()
// a1.cancel()
binding
.
tvBtn
.
visibility
=
View
.
VISIBLE
// binding.tvBtn.visibility = View.VISIBLE
binding
.
iv
.
visibility
=
View
.
GONE
// binding.iv.visibility = View.GONE
binding
.
tvPath
.
visibility
=
View
.
GONE
// binding.tvPath.visibility = View.GONE
binding
.
tvTitle
.
text
=
"Scan Completed"
// binding.tvTitle.text = "Scan Completed"
binding
.
tvBtn
.
setOnClickListener
{
// binding.tvBtn.setOnClickListener {
clickAction
.
invoke
()
// clickAction.invoke()
}
// }
}
// }
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/recovery/FileScanResultActivity.kt
View file @
d00f1ecb
This diff is collapsed.
Click to expand it.
app/src/main/java/com/base/appzxhy/ui/recovery/FileTimeColumnsAdapter.kt
View file @
d00f1ecb
This diff is collapsed.
Click to expand it.
app/src/main/java/com/base/appzxhy/ui/recovery/RecoveringDialog.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.recovery
//package com.base.appzxhy.ui.recovery
//
import
android.annotation.SuppressLint
//import android.annotation.SuppressLint
import
android.content.Context
//import android.content.Context
import
android.view.LayoutInflater
//import android.view.LayoutInflater
import
android.view.View
//import android.view.View
import
androidx.lifecycle.LifecycleCoroutineScope
//import androidx.lifecycle.LifecycleCoroutineScope
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.databinding.DialogRecoveringBinding
//import com.base.appzxhy.databinding.DialogRecoveringBinding
import
com.google.android.material.bottomsheet.BottomSheetBehavior
//import com.google.android.material.bottomsheet.BottomSheetBehavior
import
com.google.android.material.bottomsheet.BottomSheetDialog
//import com.google.android.material.bottomsheet.BottomSheetDialog
import
kotlinx.coroutines.Dispatchers
//import kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.cancel
//import kotlinx.coroutines.cancel
import
kotlinx.coroutines.channels.BufferOverflow
//import kotlinx.coroutines.channels.BufferOverflow
import
kotlinx.coroutines.delay
//import kotlinx.coroutines.delay
import
kotlinx.coroutines.flow.MutableSharedFlow
//import kotlinx.coroutines.flow.MutableSharedFlow
import
kotlinx.coroutines.flow.SharedFlow
//import kotlinx.coroutines.flow.SharedFlow
import
kotlinx.coroutines.flow.collectLatest
//import kotlinx.coroutines.flow.collectLatest
import
kotlinx.coroutines.launch
//import kotlinx.coroutines.launch
import
java.io.File
//import java.io.File
import
kotlin.random.Random
//import kotlin.random.Random
//
object
RecoveringDialog
{
//object RecoveringDialog {
//
@SuppressLint
(
"SetTextI18n"
)
// @SuppressLint("SetTextI18n")
fun
Context
.
showRecoveringDialog
(
// fun Context.showRecoveringDialog(
lifecycleScope
:
LifecycleCoroutineScope
,
// lifecycleScope: LifecycleCoroutineScope,
list
:
List
<
String
>,
// list: List<String>,
dir
:
File
,
// dir: File,
copyProgressAction
:
()
->
Unit
,
// copyProgressAction: () -> Unit,
finish
:
()
->
Unit
// finish: () -> Unit
)
{
// ) {
val
dialog
=
BottomSheetDialog
(
this
,
R
.
style
.
BottomSheetDialog
)
// val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
val
binding
=
DialogRecoveringBinding
.
inflate
(
LayoutInflater
.
from
(
this
))
// val binding = DialogRecoveringBinding.inflate(LayoutInflater.from(this))
dialog
.
setContentView
(
binding
.
root
)
// dialog.setContentView(binding.root)
dialog
.
setCanceledOnTouchOutside
(
false
)
// dialog.setCanceledOnTouchOutside(false)
//
val
mutableSharedFlow
=
MutableSharedFlow
<
Int
>(
// val mutableSharedFlow = MutableSharedFlow<Int>(
replay
=
5
,
//当新的订阅者Collect时,发送几个已经发送过的数据给它
// replay = 5,//当新的订阅者Collect时,发送几个已经发送过的数据给它
extraBufferCapacity
=
5
,
//减去replay,MutableSharedFlow还缓存多少数据,缓冲池容量 = replay + extraBufferCapacity
// extraBufferCapacity = 5,//减去replay,MutableSharedFlow还缓存多少数据,缓冲池容量 = replay + extraBufferCapacity
onBufferOverflow
=
BufferOverflow
.
SUSPEND
//缓存策略,三种 丢掉最新值、丢掉最旧值和挂起
// onBufferOverflow = BufferOverflow.SUSPEND//缓存策略,三种 丢掉最新值、丢掉最旧值和挂起
)
// )
val
sharedFlow
:
SharedFlow
<
Int
>
=
mutableSharedFlow
// val sharedFlow: SharedFlow<Int> = mutableSharedFlow
//
val
parentView
=
binding
.
root
.
parent
as
View
// val parentView = binding.root.parent as View
val
behavior
=
BottomSheetBehavior
.
from
(
parentView
)
// val behavior = BottomSheetBehavior.from(parentView)
//展开
// //展开
behavior
.
state
=
BottomSheetBehavior
.
STATE_EXPANDED
// behavior.state = BottomSheetBehavior.STATE_EXPANDED
// 设置禁止通过拖动来隐藏
// // 设置禁止通过拖动来隐藏
behavior
.
isHideable
=
false
// behavior.isHideable = false
//
// 禁止点击外部区域关闭
// // 禁止点击外部区域关闭
dialog
.
setOnCancelListener
{
dialogInterface
->
// dialog.setOnCancelListener { dialogInterface ->
dialogInterface
.
cancel
()
// 这里可以处理点击外部区域的逻辑
// dialogInterface.cancel() // 这里可以处理点击外部区域的逻辑
}
// }
//
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
// lifecycleScope.launch(Dispatchers.IO) {
//
val
arrayList
=
arrayListOf
<
String
>().
apply
{
// val arrayList = arrayListOf<String>().apply {
addAll
(
list
)
// addAll(list)
}
// }
var
index
=
0
// var index = 0
while
(
arrayList
.
isNotEmpty
())
{
// while (arrayList.isNotEmpty()) {
val
path
=
arrayList
[
0
]
// val path = arrayList[0]
arrayList
.
removeAt
(
0
)
// arrayList.removeAt(0)
val
file
=
File
(
path
)
// val file = File(path)
runCatching
{
// runCatching {
val
recoveryFile
=
File
(
dir
,
file
.
name
)
// val recoveryFile = File(dir, file.name)
file
.
copyTo
(
recoveryFile
,
true
)
// file.copyTo(recoveryFile, true)
}
// }
mutableSharedFlow
.
emit
(
index
)
// mutableSharedFlow.emit(index)
delay
(
Random
.
nextLong
(
500
,
1500
))
// delay(Random.nextLong(500, 1500))
index
++
// index++
}
// }
mutableSharedFlow
.
emit
(-
1
)
// mutableSharedFlow.emit(-1)
}
// }
//
lifecycleScope
.
launch
(
Dispatchers
.
Main
)
{
// lifecycleScope.launch(Dispatchers.Main) {
sharedFlow
.
collectLatest
{
// sharedFlow.collectLatest {
// LogEx.logDebug(TAG, "Flow $it")
//// LogEx.logDebug(TAG, "Flow $it")
if
(
it
==
-
1
)
{
// if (it == -1) {
finish
.
invoke
()
// finish.invoke()
dialog
.
dismiss
()
// dialog.dismiss()
cancel
()
// cancel()
}
else
{
// } else {
val
process
=
it
.
toFloat
()
/
list
.
size
.
toFloat
()
// val process = it.toFloat() / list.size.toFloat()
if
(
process
>
0.3
)
{
// if (process > 0.3) {
copyProgressAction
.
invoke
()
// copyProgressAction.invoke()
}
// }
binding
.
tvNumber
.
text
=
"${it + 1}/${list.size}"
// binding.tvNumber.text = "${it + 1}/${list.size}"
}
// }
}
// }
}
// }
//
dialog
.
show
()
// dialog.show()
}
// }
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/recovery/RecoveryFilterAdapter.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.recovery
//package com.base.appzxhy.ui.recovery
//
import
android.annotation.SuppressLint
//import android.annotation.SuppressLint
import
android.graphics.Color
//import android.graphics.Color
import
android.view.LayoutInflater
//import android.view.LayoutInflater
import
android.view.View
//import android.view.View
import
android.view.ViewGroup
//import android.view.ViewGroup
import
androidx.annotation.Dimension
//import androidx.annotation.Dimension
import
androidx.core.view.isVisible
//import androidx.core.view.isVisible
import
androidx.recyclerview.widget.RecyclerView
//import androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView.ViewHolder
//import androidx.recyclerview.widget.RecyclerView.ViewHolder
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.bean.recovery.RecoveryFilterBean
//import com.base.appzxhy.bean.recovery.RecoveryFilterBean
import
com.base.appzxhy.databinding.ItemRecoveryFilterBinding
//import com.base.appzxhy.databinding.ItemRecoveryFilterBinding
import
androidx.core.graphics.toColorInt
//import androidx.core.graphics.toColorInt
//
class
RecoveryFilterAdapter
(
//class RecoveryFilterAdapter(
val
click
:
(
bean
:
RecoveryFilterBean
)
->
Unit
// val click: (bean: RecoveryFilterBean) -> Unit
)
:
RecyclerView
.
Adapter
<
RecoveryFilterAdapter
.
YYDS
>()
{
//) : RecyclerView.Adapter<RecoveryFilterAdapter.YYDS>() {
//
private
val
beanList
=
arrayListOf
<
RecoveryFilterBean
>()
// private val beanList = arrayListOf<RecoveryFilterBean>()
//
inner
class
YYDS
(
view
:
View
)
:
ViewHolder
(
view
)
// inner class YYDS(view: View) : ViewHolder(view)
//
fun
Int
.
inflate
(
parent
:
ViewGroup
,
attachToRoot
:
Boolean
=
false
):
View
{
// fun Int.inflate(parent: ViewGroup, attachToRoot: Boolean = false): View {
return
LayoutInflater
.
from
(
parent
.
context
).
inflate
(
this
,
parent
,
attachToRoot
)
// return LayoutInflater.from(parent.context).inflate(this, parent, attachToRoot)
}
// }
//
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
YYDS
{
// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): YYDS {
return
YYDS
(
R
.
layout
.
item_recovery_filter
.
inflate
(
parent
))
// return YYDS(R.layout.item_recovery_filter.inflate(parent))
}
// }
//
override
fun
getItemCount
():
Int
{
// override fun getItemCount(): Int {
return
beanList
.
size
// return beanList.size
}
// }
//
override
fun
onBindViewHolder
(
holder
:
YYDS
,
position
:
Int
)
{
// override fun onBindViewHolder(holder: YYDS, position: Int) {
val
binding
=
ItemRecoveryFilterBinding
.
bind
(
holder
.
itemView
)
// val binding = ItemRecoveryFilterBinding.bind(holder.itemView)
val
bean
=
beanList
[
position
]
// val bean = beanList[position]
val
context
=
holder
.
itemView
.
context
// val context = holder.itemView.context
binding
.
tv
.
text
=
bean
.
tittle
// binding.tv.text = bean.tittle
binding
.
iv
.
isVisible
=
bean
.
isSelect
// binding.iv.isVisible = bean.isSelect
if
(
bean
.
isSelect
)
{
// if (bean.isSelect) {
binding
.
tv
.
setTextColor
(
Color
.
BLACK
)
// binding.tv.setTextColor(Color.BLACK)
binding
.
tv
.
setTextSize
(
Dimension
.
SP
,
18f
)
// binding.tv.setTextSize(Dimension.SP, 18f)
}
else
{
// } else {
binding
.
tv
.
setTextColor
(
"#747474"
.
toColorInt
())
// binding.tv.setTextColor("#747474".toColorInt())
binding
.
tv
.
setTextSize
(
Dimension
.
SP
,
16f
)
// binding.tv.setTextSize(Dimension.SP, 16f)
}
// }
binding
.
root
.
setOnClickListener
{
// binding.root.setOnClickListener {
click
.
invoke
(
bean
)
// click.invoke(bean)
}
// }
}
// }
//
@SuppressLint
(
"NotifyDataSetChanged"
)
// @SuppressLint("NotifyDataSetChanged")
fun
setData
(
list
:
List
<
RecoveryFilterBean
>)
{
// fun setData(list: List<RecoveryFilterBean>) {
beanList
.
clear
()
// beanList.clear()
beanList
.
addAll
(
list
)
// beanList.addAll(list)
notifyDataSetChanged
()
// notifyDataSetChanged()
}
// }
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/recyclebin/RecycleBinAdapter.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.recyclebin
//package com.base.appzxhy.ui.recyclebin
//
import
android.content.Context
//import android.content.Context
import
android.view.ViewGroup
//import android.view.ViewGroup
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.databinding.ItemRecoveryBinBinding
//import com.base.appzxhy.databinding.ItemRecoveryBinBinding
import
com.base.appzxhy.ui.adapter.CommonViewHolder
//import com.base.appzxhy.ui.adapter.CommonViewHolder
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getImgRes
//import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getImgRes
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mImageStr
//import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mImageStr
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mVideoStr
//import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mVideoStr
import
com.base.appzxhy.utils.KotlinExt.toFormatSize
//import com.base.appzxhy.utils.KotlinExt.toFormatSize
import
com.base.appzxhy.utils.XmlEx.inflate
//import com.base.appzxhy.utils.XmlEx.inflate
import
com.bumptech.glide.Glide
//import com.bumptech.glide.Glide
import
com.chad.library.adapter4.BaseQuickAdapter
//import com.chad.library.adapter4.BaseQuickAdapter
import
java.io.File
//import java.io.File
//
class
RecycleBinAdapter
:
BaseQuickAdapter
<
File
,
CommonViewHolder
>()
{
//class RecycleBinAdapter : BaseQuickAdapter<File, CommonViewHolder>() {
//
var
clickAction
:
((
file
:
File
)
->
Unit
)?
=
null
// var clickAction: ((file: File) -> Unit)? = null
//
override
fun
onBindViewHolder
(
holder
:
CommonViewHolder
,
position
:
Int
,
item
:
File
?)
{
// override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: File?) {
item
?:
return
// item ?: return
val
binding
=
ItemRecoveryBinBinding
.
bind
(
holder
.
itemView
)
// val binding = ItemRecoveryBinBinding.bind(holder.itemView)
val
context
=
holder
.
itemView
.
context
// val context = holder.itemView.context
//
if
(
mImageStr
.
contains
(
"."
+
item
.
extension
)
||
mVideoStr
.
contains
(
"."
+
item
.
extension
))
{
// if (mImageStr.contains("." + item.extension) || mVideoStr.contains("." + item.extension)) {
Glide
.
with
(
context
).
load
(
item
.
absoluteFile
).
into
(
binding
.
icon
)
// Glide.with(context).load(item.absoluteFile).into(binding.icon)
}
else
{
// } else {
binding
.
icon
.
setImageResource
(
item
.
getImgRes
())
// binding.icon.setImageResource(item.getImgRes())
}
// }
binding
.
tvName
.
text
=
item
.
name
// binding.tvName.text = item.name
binding
.
tvSize
.
text
=
item
.
length
().
toFormatSize
()
// binding.tvSize.text = item.length().toFormatSize()
binding
.
root
.
setOnClickListener
{
// binding.root.setOnClickListener {
clickAction
?.
invoke
(
item
)
// clickAction?.invoke(item)
}
// }
}
// }
//
override
fun
onCreateViewHolder
(
// override fun onCreateViewHolder(
context
:
Context
,
// context: Context,
parent
:
ViewGroup
,
// parent: ViewGroup,
viewType
:
Int
// viewType: Int
):
CommonViewHolder
{
// ): CommonViewHolder {
return
CommonViewHolder
(
R
.
layout
.
item_recovery_bin
.
inflate
(
parent
))
// return CommonViewHolder(R.layout.item_recovery_bin.inflate(parent))
}
// }
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/recyclebin/RecycleBinDetailActivity.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.recyclebin
//package com.base.appzxhy.ui.recyclebin
//
import
android.os.Environment
//import android.os.Environment
import
android.view.View
//import android.view.View
import
androidx.lifecycle.lifecycleScope
//import androidx.lifecycle.lifecycleScope
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.base.BaseActivity
//import com.base.appzxhy.base.BaseActivity
import
com.base.appzxhy.business.ads.AdsMgr
//import com.base.appzxhy.business.ads.AdsMgr
import
com.base.appzxhy.business.ads.AdsShowCallBack
//import com.base.appzxhy.business.ads.AdsShowCallBack
import
com.base.appzxhy.databinding.ActivityRecycleBinDetailBinding
//import com.base.appzxhy.databinding.ActivityRecycleBinDetailBinding
import
com.base.appzxhy.ui.recovery.FileRecoveredActivity
//import com.base.appzxhy.ui.recovery.FileRecoveredActivity
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getImgRes
//import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getImgRes
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getType
//import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getType
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mImageStr
//import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mImageStr
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mVideoStr
//import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mVideoStr
import
com.base.appzxhy.utils.FileUtils.deleteIfExists
//import com.base.appzxhy.utils.FileUtils.deleteIfExists
import
com.base.appzxhy.utils.KotlinExt.toFormatSize
//import com.base.appzxhy.utils.KotlinExt.toFormatSize
import
com.base.appzxhy.utils.KotlinExt.toFormatTime
//import com.base.appzxhy.utils.KotlinExt.toFormatTime
import
com.bumptech.glide.Glide
//import com.bumptech.glide.Glide
import
kotlinx.coroutines.launch
//import kotlinx.coroutines.launch
import
java.io.File
//import java.io.File
//
class
RecycleBinDetailActivity
:
BaseActivity
<
ActivityRecycleBinDetailBinding
>(
ActivityRecycleBinDetailBinding
::
inflate
)
{
//class RecycleBinDetailActivity : BaseActivity<ActivityRecycleBinDetailBinding>(ActivityRecycleBinDetailBinding::inflate) {
//
companion
object
{
// companion object {
lateinit
var
recycleBinFile
:
File
// lateinit var recycleBinFile: File
}
// }
//
override
fun
initView
()
{
// override fun initView() {
super
.
initView
()
// super.initView()
if
(
mImageStr
.
contains
(
"."
+
recycleBinFile
.
extension
)
||
mVideoStr
.
contains
(
"."
+
recycleBinFile
.
extension
))
{
// if (mImageStr.contains("." + recycleBinFile.extension) || mVideoStr.contains("." + recycleBinFile.extension)) {
Glide
.
with
(
this
).
load
(
recycleBinFile
.
absoluteFile
).
placeholder
(
R
.
drawable
.
icon_file
).
into
(
binding
.
iv
)
// Glide.with(this).load(recycleBinFile.absoluteFile).placeholder(R.drawable.icon_file).into(binding.iv)
}
else
{
// } else {
binding
.
iv
.
setImageResource
(
recycleBinFile
.
getImgRes
())
// binding.iv.setImageResource(recycleBinFile.getImgRes())
}
// }
binding
.
tvPath
.
text
=
recycleBinFile
.
absolutePath
// binding.tvPath.text = recycleBinFile.absolutePath
binding
.
tvSize
.
text
=
recycleBinFile
.
length
().
toFormatSize
()
// binding.tvSize.text = recycleBinFile.length().toFormatSize()
binding
.
tvTime
.
text
=
recycleBinFile
.
lastModified
().
toFormatTime
()
// binding.tvTime.text = recycleBinFile.lastModified().toFormatTime()
//
functionInAd
{
// functionInAd {
binding
.
v
.
visibility
=
View
.
GONE
// binding.v.visibility = View.GONE
}
// }
}
// }
//
override
fun
initListener
()
{
// override fun initListener() {
super
.
initListener
()
// super.initListener()
//
//
binding
.
ivBack
.
setOnClickListener
{
// binding.ivBack.setOnClickListener {
binding
.
v
.
visibility
=
View
.
VISIBLE
// binding.v.visibility = View.VISIBLE
onBackPressedDispatcher
.
onBackPressed
()
// onBackPressedDispatcher.onBackPressed()
finish
()
// finish()
}
// }
binding
.
ivDelete
.
setOnClickListener
{
// binding.ivDelete.setOnClickListener {
lifecycleScope
.
launch
{
// lifecycleScope.launch {
recycleBinFile
.
deleteIfExists
()
// recycleBinFile.deleteIfExists()
}
// }
onBackPressedDispatcher
.
onBackPressed
()
// onBackPressedDispatcher.onBackPressed()
finish
()
// finish()
}
// }
binding
.
tvRestore
.
setOnClickListener
{
// binding.tvRestore.setOnClickListener {
lifecycleScope
.
launch
{
// lifecycleScope.launch {
restore
()
// restore()
}
// }
AdsMgr
.
showInsert
(
this
,
showCallBack
=
object
:
AdsShowCallBack
()
{
// AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override
fun
show
()
{
// override fun show() {
super
.
show
()
// super.show()
binding
.
v
.
visibility
=
View
.
VISIBLE
// binding.v.visibility = View.VISIBLE
}
// }
//
override
fun
next
()
{
// override fun next() {
goToAc
(
FileRecoveredActivity
::
class
.
java
,
exb
=
{
// goToAc(FileRecoveredActivity::class.java, exb = {
putExtra
(
"Number"
,
1
)
// putExtra("Number", 1)
putExtra
(
"ScanType"
,
recycleBinFile
.
getType
())
// putExtra("ScanType", recycleBinFile.getType())
})
// })
finish
()
// finish()
}
// }
})
// })
//
}
// }
}
// }
//
fun
restore
()
{
// fun restore() {
val
appName
=
getString
(
R
.
string
.
app_name
).
replace
(
"/"
,
" "
)
// val appName = getString(R.string.app_name).replace("/", " ")
val
appDir
=
File
(
Environment
.
getExternalStorageDirectory
(),
appName
)
// val appDir = File(Environment.getExternalStorageDirectory(), appName)
val
dir
=
File
(
appDir
,
"Restore"
)
// val dir = File(appDir, "Restore")
if
(!
dir
.
exists
())
{
// if (!dir.exists()) {
dir
.
mkdirs
()
// dir.mkdirs()
}
// }
val
recoveryFile
=
File
(
dir
,
recycleBinFile
.
name
)
// val recoveryFile = File(dir, recycleBinFile.name)
recycleBinFile
.
copyTo
(
recoveryFile
,
true
)
// recycleBinFile.copyTo(recoveryFile, true)
recycleBinFile
.
deleteIfExists
()
// recycleBinFile.deleteIfExists()
//
}
// }
//
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/recyclebin/RecycleBinFragment.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.recyclebin
//package com.base.appzxhy.ui.recyclebin
//
import
androidx.core.view.isVisible
//import androidx.core.view.isVisible
import
androidx.lifecycle.lifecycleScope
//import androidx.lifecycle.lifecycleScope
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.base.BaseFragment
//import com.base.appzxhy.base.BaseFragment
import
com.base.appzxhy.base.goToAc
//import com.base.appzxhy.base.goToAc
import
com.base.appzxhy.business.ads.AdsMgr
//import com.base.appzxhy.business.ads.AdsMgr
import
com.base.appzxhy.databinding.FragmentRecycleBinBinding
//import com.base.appzxhy.databinding.FragmentRecycleBinBinding
import
com.base.appzxhy.ui.main.MainActivity
//import com.base.appzxhy.ui.main.MainActivity
import
kotlinx.coroutines.flow.collectLatest
//import kotlinx.coroutines.flow.collectLatest
import
kotlinx.coroutines.launch
//import kotlinx.coroutines.launch
//
class
RecycleBinFragment
:
BaseFragment
<
FragmentRecycleBinBinding
>(
FragmentRecycleBinBinding
::
inflate
)
{
//class RecycleBinFragment : BaseFragment<FragmentRecycleBinBinding>(FragmentRecycleBinBinding::inflate) {
//
private
val
adapter
=
RecycleBinAdapter
()
// private val adapter = RecycleBinAdapter()
override
fun
initView
()
{
// override fun initView() {
super
.
initView
()
// super.initView()
AdsMgr
.
showNative
(
binding
.
flAd
,
R
.
layout
.
layout_admob_native_custom
)
// AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
binding
.
rv
.
adapter
=
adapter
// binding.rv.adapter = adapter
//
lifecycleScope
.
launch
{
// lifecycleScope.launch {
(
requireActivity
()
as
MainActivity
).
viewModel
.
recycleBinFileFlow
.
collectLatest
{
// (requireActivity() as MainActivity).viewModel.recycleBinFileFlow.collectLatest {
binding
.
llEmpty
.
isVisible
=
it
.
isEmpty
()
// binding.llEmpty.isVisible = it.isEmpty()
adapter
.
submitList
(
it
)
// adapter.submitList(it)
}
// }
}
// }
}
// }
//
override
fun
initListener
()
{
// override fun initListener() {
super
.
initListener
()
// super.initListener()
adapter
.
clickAction
=
{
// adapter.clickAction = {
RecycleBinDetailActivity
.
recycleBinFile
=
it
// RecycleBinDetailActivity.recycleBinFile = it
goToAc
(
RecycleBinDetailActivity
::
class
.
java
)
// goToAc(RecycleBinDetailActivity::class.java)
}
// }
}
// }
//
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/recyclebin/RecycleBinUtils.kt
View file @
d00f1ecb
package
com.base.appzxhy.ui.recyclebin
//package com.base.appzxhy.ui.recyclebin
//
import
com.base.appzxhy.MyApplication
//import com.base.appzxhy.MyApplication
import
com.base.appzxhy.R
//import com.base.appzxhy.R
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_AUDIOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_AUDIOS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_DOCUMENTS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_DOCUMENTS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
import
com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
//import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
import
java.io.File
//import java.io.File
//
object
RecycleBinUtils
{
//object RecycleBinUtils {
//
val
mImageStr
:
Set
<
String
>
=
HashSet
(
// val mImageStr: Set<String> = HashSet(
mutableListOf
(
".jpg"
,
".jpeg"
,
".png"
,
".gif"
,
".bmp"
)
// mutableListOf(".jpg", ".jpeg", ".png", ".gif", ".bmp")
)
// )
val
mVideoStr
:
Set
<
String
>
=
HashSet
(
// val mVideoStr: Set<String> = HashSet(
mutableListOf
(
".mp4"
,
".avi"
,
".mov"
,
".mkv"
)
// mutableListOf(".mp4", ".avi", ".mov", ".mkv")
)
// )
val
mAudioStr
:
Set
<
String
>
=
HashSet
(
// val mAudioStr: Set<String> = HashSet(
mutableListOf
(
".mp3"
,
".flac"
,
".wav"
)
// mutableListOf(".mp3", ".flac", ".wav")
)
// )
//
val
mDocumentStr
:
Set
<
String
>
=
HashSet
(
mutableListOf
(
".doc"
,
".docx"
,
".xls"
,
".xlsx"
,
".ppt"
,
".pptx"
,
".pdf"
))
// val mDocumentStr: Set<String> = HashSet(mutableListOf(".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf"))
//
fun
File
.
getType
():
Int
{
// fun File.getType(): Int {
if
(
mImageStr
.
contains
(
"."
+
extension
))
{
// if (mImageStr.contains("." + extension)) {
return
SCAN_PHOTOS
// return SCAN_PHOTOS
}
// }
if
(
mVideoStr
.
contains
(
"."
+
extension
))
{
// if (mVideoStr.contains("." + extension)) {
return
SCAN_VIDEOS
// return SCAN_VIDEOS
}
// }
if
(
mAudioStr
.
contains
(
"."
+
extension
))
{
// if (mAudioStr.contains("." + extension)) {
return
SCAN_AUDIOS
// return SCAN_AUDIOS
}
// }
if
(
mDocumentStr
.
contains
(
"."
+
extension
))
{
// if (mDocumentStr.contains("." + extension)) {
return
SCAN_DOCUMENTS
// return SCAN_DOCUMENTS
}
// }
//
return
-
1
// return -1
}
// }
//
fun
File
.
getImgRes
():
Int
{
// fun File.getImgRes(): Int {
return
when
(
extension
)
{
// return when (extension) {
"mp3"
->
R
.
drawable
.
mp3
// "mp3" -> R.drawable.mp3
"flac"
->
R
.
drawable
.
flac
// "flac" -> R.drawable.flac
"doc"
,
"docx"
->
R
.
drawable
.
doc
// "doc", "docx" -> R.drawable.doc
"xls"
,
"xlsx"
->
R
.
drawable
.
xls
// "xls", "xlsx" -> R.drawable.xls
"ppt"
,
"pptx"
->
R
.
drawable
.
ppt
// "ppt", "pptx" -> R.drawable.ppt
else
->
R
.
drawable
.
icon_file
// else -> R.drawable.icon_file
}
// }
}
// }
//
fun
getRecycleBinData
():
List
<
File
>
{
// fun getRecycleBinData(): List<File> {
val
recycleBinDir
=
File
(
MyApplication
.
Companion
.
appContext
.
filesDir
,
"recycleBin"
)
// val recycleBinDir = File(MyApplication.Companion.appContext.filesDir, "recycleBin")
if
(
recycleBinDir
.
exists
())
{
// if (recycleBinDir.exists()) {
return
recycleBinDir
.
listFiles
()
?.
toList
()
?:
listOf
()
// return recycleBinDir.listFiles()?.toList() ?: listOf()
}
else
{
// } else {
return
listOf
()
// return listOf()
}
// }
}
// }
//
fun
addRecycleBinFile
(
file
:
File
)
{
// fun addRecycleBinFile(file: File) {
val
recycleBinDir
=
File
(
MyApplication
.
Companion
.
appContext
.
filesDir
,
"recycleBin"
)
// val recycleBinDir = File(MyApplication.Companion.appContext.filesDir, "recycleBin")
if
(!
recycleBinDir
.
exists
())
{
// if (!recycleBinDir.exists()) {
recycleBinDir
.
mkdirs
()
// recycleBinDir.mkdirs()
}
// }
//
val
recycleBinFile
=
File
(
recycleBinDir
,
file
.
name
)
// val recycleBinFile = File(recycleBinDir, file.name)
//
file
.
copyTo
(
recycleBinFile
,
true
)
// file.copyTo(recycleBinFile, true)
}
// }
//
//
}
//}
\ No newline at end of file
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/similar/SimilarPhotosActivity.kt
View file @
d00f1ecb
...
@@ -28,8 +28,6 @@ import com.base.appzxhy.databinding.ItemSimilarPhotosBinding
...
@@ -28,8 +28,6 @@ import com.base.appzxhy.databinding.ItemSimilarPhotosBinding
import
com.base.appzxhy.databinding.ItemSimilarPhotosChildBinding
import
com.base.appzxhy.databinding.ItemSimilarPhotosChildBinding
import
com.base.appzxhy.ui.cleanresult.CleanResultActivity
import
com.base.appzxhy.ui.cleanresult.CleanResultActivity
import
com.base.appzxhy.ui.dialog.ConfirmDialog
import
com.base.appzxhy.ui.dialog.ConfirmDialog
import
com.base.appzxhy.ui.recyclebin.RecycleBinUtils
import
com.base.appzxhy.ui.similar.SimilarPhotosActivity
import
com.base.appzxhy.utils.FileUtils
import
com.base.appzxhy.utils.FileUtils
import
com.base.appzxhy.utils.MediaUtils
import
com.base.appzxhy.utils.MediaUtils
import
com.base.appzxhy.utils.Utils
import
com.base.appzxhy.utils.Utils
...
@@ -293,7 +291,6 @@ class SimilarPhotosActivity : BaseActivity<ActivitySimilarPhotosBinding>(Activit
...
@@ -293,7 +291,6 @@ class SimilarPhotosActivity : BaseActivity<ActivitySimilarPhotosBinding>(Activit
paths
.
forEach
{
paths
.
forEach
{
val
file
=
File
(
it
)
val
file
=
File
(
it
)
cleanedSize
=
cleanedSize
+
file
.
length
()
cleanedSize
=
cleanedSize
+
file
.
length
()
RecycleBinUtils
.
addRecycleBinFile
(
file
)
FileUtils
.
deleteFile
(
it
)
FileUtils
.
deleteFile
(
it
)
}
}
launch
(
Dispatchers
.
Main
)
{
MediaUtils
.
updateMedia
(
applicationContext
,
paths
)
}
launch
(
Dispatchers
.
Main
)
{
MediaUtils
.
updateMedia
(
applicationContext
,
paths
)
}
...
...
app/src/main/java/com/base/appzxhy/ui/splash/SplashActivity.kt
View file @
d00f1ecb
...
@@ -39,11 +39,9 @@ import com.base.appzxhy.ui.guide.GuideCleanActivity
...
@@ -39,11 +39,9 @@ import com.base.appzxhy.ui.guide.GuideCleanActivity
import
com.base.appzxhy.ui.main.MainActivity
import
com.base.appzxhy.ui.main.MainActivity
import
com.base.appzxhy.utils.PermissionUtils.checkStorePermission
import
com.base.appzxhy.utils.PermissionUtils.checkStorePermission
import
com.base.appzxhy.utils.PermissionUtils.requestStoragePermission
import
com.base.appzxhy.utils.PermissionUtils.requestStoragePermission
import
com.base.appzxhy.utils.ToastUtils.toast
import
com.base.appzxhy.utils.UmpUtils
import
com.base.appzxhy.utils.UmpUtils
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
java.util.concurrent.atomic.AtomicBoolean
import
java.util.concurrent.atomic.AtomicBoolean
...
...
app/src/main/res/drawable/bg_splash_button.xml
View file @
d00f1ecb
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<gradient
<gradient
android:endColor=
"
#328EF6
"
android:endColor=
"
@color/colorPrimary
"
android:startColor=
"
#328EF6
"
/>
android:startColor=
"
@color/colorPrimary
"
/>
<corners
android:radius=
"@dimen/dp_10"
/>
<corners
android:radius=
"@dimen/dp_10"
/>
</shape>
</shape>
\ No newline at end of file
app/src/main/res/layout/activity_language.xml
0 → 100644
View file @
d00f1ecb
<?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"
tools:context=
".ui.language.LanguageActivity"
>
<FrameLayout
app:layout_constraintTop_toTopOf=
"parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/activity_main.xml
View file @
d00f1ecb
...
@@ -5,49 +5,16 @@
...
@@ -5,49 +5,16 @@
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
android:layout_height=
"match_parent"
>
<FrameLayout
<fragment
android:id=
"@+id/fl_container"
android:id=
"@+id/fragment"
android:name=
"com.base.appzxhy.ui.main.HomeFragment"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_height=
"0dp"
app:layout_constraintBottom_toTopOf=
"@id/flBottom"
app:layout_constraintTop_toTopOf=
"parent"
>
<androidx.viewpager2.widget.ViewPager2
android:id=
"@+id/viewPager2"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:overScrollMode=
"never"
android:scrollbars=
"none"
/>
</FrameLayout>
<FrameLayout
android:id=
"@+id/flBottom"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginBottom=
"@dimen/dp_60"
android:layout_marginBottom=
"@dimen/dp_60"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/fl_container"
>
app:layout_constraintTop_toTopOf=
"parent"
>
<com.google.android.material.tabs.TabLayout
android:id=
"@+id/tabLayout"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"@color/white"
app:tabIndicatorHeight=
"0dp"
app:tabMinWidth=
"100dp"
app:tabMode=
"fixed"
app:tabRippleColor=
"@android:color/transparent"
tools:ignore=
"SpeakableTextPresentCheck"
/>
<View
android:layout_width=
"match_parent"
android:layout_height=
"1dp"
android:layout_gravity=
"bottom"
android:background=
"#F5F5F5"
/>
</
FrameLayou
t>
</
fragmen
t>
<FrameLayout
<FrameLayout
android:id=
"@+id/flBanner"
android:id=
"@+id/flBanner"
...
...
app/src/main/res/layout/fragment_home.xml
View file @
d00f1ecb
...
@@ -6,86 +6,6 @@
...
@@ -6,86 +6,6 @@
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"@color/white"
>
android:background=
"@color/white"
>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/tv_app_name"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"15dp"
android:paddingVertical=
"15dp"
android:text=
"@string/file_recovery"
android:textColor=
"#000000"
android:textSize=
"19sp"
android:textStyle=
"bold"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
<androidx.appcompat.widget.AppCompatImageView
android:id=
"@+id/ivVips"
android:layout_width=
"32dp"
android:layout_height=
"32dp"
android:layout_marginStart=
"8dp"
android:src=
"@drawable/h_vip_s"
android:visibility=
"gone"
app:layout_constraintBottom_toBottomOf=
"@id/tv_app_name"
app:layout_constraintStart_toEndOf=
"@id/tv_app_name"
app:layout_constraintTop_toTopOf=
"@id/tv_app_name"
/>
<androidx.appcompat.widget.AppCompatImageView
android:id=
"@+id/ivVip"
android:layout_width=
"@dimen/dp_30"
android:layout_height=
"@dimen/dp_30"
android:layout_marginEnd=
"14dp"
android:src=
"@drawable/h_vip"
android:visibility=
"gone"
app:layout_constraintBottom_toBottomOf=
"@id/tv_app_name"
app:layout_constraintEnd_toStartOf=
"@id/ll_weather"
app:layout_constraintTop_toTopOf=
"@id/tv_app_name"
/>
<LinearLayout
android:id=
"@+id/ll_weather"
android:layout_width=
"wrap_content"
android:layout_height=
"36dp"
android:layout_marginEnd=
"20dp"
android:background=
"@drawable/bg_f3f5f7_61"
android:orientation=
"horizontal"
app:layout_constraintBottom_toBottomOf=
"@id/tv_app_name"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"@id/tv_app_name"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"15dp"
android:layout_marginEnd=
"2dp"
android:includeFontPadding=
"false"
android:text=
"20"
android:textColor=
"#000000"
android:textSize=
"14sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginEnd=
"4dp"
android:includeFontPadding=
"false"
android:text=
"℃"
android:textColor=
"#000000"
android:textSize=
"14sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<ImageView
android:layout_width=
"26dp"
android:layout_height=
"26dp"
android:layout_gravity=
"center_vertical"
android:layout_marginEnd=
"9dp"
android:src=
"@drawable/tianqi"
tools:ignore=
"ContentDescription"
/>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv"
android:id=
"@+id/rv"
...
@@ -94,7 +14,6 @@
...
@@ -94,7 +14,6 @@
android:overScrollMode=
"never"
android:overScrollMode=
"never"
android:paddingHorizontal=
"8dp"
android:paddingHorizontal=
"8dp"
app:layoutManager=
"androidx.recyclerview.widget.LinearLayoutManager"
app:layoutManager=
"androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
/>
app:layout_constraintTop_toBottomOf=
"@+id/tv_app_name"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_home3.xml
0 → 100644
View file @
d00f1ecb
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:context=
".ui.main.Home3Fragment"
>
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:text=
"@string/hello_blank_fragment"
/>
</FrameLayout>
\ No newline at end of file
app/src/main/res/mipmap-xxhdpi/logo.png
View replaced file @
5d17874e
View file @
d00f1ecb
This diff is collapsed.
Click to expand it.
app/src/main/res/values/colors.xml
View file @
d00f1ecb
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
<color
name=
"black"
>
#FF000000
</color>
<color
name=
"black"
>
#FF000000
</color>
<color
name=
"white"
>
#FFFFFFFF
</color>
<color
name=
"white"
>
#FFFFFFFF
</color>
<color
name=
"transparent"
>
#00000000
</color>
<color
name=
"transparent"
>
#00000000
</color>
<color
name=
"colorPrimary"
>
#
328EF6
</color>
<color
name=
"colorPrimary"
>
#
2DD29E
</color>
<color
name=
"colorDisEnable"
>
#FF7DB9FF
</color>
<color
name=
"colorDisEnable"
>
#FF7DB9FF
</color>
<color
name=
"color_66000000"
>
#66000000
</color>
<color
name=
"color_66000000"
>
#66000000
</color>
...
...
app/src/main/res/values/strings.xml
View file @
d00f1ecb
<resources>
<resources>
<string
name=
"app_name"
>
Dumpster Cleaner
</string>
<string
name=
"app_name"
>
Master Malware Clean
</string>
<string
name=
"hello_blank_fragment"
>
Hello blank fragment
</string>
<string
name=
"hello_blank_fragment"
>
Hello blank fragment
</string>
<string
name=
"facebook_app_id"
>
4512448902756291
</string>
<string
name=
"facebook_app_id"
>
4512448902756291
</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