Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
F
FileManager
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
yanglin
FileManager
Commits
c81d9d2a
Commit
c81d9d2a
authored
Apr 16, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
替换包名
parent
28cd9e39
Hide whitespace changes
Inline
Side-by-side
Showing
51 changed files
with
2954 additions
and
3051 deletions
+2954
-3051
build.gradle
MyDemo3/app/build.gradle
+2
-2
ExampleInstrumentedTest.kt
...ndroidTest/java/com/xm/mydemo3/ExampleInstrumentedTest.kt
+1
-1
AndroidManifest.xml
MyDemo3/app/src/main/AndroidManifest.xml
+7
-3
HomeViewPagerAdapter.kt
...ain/java/com/test/mydemo3/adapter/HomeViewPagerAdapter.kt
+0
-11
MainActivity.kt
...pp/src/main/java/com/xm/test/myfilemaster/MainActivity.kt
+9
-8
MyApplication.kt
...p/src/main/java/com/xm/test/myfilemaster/MyApplication.kt
+100
-101
BaseActivityViewModel.kt
...om/xm/test/myfilemaster/activity/BaseActivityViewModel.kt
+26
-26
BatteryActivity.kt
...java/com/xm/test/myfilemaster/activity/BatteryActivity.kt
+5
-6
CleanActivity.kt
...n/java/com/xm/test/myfilemaster/activity/CleanActivity.kt
+9
-10
FileManagerActivity.kt
.../com/xm/test/myfilemaster/activity/FileManagerActivity.kt
+5
-5
HomeActivity.kt
...in/java/com/xm/test/myfilemaster/activity/HomeActivity.kt
+6
-21
InternalStorageActivity.kt
.../xm/test/myfilemaster/activity/InternalStorageActivity.kt
+6
-16
MediaActivity.kt
...n/java/com/xm/test/myfilemaster/activity/MediaActivity.kt
+5
-6
MoveOrCopyActivity.kt
...a/com/xm/test/myfilemaster/activity/MoveOrCopyActivity.kt
+6
-13
ScanEmptyFilesActivity.kt
...m/xm/test/myfilemaster/activity/ScanEmptyFilesActivity.kt
+5
-10
ScanLargeFilesActivity.kt
...m/xm/test/myfilemaster/activity/ScanLargeFilesActivity.kt
+5
-18
ScanResultActivity.kt
...a/com/xm/test/myfilemaster/activity/ScanResultActivity.kt
+4
-8
SimilarImagesActivity.kt
...om/xm/test/myfilemaster/activity/SimilarImagesActivity.kt
+9
-9
CleanAdapter.kt
...ain/java/com/xm/test/myfilemaster/adapter/CleanAdapter.kt
+280
-280
CleanAdapter2.kt
...in/java/com/xm/test/myfilemaster/adapter/CleanAdapter2.kt
+6
-6
FileSimilarAdapter.kt
...va/com/xm/test/myfilemaster/adapter/FileSimilarAdapter.kt
+56
-56
FilesItemViewAdapter.kt
.../com/xm/test/myfilemaster/adapter/FilesItemViewAdapter.kt
+130
-131
ImageItemAdapter.kt
...java/com/xm/test/myfilemaster/adapter/ImageItemAdapter.kt
+201
-201
MediaAdapter.kt
...ain/java/com/xm/test/myfilemaster/adapter/MediaAdapter.kt
+94
-100
ScanResultAdapter.kt
...ava/com/xm/test/myfilemaster/adapter/ScanResultAdapter.kt
+62
-62
SimilarBeanAdapter.kt
...va/com/xm/test/myfilemaster/adapter/SimilarBeanAdapter.kt
+120
-120
SimilarGridAdapter.kt
...va/com/xm/test/myfilemaster/adapter/SimilarGridAdapter.kt
+81
-82
AntivirusActivity.kt
...a/com/xm/test/myfilemaster/antivirus/AntivirusActivity.kt
+4
-4
BaseAbsView.kt
...rc/main/java/com/xm/test/myfilemaster/base/BaseAbsView.kt
+14
-14
BaseActivity.kt
...c/main/java/com/xm/test/myfilemaster/base/BaseActivity.kt
+558
-560
BaseActivityListener.kt
...ava/com/xm/test/myfilemaster/base/BaseActivityListener.kt
+10
-10
FileManagerFragment.kt
.../com/xm/test/myfilemaster/fragment/FileManagerFragment.kt
+9
-13
FileManagerViewModel.kt
...com/xm/test/myfilemaster/fragment/FileManagerViewModel.kt
+1
-1
HomeFragment.kt
...in/java/com/xm/test/myfilemaster/fragment/HomeFragment.kt
+12
-13
HomeViewModel.kt
...n/java/com/xm/test/myfilemaster/fragment/HomeViewModel.kt
+1
-1
InternalStorageFragment.kt
.../xm/test/myfilemaster/fragment/InternalStorageFragment.kt
+13
-14
AdConfigData.kt
.../main/java/com/xm/test/myfilemaster/model/AdConfigData.kt
+67
-67
CleanBean.kt
...src/main/java/com/xm/test/myfilemaster/model/CleanBean.kt
+8
-8
FileBean.kt
.../src/main/java/com/xm/test/myfilemaster/model/FileBean.kt
+20
-20
FilesItemBean.kt
...main/java/com/xm/test/myfilemaster/model/FilesItemBean.kt
+12
-12
BatteryUtil.kt
...rc/main/java/com/xm/test/myfilemaster/util/BatteryUtil.kt
+52
-54
FileUtil.kt
...p/src/main/java/com/xm/test/myfilemaster/util/FileUtil.kt
+445
-449
HttpRequest.kt
...rc/main/java/com/xm/test/myfilemaster/util/HttpRequest.kt
+24
-25
MediaUtil.kt
.../src/main/java/com/xm/test/myfilemaster/util/MediaUtil.kt
+113
-113
PermissionUtil.kt
...main/java/com/xm/test/myfilemaster/util/PermissionUtil.kt
+68
-74
SystemServerState.kt
...n/java/com/xm/test/myfilemaster/util/SystemServerState.kt
+37
-37
UrlManager.kt
...src/main/java/com/xm/test/myfilemaster/util/UrlManager.kt
+9
-9
CirclePgBar.java
.../main/java/com/xm/test/myfilemaster/view/CirclePgBar.java
+137
-137
CustomDialog.kt
...c/main/java/com/xm/test/myfilemaster/view/CustomDialog.kt
+98
-102
fragment_home.xml
MyDemo3/app/src/main/res/layout/fragment_home.xml
+1
-1
ExampleUnitTest.kt
MyDemo3/app/src/test/java/com/xm/mydemo3/ExampleUnitTest.kt
+1
-1
No files found.
MyDemo3/app/build.gradle
View file @
c81d9d2a
...
...
@@ -5,11 +5,11 @@ plugins {
android
{
namespace
'com.
test.mydemo3
'
namespace
'com.
xm.test.myfilemaster
'
compileSdk
34
defaultConfig
{
applicationId
"com.
tttt.datarecoveryrenew
"
applicationId
"com.
xm.test.myfilemaster
"
minSdk
25
targetSdk
33
versionCode
1
...
...
MyDemo3/app/src/androidTest/java/com/
test
/mydemo3/ExampleInstrumentedTest.kt
→
MyDemo3/app/src/androidTest/java/com/
xm
/mydemo3/ExampleInstrumentedTest.kt
View file @
c81d9d2a
package
com.
test
.mydemo3
package
com.
xm
.mydemo3
import
androidx.test.platform.app.InstrumentationRegistry
import
androidx.test.ext.junit.runners.AndroidJUnit4
...
...
MyDemo3/app/src/main/AndroidManifest.xml
View file @
c81d9d2a
...
...
@@ -108,13 +108,17 @@
<category
android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<!-- 病毒扫描,key是和包名绑定的 -->
</activity>
<!-- 病毒扫描,key是和包名绑定的 -->
<meta-data
android:name=
"com.trustlook.ApiKey"
android:value=
"b8ade465f682b1ae8bcf942eb4e07aab435ee02a10196283b38daa66"
/>
<!-- 垃圾清理 -->
android:value=
"86984b67c2db250b6a0dfd8923ac623c776c8af9ee520ba5d60e8799"
/>
<!-- 垃圾清理 -->
<meta-data
android:name=
"com.trustlook.cleansdk.ApiKey"
android:value=
"
b8ade465f682b1ae8bcf942eb4e07aab435ee02a10196283b38daa66
"
/>
android:value=
"
86984b67c2db250b6a0dfd8923ac623c776c8af9ee520ba5d60e8799
"
/>
</application>
</manifest>
\ No newline at end of file
MyDemo3/app/src/main/java/com/test/mydemo3/adapter/HomeViewPagerAdapter.kt
deleted
100644 → 0
View file @
28cd9e39
package
com.test.mydemo3.adapter
import
androidx.fragment.app.Fragment
import
androidx.viewpager2.adapter.FragmentStateAdapter
class
HomeViewPagerAdapter
()
{
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/MainActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/MainActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
package
com.
xm.test.myfilemaster
import
android.annotation.SuppressLint
import
android.content.Intent
...
...
@@ -14,12 +14,12 @@ import com.applovin.sdk.AppLovinMediationProvider
import
com.applovin.sdk.AppLovinSdk
import
com.applovin.sdk.AppLovinSdkInitializationConfiguration
import
com.kongzue.dialogx.DialogX
import
com.
test.mydemo3
.activity.HomeActivity
import
com.
test.mydemo3
.util.UrlManager
import
com.
xm.test.myfilemaster
.activity.HomeActivity
import
com.
xm.test.myfilemaster
.util.UrlManager
import
java.util.concurrent.TimeUnit
class
MainActivity
:
AppCompatActivity
()
,
MaxAdListener
{
class
MainActivity
:
AppCompatActivity
(),
MaxAdListener
{
private
lateinit
var
mProgressBar
:
ProgressBar
private
lateinit
var
interstitialAd
:
MaxInterstitialAd
...
...
@@ -45,15 +45,15 @@ class MainActivity : AppCompatActivity() , MaxAdListener {
.
build
();
val
handler
=
Handler
()
var
count
:
Int
=
0
val
runnable
=
object
:
Runnable
{
val
runnable
=
object
:
Runnable
{
override
fun
run
()
{
if
(
count
<=
100
){
if
(
count
<=
100
)
{
runOnUiThread
{
mProgressBar
.
setProgress
(
count
)
count
+=
10
}
handler
.
postDelayed
(
this
,
300
)
}
else
{
}
else
{
startVi
()
}
}
...
...
@@ -63,7 +63,8 @@ class MainActivity : AppCompatActivity() , MaxAdListener {
handler
.
postDelayed
(
runnable
,
300
)
}
}
fun
startVi
(){
fun
startVi
()
{
startActivity
(
Intent
(
this
,
HomeActivity
::
class
.
java
))
finish
()
}
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/MyApplication.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/MyApplication.kt
View file @
c81d9d2a
package
com.test.mydemo3
import
android.app.Application
import
android.content.Context
import
android.util.Log
import
androidx.lifecycle.Lifecycle
import
androidx.lifecycle.LifecycleObserver
import
androidx.lifecycle.OnLifecycleEvent
import
androidx.lifecycle.ProcessLifecycleOwner
import
com.applovin.mediation.MaxAd
import
com.applovin.mediation.MaxAdListener
import
com.applovin.mediation.MaxError
import
com.applovin.mediation.ads.MaxAppOpenAd
import
com.applovin.sdk.AppLovinSdk
import
com.applovin.sdk.AppLovinSdkConfiguration
import
com.cloud.cleanjunksdk.task.CheckSdkCallback
import
com.cloud.cleanjunksdk.task.Clean
import
com.cloud.cleanjunksdk.task.CleanSDK
import
com.cloud.cleanjunksdk.tools.Region
import
com.test.mydemo3.util.UrlManager
import
com.trustlook.sdk.cloudscan.CloudScanClient
class
MyApplication
:
Application
()
{
private
lateinit
var
appOpenManager
:
ExampleAppOpenManager
companion
object
{
var
mCleanSdk
:
Clean
?
=
null
var
mCloudScan
:
CloudScanClient
?
=
null
}
override
fun
onCreate
()
{
super
.
onCreate
()
// AppLovinSdk.getInstance( this ).initializeSdk({ configuration: AppLovinSdkConfiguration ->
// {
// appOpenManager = ExampleAppOpenManager(applicationContext)
// }
// )
// }
CleanSDK
.
init
(
MyApplication
(),
this
,
Region
.
INTL
,
object
:
CheckSdkCallback
{
override
fun
onSuccess
(
p0
:
Clean
?)
{
mCleanSdk
=
p0
!!
Log
.
e
(
"yanglin"
,
"onSuccess: clean INIT"
,
)
}
override
fun
onError
(
p0
:
Int
)
{
Log
.
e
(
"yanglin"
,
"onError: INIT"
,
)
}
})
mCloudScan
=
CloudScanClient
.
Builder
(
this
)
.
setRegion
(
com
.
trustlook
.
sdk
.
data
.
Region
.
INTL
)
.
setConnectionTimeout
(
30000
)
.
setSocketTimeout
(
30000
)
.
build
()
AppLovinSdk
.
getInstance
(
this
).
initializeSdk
{
appOpenManager
=
ExampleAppOpenManager
(
applicationContext
)
}
}
class
ExampleAppOpenManager
(
applicationContext
:
Context
?)
:
LifecycleObserver
,
MaxAdListener
{
private
lateinit
var
appOpenAd
:
MaxAppOpenAd
private
lateinit
var
context
:
Context
init
{
ProcessLifecycleOwner
.
get
().
lifecycle
.
addObserver
(
this
)
context
=
applicationContext
!!
appOpenAd
=
MaxAppOpenAd
(
UrlManager
.
AD_UNIT_ID
,
applicationContext
!!
)
appOpenAd
.
setListener
(
this
)
appOpenAd
.
loadAd
()
}
private
fun
showAdIfReady
()
{
if
(
appOpenAd
==
null
||
!
AppLovinSdk
.
getInstance
(
context
).
isInitialized
)
return
if
(
appOpenAd
.
isReady
)
{
appOpenAd
.
showAd
(
UrlManager
.
TEST_PLACEMENT_HERE
)
}
else
{
appOpenAd
.
loadAd
()
}
}
@OnLifecycleEvent
(
Lifecycle
.
Event
.
ON_START
)
fun
onStart
()
{
showAdIfReady
()
}
override
fun
onAdLoaded
(
ad
:
MaxAd
)
{}
override
fun
onAdLoadFailed
(
adUnitId
:
String
,
error
:
MaxError
)
{}
override
fun
onAdDisplayed
(
ad
:
MaxAd
)
{}
override
fun
onAdClicked
(
ad
:
MaxAd
)
{}
override
fun
onAdHidden
(
ad
:
MaxAd
)
{
appOpenAd
.
loadAd
()
}
override
fun
onAdDisplayFailed
(
ad
:
MaxAd
,
error
:
MaxError
)
{
appOpenAd
.
loadAd
()
}
}
package
com.xm.test.myfilemaster
import
android.app.Application
import
android.content.Context
import
android.util.Log
import
androidx.lifecycle.Lifecycle
import
androidx.lifecycle.LifecycleObserver
import
androidx.lifecycle.OnLifecycleEvent
import
androidx.lifecycle.ProcessLifecycleOwner
import
com.applovin.mediation.MaxAd
import
com.applovin.mediation.MaxAdListener
import
com.applovin.mediation.MaxError
import
com.applovin.mediation.ads.MaxAppOpenAd
import
com.applovin.sdk.AppLovinSdk
import
com.cloud.cleanjunksdk.task.CheckSdkCallback
import
com.cloud.cleanjunksdk.task.Clean
import
com.cloud.cleanjunksdk.task.CleanSDK
import
com.cloud.cleanjunksdk.tools.Region
import
com.trustlook.sdk.cloudscan.CloudScanClient
import
com.xm.test.myfilemaster.util.UrlManager
class
MyApplication
:
Application
()
{
private
lateinit
var
appOpenManager
:
ExampleAppOpenManager
companion
object
{
var
mCleanSdk
:
Clean
?
=
null
var
mCloudScan
:
CloudScanClient
?
=
null
}
override
fun
onCreate
()
{
super
.
onCreate
()
// AppLovinSdk.getInstance( this ).initializeSdk({ configuration: AppLovinSdkConfiguration ->
// {
// appOpenManager = ExampleAppOpenManager(applicationContext)
// }
// )
// }
CleanSDK
.
init
(
this
,
this
,
Region
.
INTL
,
object
:
CheckSdkCallback
{
override
fun
onSuccess
(
p0
:
Clean
?)
{
mCleanSdk
=
p0
!!
Log
.
e
(
"yanglin"
,
"onSuccess: clean INIT"
)
}
override
fun
onError
(
error
:
Int
)
{
Log
.
e
(
"yanglin"
,
"onError: INIT error=$error"
)
}
})
mCloudScan
=
CloudScanClient
.
Builder
(
this
)
.
setRegion
(
com
.
trustlook
.
sdk
.
data
.
Region
.
INTL
)
.
setConnectionTimeout
(
30000
)
.
setSocketTimeout
(
30000
)
.
build
()
AppLovinSdk
.
getInstance
(
this
).
initializeSdk
{
appOpenManager
=
ExampleAppOpenManager
(
applicationContext
)
}
}
class
ExampleAppOpenManager
(
applicationContext
:
Context
?)
:
LifecycleObserver
,
MaxAdListener
{
private
lateinit
var
appOpenAd
:
MaxAppOpenAd
private
lateinit
var
context
:
Context
init
{
ProcessLifecycleOwner
.
get
().
lifecycle
.
addObserver
(
this
)
context
=
applicationContext
!!
appOpenAd
=
MaxAppOpenAd
(
UrlManager
.
AD_UNIT_ID
,
applicationContext
)
appOpenAd
.
setListener
(
this
)
appOpenAd
.
loadAd
()
}
private
fun
showAdIfReady
()
{
if
(
appOpenAd
==
null
||
!
AppLovinSdk
.
getInstance
(
context
).
isInitialized
)
return
if
(
appOpenAd
.
isReady
)
{
appOpenAd
.
showAd
(
UrlManager
.
TEST_PLACEMENT_HERE
)
}
else
{
appOpenAd
.
loadAd
()
}
}
@OnLifecycleEvent
(
Lifecycle
.
Event
.
ON_START
)
fun
onStart
()
{
showAdIfReady
()
}
override
fun
onAdLoaded
(
ad
:
MaxAd
)
{}
override
fun
onAdLoadFailed
(
adUnitId
:
String
,
error
:
MaxError
)
{}
override
fun
onAdDisplayed
(
ad
:
MaxAd
)
{}
override
fun
onAdClicked
(
ad
:
MaxAd
)
{}
override
fun
onAdHidden
(
ad
:
MaxAd
)
{
appOpenAd
.
loadAd
()
}
override
fun
onAdDisplayFailed
(
ad
:
MaxAd
,
error
:
MaxError
)
{
appOpenAd
.
loadAd
()
}
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/BaseActivityViewModel.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/BaseActivityViewModel.kt
View file @
c81d9d2a
package
com.
test.mydemo3.activity
import
androidx.lifecycle.LiveData
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.ViewModel
class
BaseActivityViewModel
:
ViewModel
()
{
// private var mSelectNumber = MutableLiveData<SelectNumber>()
private
val
_myInt
=
MutableLiveData
<
Int
>()
val
myInt
:
LiveData
<
Int
>
get
()
=
_myInt
fun
setNumber
(
number
:
Int
){
_myInt
.
value
=
number
}
// fun getNumber() : LiveData<SelectNumber>{
// return mSelectNumber
// }
//
// fun setNumber(number: Int){
// mSelectNumber.value = SelectNumber(number)
// }
package
com.
xm.test.myfilemaster.activity
import
androidx.lifecycle.LiveData
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.ViewModel
class
BaseActivityViewModel
:
ViewModel
()
{
// private var mSelectNumber = MutableLiveData<SelectNumber>()
private
val
_myInt
=
MutableLiveData
<
Int
>()
val
myInt
:
LiveData
<
Int
>
get
()
=
_myInt
fun
setNumber
(
number
:
Int
){
_myInt
.
value
=
number
}
// fun getNumber() : LiveData<SelectNumber>{
// return mSelectNumber
// }
//
// fun setNumber(number: Int){
// mSelectNumber.value = SelectNumber(number)
// }
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/BatteryActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/BatteryActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.content.ContentResolver
import
android.content.Context
import
android.content.Intent
import
android.os.BatteryManager
...
...
@@ -13,10 +12,10 @@ import android.view.View
import
android.widget.ImageView
import
android.widget.TextView
import
androidx.appcompat.app.AppCompatActivity
import
com.
test.mydemo3
.R
import
com.
test.mydemo3
.util.BatteryUtil
import
com.
test.mydemo3
.util.PermissionUtil
import
com.
test.mydemo3
.util.SystemServerState
import
com.
xm.test.myfilemaster
.R
import
com.
xm.test.myfilemaster
.util.BatteryUtil
import
com.
xm.test.myfilemaster
.util.PermissionUtil
import
com.
xm.test.myfilemaster
.util.SystemServerState
import
java.util.Calendar
import
java.util.Date
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/CleanActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/CleanActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.annotation.SuppressLint
import
android.content.Intent
...
...
@@ -8,7 +8,6 @@ import android.os.Looper
import
android.util.Log
import
android.view.View
import
android.widget.ImageView
import
android.widget.ListView
import
android.widget.ProgressBar
import
android.widget.TextView
import
androidx.appcompat.app.AppCompatActivity
...
...
@@ -23,14 +22,14 @@ import com.cloud.cleanjunksdk.residual.ResidualBean
import
com.cloud.cleanjunksdk.task.JunkScanCallback
import
com.cm.plugincluster.junkengine.junk.bean.MediaFile
import
com.cm.plugincluster.junkengine.junk.engine.MEDIA_TYPE
import
com.
test.mydemo3
.MyApplication
import
com.
test.mydemo3
.R
import
com.
test.mydemo3
.adapter.CleanAdapter
import
com.
test.mydemo3
.adapter.CleanAdapter2
import
com.
test.mydemo3
.antivirus.AntivirusActivity
import
com.
test.mydemo3
.model.CleanBean
import
com.
test.mydemo3
.model.FileBean
import
com.
test.mydemo3
.util.FileUtil
import
com.
xm.test.myfilemaster
.MyApplication
import
com.
xm.test.myfilemaster
.R
import
com.
xm.test.myfilemaster
.adapter.CleanAdapter
import
com.
xm.test.myfilemaster
.adapter.CleanAdapter2
import
com.
xm.test.myfilemaster
.antivirus.AntivirusActivity
import
com.
xm.test.myfilemaster
.model.CleanBean
import
com.
xm.test.myfilemaster
.model.FileBean
import
com.
xm.test.myfilemaster
.util.FileUtil
import
java.io.File
class
CleanActivity
:
AppCompatActivity
()
{
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/FileManagerActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/FileManagerActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.os.Bundle
import
com.kongzue.dialogx.dialogs.WaitDialog
import
com.
test.mydemo3
.R
import
com.
test.mydemo3
.base.BaseActivity
import
com.
test.mydemo3
.model.FileBean
import
com.
test.mydemo3
.util.FileUtil
import
com.
xm.test.myfilemaster
.R
import
com.
xm.test.myfilemaster
.base.BaseActivity
import
com.
xm.test.myfilemaster
.model.FileBean
import
com.
xm.test.myfilemaster
.util.FileUtil
class
FileManagerActivity
:
BaseActivity
()
{
private
var
mFileBeanList
=
ArrayList
<
FileBean
>()
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/HomeActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/HomeActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.Manifest
import
android.content.Intent
import
android.content.pm.PackageManager
import
android.net.Uri
import
android.os.Build
import
android.os.Bundle
import
android.os.Environment
import
android.provider.MediaStore.Audio.Radio
import
android.provider.Settings
import
android.view.View
import
android.widget.RadioButton
import
android.widget.RadioGroup
import
android.widget.Toast
import
androidx.activity.enableEdgeToEdge
import
androidx.annotation.IdRes
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.app.ActivityCompat
import
androidx.core.content.ContextCompat
import
androidx.core.view.ViewCompat
import
androidx.core.view.WindowInsetsCompat
import
androidx.core.view.get
import
androidx.fragment.app.Fragment
import
androidx.viewpager.widget.ViewPager
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.widget.ViewPager2
import
androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
import
com.permissionx.guolindev.PermissionX
import
com.permissionx.guolindev.callback.RequestCallback
import
com.test.mydemo3.R
import
com.test.mydemo3.fragment.FileManagerFragment
import
com.test.mydemo3.fragment.HomeFragment
import
com.test.mydemo3.fragment.InternalStorageFragment
import
com.test.mydemo3.util.PermissionUtil
import
java.security.Permission
import
javax.security.auth.callback.Callback
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.fragment.FileManagerFragment
import
com.xm.test.myfilemaster.fragment.HomeFragment
import
com.xm.test.myfilemaster.fragment.InternalStorageFragment
import
com.xm.test.myfilemaster.util.PermissionUtil
class
HomeActivity
:
AppCompatActivity
()
{
private
val
REQUEST_MANAGE_EXTERNAL_STORAGE_PERMISSION
=
101
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/InternalStorageActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/InternalStorageActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.Manifest
import
android.content.Context
import
android.content.pm.PackageManager
import
android.os.Build
import
android.os.Bundle
import
android.os.Environment
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.widget.ListView
import
androidx.activity.result.contract.ActivityResultContracts
import
androidx.core.content.ContextCompat
import
com.kongzue.dialogx.dialogs.WaitDialog
import
com.test.mydemo3.R
import
com.test.mydemo3.base.BaseActivity
import
com.test.mydemo3.model.FileBean
import
com.test.mydemo3.model.FilesItemBean
import
com.test.mydemo3.util.FileUtil
import
com.test.mydemo3.util.PermissionUtil
import
java.io.File
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.base.BaseActivity
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.util.FileUtil
import
com.xm.test.myfilemaster.util.PermissionUtil
class
InternalStorageActivity
:
BaseActivity
()
{
private
lateinit
var
mFilesItemListView
:
ListView
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/MediaActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/MediaActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.annotation.SuppressLint
import
android.os.Bundle
...
...
@@ -7,15 +7,14 @@ import android.view.View
import
android.widget.CheckBox
import
android.widget.GridView
import
android.widget.ImageView
import
android.widget.ScrollView
import
android.widget.TextView
import
androidx.appcompat.app.AppCompatActivity
import
androidx.lifecycle.ViewModelProvider
import
com.kongzue.dialogx.dialogs.WaitDialog
import
com.
test.mydemo3
.R
import
com.
test.mydemo3
.adapter.MediaAdapter
import
com.
test.mydemo3
.model.FileBean
import
com.
test.mydemo3
.util.FileUtil
import
com.
xm.test.myfilemaster
.R
import
com.
xm.test.myfilemaster
.adapter.MediaAdapter
import
com.
xm.test.myfilemaster
.model.FileBean
import
com.
xm.test.myfilemaster
.util.FileUtil
class
MediaActivity
:
AppCompatActivity
()
{
private
lateinit
var
mGridView
:
GridView
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/MoveOrCopyActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/MoveOrCopyActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.os.Bundle
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.view.View
import
android.widget.LinearLayout
import
android.widget.ListView
import
android.widget.TextView
import
android.widget.Toast
import
androidx.activity.ComponentActivity
import
androidx.activity.enableEdgeToEdge
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.view.ViewCompat
import
androidx.core.view.WindowInsetsCompat
import
androidx.core.view.isVisible
import
com.test.mydemo3.R
import
com.test.mydemo3.adapter.FilesItemViewAdapter
import
com.test.mydemo3.base.BaseActivity
import
com.test.mydemo3.fragment.InternalStorageFragment
import
com.test.mydemo3.model.FileBean
import
com.test.mydemo3.util.FileUtil
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.adapter.FilesItemViewAdapter
import
com.xm.test.myfilemaster.fragment.InternalStorageFragment
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.util.FileUtil
class
MoveOrCopyActivity
:
ComponentActivity
()
{
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/ScanEmptyFilesActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/ScanEmptyFilesActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.os.Bundle
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.view.View
import
android.widget.ListView
import
com.kongzue.dialogx.dialogs.WaitDialog
import
com.test.mydemo3.R
import
com.test.mydemo3.adapter.FilesItemViewAdapter
import
com.test.mydemo3.base.BaseActivity
import
com.test.mydemo3.model.FileBean
import
com.test.mydemo3.model.FilesItemBean
import
com.test.mydemo3.util.FileUtil
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.base.BaseActivity
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.util.FileUtil
class
ScanEmptyFilesActivity
:
BaseActivity
()
{
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/ScanLargeFilesActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/ScanLargeFilesActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.net.Uri
import
android.os.Bundle
import
android.os.Handler
import
android.os.Looper
import
android.provider.MediaStore
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.view.View
import
android.widget.ImageView
import
android.widget.LinearLayout
import
android.widget.ListView
import
android.widget.Toast
import
com.airbnb.lottie.utils.Utils
import
com.kongzue.dialogx.dialogs.WaitDialog
import
com.test.mydemo3.R
import
com.test.mydemo3.base.BaseActivity
import
com.test.mydemo3.model.FileBean
import
com.test.mydemo3.model.FilesItemBean
import
com.test.mydemo3.util.FileUtil
import
java.io.File
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.base.BaseActivity
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.util.FileUtil
class
ScanLargeFilesActivity
:
BaseActivity
()
{
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/ScanResultActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/ScanResultActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.content.Intent
import
android.os.Bundle
import
android.view.View
import
android.widget.ImageView
import
android.widget.ListView
import
android.widget.TextView
import
androidx.activity.enableEdgeToEdge
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.view.ViewCompat
import
androidx.core.view.WindowInsetsCompat
import
androidx.core.view.isVisible
import
com.test.mydemo3.R
import
com.test.mydemo3.adapter.ScanResultAdapter
import
com.test.mydemo3.view.CustomDialog
import
com.trustlook.sdk.data.AppInfo
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.adapter.ScanResultAdapter
import
com.xm.test.myfilemaster.view.CustomDialog
class
ScanResultActivity
:
AppCompatActivity
()
{
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/activity/SimilarImagesActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/activity/SimilarImagesActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.activity
package
com.
xm.test.myfilemaster
.activity
import
android.os.Bundle
import
android.util.Log
...
...
@@ -14,14 +14,14 @@ import androidx.lifecycle.Observer
import
androidx.lifecycle.ViewModelProvider
import
androidx.recyclerview.widget.RecyclerView
import
com.cloud.cleanjunksdk.similar.PicSimilarInfo
import
com.cloud.cleanjunksdk.task.JunkScanCallback
import
com.cloud.cleanjunksdk.task.SimilarScanCallBack
import
com.test.mydemo3.MyApplication
import
com.test.mydemo3.R
import
com.test.mydemo3.adapter.ImageItemAdapter
import
com.test.mydemo3.adapter.SimilarBeanAdapter
import
com.test.mydemo3.base.BaseActivity
import
com.test.mydemo3.model.FileBean
import
com.xm.test.myfilemaster.MyApplication
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.adapter.ImageItemAdapter
import
com.xm.test.myfilemaster.adapter.SimilarBeanAdapter
import
com.xm.test.myfilemaster.base.BaseActivity
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.view.CustomDialog
import
java.io.File
class
SimilarImagesActivity
:
AppCompatActivity
(),
OnClickListener
{
...
...
@@ -175,7 +175,7 @@ class SimilarImagesActivity : AppCompatActivity(), OnClickListener{
isClickEditBtn
=
true
}
R
.
id
.
btn_delete
->{
val
customDialog
=
com
.
test
.
mydemo3
.
view
.
CustomDialog
(
this
)
val
customDialog
=
CustomDialog
(
this
)
customDialog
.
setsCancel
(
View
.
OnClickListener
{
customDialog
.
dismiss
()
}).
setsConfirm
(
View
.
OnClickListener
{
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/adapter/CleanAdapter.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/adapter/CleanAdapter.kt
View file @
c81d9d2a
package
com.
test.mydemo3.adapter
import
android.content.Context
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.ImageView
import
android.widget.LinearLayout
import
android.widget.ListView
import
android.widget.RelativeLayout
import
android.widget.TextView
import
com.
test.mydemo3.R
import
com.
test.mydemo3.model.CleanBean
import
com.
test.mydemo3.model.FileBean
import
com.
test.mydemo3.util.FileUtil
class
CleanAdapter
(
fileBeanList
:
ArrayList
<
CleanBean
>,
context
:
Context
,
)
:
BaseAdapter
(){
private
var
dataBeanList
:
ArrayList
<
CleanBean
>
private
var
context
:
Context
private
var
inflater
:
LayoutInflater
private
var
sparseBooleanArray
=
ArrayList
<
SparseBooleanArray
>()
private
var
itemAdapters
=
ArrayList
<
ItemAdapter
>()
private
lateinit
var
viewHolder
:
ViewHolder
var
mFileCheckedItemList
=
ArrayList
<
ArrayList
<
FileBean
>>()
var
mAllSizes
=
ArrayList
<
Long
>()
companion
object
{
var
isCleanOver
=
false
var
isClickAlls
=
ArrayList
<
Boolean
>()
}
init
{
this
.
dataBeanList
=
fileBeanList
this
.
context
=
context
this
.
inflater
=
LayoutInflater
.
from
(
context
)
}
override
fun
getCount
():
Int
{
return
dataBeanList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataBeanList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
fun
setData
(
fileBeanList
:
ArrayList
<
CleanBean
>){
this
.
dataBeanList
=
fileBeanList
notifyDataSetChanged
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
:
View
?
=
null
if
(
convertView
!=
null
){
view
=
convertView
viewHolder
=
view
.
tag
as
ViewHolder
}
else
{
viewHolder
=
ViewHolder
()
view
=
inflater
.
inflate
(
R
.
layout
.
clean_list_item_layout
,
null
)
viewHolder
.
listView
=
view
.
findViewById
(
R
.
id
.
clean_item_list
)
viewHolder
.
itemNameTv
=
view
.
findViewById
(
R
.
id
.
clean_item_name
)
viewHolder
.
unfoldImg
=
view
.
findViewById
(
R
.
id
.
clean_item_unfold
)
viewHolder
.
moreImg
=
view
.
findViewById
(
R
.
id
.
clean_item_more
)
viewHolder
.
sizeTv
=
view
.
findViewById
(
R
.
id
.
file_item_size
)
viewHolder
.
checkBox
=
view
.
findViewById
(
R
.
id
.
clean_item_check_box
)
viewHolder
.
itemBar
=
view
.
findViewById
(
R
.
id
.
clean_item_bar
)
view
.
tag
=
viewHolder
}
viewHolder
.
itemNameTv
?.
text
=
dataBeanList
[
position
].
typeName
setOnclickListener
(
viewHolder
)
sparseBooleanArray
.
add
(
SparseBooleanArray
())
isClickAlls
.
add
(
false
)
mFileCheckedItemList
.
add
(
ArrayList
())
val
layoutParams
=
viewHolder
.
listView
?.
layoutParams
as
LinearLayout
.
LayoutParams
itemAdapters
.
add
(
ItemAdapter
(
context
,
dataBeanList
[
position
].
fileBeans
,
sparseBooleanArray
[
position
],
position
))
viewHolder
.
listView
?.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
unfoldImg
?.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
sizeTv
?.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
checkBox
?.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
moreImg
?.
visibility
=
if
(
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
var
allSize
:
Long
=
0
for
(
fileBean
in
dataBeanList
[
position
].
fileBeans
){
allSize
+=
fileBean
.
fileSize
}
viewHolder
.
sizeTv
?.
text
=
if
(
allSize
>
1024
*
1024
*
1024
){
"${allSize / 1024 / 1024 / 1024} GB"
}
else
if
(
allSize
>
1024
*
1024
){
"${allSize / 1024 / 1024} MB"
}
else
if
(
allSize
>
1024
){
"${allSize / 1024} KB"
}
else
{
"${allSize} B"
}
mAllSizes
.
add
(
allSize
)
layoutParams
.
height
=
FileUtil
.
dpToPx
(
62
*
itemAdapters
[
position
]
?.
count
!!
,
context
)
viewHolder
.
listView
?.
adapter
=
itemAdapters
[
position
]
viewHolder
.
itemBar
?.
setOnClickListener
{
// Log.e("yanglin", "setViewOnclickListener: 11111111", )
dataBeanList
[
position
].
isListViewShow
=
!
dataBeanList
[
position
].
isListViewShow
// viewHolder.listView?.visibility = if (dataBeanList[position].isListViewShow) View.GONE else View.VISIBLE
notifyDataSetChanged
()
}
// viewHolder.listView?.visibility = if (!dataBeanList[position].isListViewShow) View.GONE else View.VISIBLE
viewHolder
.
listView
?.
setOnItemClickListener
{
parent
,
view
,
itemPosition
,
id
->
if
(
isCleanOver
)
updateCheckBoxStatus
(
position
,
view
,
itemPosition
,
viewHolder
.
listView
!!
,
dataBeanList
[
position
].
fileBeans
)
}
viewHolder
.
checkBox
?.
setOnClickListener
{
viewHolder
.
checkBox
?.
isChecked
=
!
viewHolder
.
checkBox
?.
isChecked
!!
selectAll
(
dataBeanList
[
position
].
fileBeans
,
viewHolder
.
checkBox
?.
isChecked
!!
,
position
)
notifyDataSetChanged
()
}
return
view
!!
}
fun
selectAll
(
fileBeanList
:
ArrayList
<
FileBean
>,
isChecked
:
Boolean
,
position
:
Int
){
mFileCheckedItemList
[
position
].
clear
()
setStateCheckedMap
(
position
,
isChecked
)
mFileCheckedItemList
[
position
].
addAll
(
fileBeanList
)
}
fun
setStateCheckedMap
(
position
:
Int
,
isChecked
:
Boolean
){
for
(
i
in
dataBeanList
[
position
].
fileBeans
.
indices
){
sparseBooleanArray
[
position
].
put
(
i
,
isChecked
)
viewHolder
.
listView
?.
setItemChecked
(
i
,
isChecked
)
}
}
fun
updateCheckBoxStatus
(
position
:
Int
,
view
:
View
,
itemPosition
:
Int
,
lv
:
ListView
,
fileBeanList
:
ArrayList
<
FileBean
>){
val
viewHolder
=
view
.
tag
as
ItemAdapter
.
ItemViewHolder
viewHolder
.
selectSwitch
.
toggle
()
lv
.
setItemChecked
(
itemPosition
,
viewHolder
.
selectSwitch
.
isChecked
)
sparseBooleanArray
[
position
].
put
(
itemPosition
,
viewHolder
.
selectSwitch
.
isChecked
)
if
(
viewHolder
.
selectSwitch
.
isChecked
){
mFileCheckedItemList
[
position
].
add
(
fileBeanList
[
itemPosition
])
}
else
{
mFileCheckedItemList
[
position
].
remove
(
fileBeanList
[
itemPosition
])
}
itemAdapters
[
position
]
?.
notifyDataSetChanged
()
}
private
fun
setOnclickListener
(
viewHolder
:
ViewHolder
)
{
viewHolder
.
moreImg
?.
setOnClickListener
{
}
viewHolder
.
itemBar
?.
setOnClickListener
{
}
}
class
ViewHolder
{
var
itemNameTv
:
TextView
?
=
null
var
unfoldImg
:
ImageView
?
=
null
var
moreImg
:
ImageView
?
=
null
var
sizeTv
:
TextView
?
=
null
var
checkBox
:
CheckBox
?
=
null
var
listView
:
ListView
?
=
null
var
itemBar
:
View
?
=
null
}
private
class
ItemAdapter
(
context
:
Context
,
dataList
:
ArrayList
<
FileBean
>,
sparseBooleanArray
:
SparseBooleanArray
,
itemPosition
:
Int
):
BaseAdapter
(){
private
var
context
:
Context
private
var
inflater
:
LayoutInflater
private
var
dataList
:
ArrayList
<
FileBean
>
private
var
sparseBooleanArray
:
SparseBooleanArray
private
var
itemPosition
:
Int
init
{
this
.
context
=
context
this
.
dataList
=
dataList
this
.
inflater
=
LayoutInflater
.
from
(
context
)
this
.
sparseBooleanArray
=
sparseBooleanArray
this
.
itemPosition
=
itemPosition
}
override
fun
getCount
():
Int
{
return
dataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
itemViewHolder
:
ItemViewHolder
var
view
:
View
if
(
convertView
!=
null
){
view
=
convertView
itemViewHolder
=
view
.
tag
as
ItemViewHolder
}
else
{
itemViewHolder
=
ItemViewHolder
()
view
=
inflater
.
inflate
(
R
.
layout
.
files_item_layout
,
null
)
itemViewHolder
.
fileIcon
=
view
.
findViewById
(
R
.
id
.
files_item_icon
)
itemViewHolder
.
fileJoinTo
=
view
.
findViewById
(
R
.
id
.
file_join_to_img
)
itemViewHolder
.
fileNone
=
view
.
findViewById
(
R
.
id
.
file_item_none
)
itemViewHolder
.
fileName
=
view
.
findViewById
(
R
.
id
.
file_item_name
)
itemViewHolder
.
selectSwitch
=
view
.
findViewById
(
R
.
id
.
file_select_switch
)
itemViewHolder
.
itemLayout
=
view
.
findViewById
(
R
.
id
.
item_layout
)
view
.
tag
=
itemViewHolder
}
itemViewHolder
.
fileJoinTo
.
visibility
=
View
.
GONE
itemViewHolder
.
selectSwitch
.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
itemViewHolder
.
selectSwitch
.
isChecked
=
sparseBooleanArray
[
position
]
when
(
itemPosition
){
0
->{
itemViewHolder
.
fileName
.
text
=
dataList
[
position
].
fileName
itemViewHolder
.
fileNone
.
text
=
dataList
[
position
].
filePath
}
1
->{
itemViewHolder
.
fileIcon
.
setImageDrawable
(
dataList
[
position
].
drawable
)
itemViewHolder
.
fileName
.
text
=
dataList
[
position
].
fileName
itemViewHolder
.
fileNone
.
text
=
dataList
[
position
].
filePath
}
3
->{
// itemViewHolder.fileIcon.setImageDrawable(dataList[position].drawable)
itemViewHolder
.
fileIcon
.
setImageResource
(
R
.
drawable
.
ic_log_file
)
itemViewHolder
.
fileName
.
text
=
dataList
[
position
].
fileName
itemViewHolder
.
fileNone
.
text
=
dataList
[
position
].
hint
}
4
->{
itemViewHolder
.
fileIcon
.
setImageResource
(
R
.
drawable
.
ic_log_file
)
itemViewHolder
.
fileName
.
text
=
dataList
[
position
].
fileName
itemViewHolder
.
fileNone
.
text
=
dataList
[
position
].
filePath
}
}
itemViewHolder
.
fileIcon
itemViewHolder
.
fileName
itemViewHolder
.
fileNone
if
(
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
return
view
}
class
ItemViewHolder
{
lateinit
var
fileIcon
:
ImageView
lateinit
var
fileJoinTo
:
ImageView
lateinit
var
fileName
:
TextView
lateinit
var
fileNone
:
TextView
lateinit
var
selectSwitch
:
CheckBox
lateinit
var
itemLayout
:
RelativeLayout
}
}
package
com.
xm.test.myfilemaster.adapter
import
android.content.Context
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.ImageView
import
android.widget.LinearLayout
import
android.widget.ListView
import
android.widget.RelativeLayout
import
android.widget.TextView
import
com.
xm.test.myfilemaster.R
import
com.
xm.test.myfilemaster.model.CleanBean
import
com.
xm.test.myfilemaster.model.FileBean
import
com.
xm.test.myfilemaster.util.FileUtil
class
CleanAdapter
(
fileBeanList
:
ArrayList
<
CleanBean
>,
context
:
Context
,
)
:
BaseAdapter
(){
private
var
dataBeanList
:
ArrayList
<
CleanBean
>
private
var
context
:
Context
private
var
inflater
:
LayoutInflater
private
var
sparseBooleanArray
=
ArrayList
<
SparseBooleanArray
>()
private
var
itemAdapters
=
ArrayList
<
ItemAdapter
>()
private
lateinit
var
viewHolder
:
ViewHolder
var
mFileCheckedItemList
=
ArrayList
<
ArrayList
<
FileBean
>>()
var
mAllSizes
=
ArrayList
<
Long
>()
companion
object
{
var
isCleanOver
=
false
var
isClickAlls
=
ArrayList
<
Boolean
>()
}
init
{
this
.
dataBeanList
=
fileBeanList
this
.
context
=
context
this
.
inflater
=
LayoutInflater
.
from
(
context
)
}
override
fun
getCount
():
Int
{
return
dataBeanList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataBeanList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
fun
setData
(
fileBeanList
:
ArrayList
<
CleanBean
>){
this
.
dataBeanList
=
fileBeanList
notifyDataSetChanged
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
:
View
?
=
null
if
(
convertView
!=
null
){
view
=
convertView
viewHolder
=
view
.
tag
as
ViewHolder
}
else
{
viewHolder
=
ViewHolder
()
view
=
inflater
.
inflate
(
R
.
layout
.
clean_list_item_layout
,
null
)
viewHolder
.
listView
=
view
.
findViewById
(
R
.
id
.
clean_item_list
)
viewHolder
.
itemNameTv
=
view
.
findViewById
(
R
.
id
.
clean_item_name
)
viewHolder
.
unfoldImg
=
view
.
findViewById
(
R
.
id
.
clean_item_unfold
)
viewHolder
.
moreImg
=
view
.
findViewById
(
R
.
id
.
clean_item_more
)
viewHolder
.
sizeTv
=
view
.
findViewById
(
R
.
id
.
file_item_size
)
viewHolder
.
checkBox
=
view
.
findViewById
(
R
.
id
.
clean_item_check_box
)
viewHolder
.
itemBar
=
view
.
findViewById
(
R
.
id
.
clean_item_bar
)
view
.
tag
=
viewHolder
}
viewHolder
.
itemNameTv
?.
text
=
dataBeanList
[
position
].
typeName
setOnclickListener
(
viewHolder
)
sparseBooleanArray
.
add
(
SparseBooleanArray
())
isClickAlls
.
add
(
false
)
mFileCheckedItemList
.
add
(
ArrayList
())
val
layoutParams
=
viewHolder
.
listView
?.
layoutParams
as
LinearLayout
.
LayoutParams
itemAdapters
.
add
(
ItemAdapter
(
context
,
dataBeanList
[
position
].
fileBeans
,
sparseBooleanArray
[
position
],
position
))
viewHolder
.
listView
?.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
unfoldImg
?.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
sizeTv
?.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
checkBox
?.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
moreImg
?.
visibility
=
if
(
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
var
allSize
:
Long
=
0
for
(
fileBean
in
dataBeanList
[
position
].
fileBeans
){
allSize
+=
fileBean
.
fileSize
}
viewHolder
.
sizeTv
?.
text
=
if
(
allSize
>
1024
*
1024
*
1024
){
"${allSize / 1024 / 1024 / 1024} GB"
}
else
if
(
allSize
>
1024
*
1024
){
"${allSize / 1024 / 1024} MB"
}
else
if
(
allSize
>
1024
){
"${allSize / 1024} KB"
}
else
{
"${allSize} B"
}
mAllSizes
.
add
(
allSize
)
layoutParams
.
height
=
FileUtil
.
dpToPx
(
62
*
itemAdapters
[
position
]
?.
count
!!
,
context
)
viewHolder
.
listView
?.
adapter
=
itemAdapters
[
position
]
viewHolder
.
itemBar
?.
setOnClickListener
{
// Log.e("yanglin", "setViewOnclickListener: 11111111", )
dataBeanList
[
position
].
isListViewShow
=
!
dataBeanList
[
position
].
isListViewShow
// viewHolder.listView?.visibility = if (dataBeanList[position].isListViewShow) View.GONE else View.VISIBLE
notifyDataSetChanged
()
}
// viewHolder.listView?.visibility = if (!dataBeanList[position].isListViewShow) View.GONE else View.VISIBLE
viewHolder
.
listView
?.
setOnItemClickListener
{
parent
,
view
,
itemPosition
,
id
->
if
(
isCleanOver
)
updateCheckBoxStatus
(
position
,
view
,
itemPosition
,
viewHolder
.
listView
!!
,
dataBeanList
[
position
].
fileBeans
)
}
viewHolder
.
checkBox
?.
setOnClickListener
{
viewHolder
.
checkBox
?.
isChecked
=
!
viewHolder
.
checkBox
?.
isChecked
!!
selectAll
(
dataBeanList
[
position
].
fileBeans
,
viewHolder
.
checkBox
?.
isChecked
!!
,
position
)
notifyDataSetChanged
()
}
return
view
!!
}
fun
selectAll
(
fileBeanList
:
ArrayList
<
FileBean
>,
isChecked
:
Boolean
,
position
:
Int
){
mFileCheckedItemList
[
position
].
clear
()
setStateCheckedMap
(
position
,
isChecked
)
mFileCheckedItemList
[
position
].
addAll
(
fileBeanList
)
}
fun
setStateCheckedMap
(
position
:
Int
,
isChecked
:
Boolean
){
for
(
i
in
dataBeanList
[
position
].
fileBeans
.
indices
){
sparseBooleanArray
[
position
].
put
(
i
,
isChecked
)
viewHolder
.
listView
?.
setItemChecked
(
i
,
isChecked
)
}
}
fun
updateCheckBoxStatus
(
position
:
Int
,
view
:
View
,
itemPosition
:
Int
,
lv
:
ListView
,
fileBeanList
:
ArrayList
<
FileBean
>){
val
viewHolder
=
view
.
tag
as
ItemAdapter
.
ItemViewHolder
viewHolder
.
selectSwitch
.
toggle
()
lv
.
setItemChecked
(
itemPosition
,
viewHolder
.
selectSwitch
.
isChecked
)
sparseBooleanArray
[
position
].
put
(
itemPosition
,
viewHolder
.
selectSwitch
.
isChecked
)
if
(
viewHolder
.
selectSwitch
.
isChecked
){
mFileCheckedItemList
[
position
].
add
(
fileBeanList
[
itemPosition
])
}
else
{
mFileCheckedItemList
[
position
].
remove
(
fileBeanList
[
itemPosition
])
}
itemAdapters
[
position
]
?.
notifyDataSetChanged
()
}
private
fun
setOnclickListener
(
viewHolder
:
ViewHolder
)
{
viewHolder
.
moreImg
?.
setOnClickListener
{
}
viewHolder
.
itemBar
?.
setOnClickListener
{
}
}
class
ViewHolder
{
var
itemNameTv
:
TextView
?
=
null
var
unfoldImg
:
ImageView
?
=
null
var
moreImg
:
ImageView
?
=
null
var
sizeTv
:
TextView
?
=
null
var
checkBox
:
CheckBox
?
=
null
var
listView
:
ListView
?
=
null
var
itemBar
:
View
?
=
null
}
private
class
ItemAdapter
(
context
:
Context
,
dataList
:
ArrayList
<
FileBean
>,
sparseBooleanArray
:
SparseBooleanArray
,
itemPosition
:
Int
):
BaseAdapter
(){
private
var
context
:
Context
private
var
inflater
:
LayoutInflater
private
var
dataList
:
ArrayList
<
FileBean
>
private
var
sparseBooleanArray
:
SparseBooleanArray
private
var
itemPosition
:
Int
init
{
this
.
context
=
context
this
.
dataList
=
dataList
this
.
inflater
=
LayoutInflater
.
from
(
context
)
this
.
sparseBooleanArray
=
sparseBooleanArray
this
.
itemPosition
=
itemPosition
}
override
fun
getCount
():
Int
{
return
dataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
itemViewHolder
:
ItemViewHolder
var
view
:
View
if
(
convertView
!=
null
){
view
=
convertView
itemViewHolder
=
view
.
tag
as
ItemViewHolder
}
else
{
itemViewHolder
=
ItemViewHolder
()
view
=
inflater
.
inflate
(
R
.
layout
.
files_item_layout
,
null
)
itemViewHolder
.
fileIcon
=
view
.
findViewById
(
R
.
id
.
files_item_icon
)
itemViewHolder
.
fileJoinTo
=
view
.
findViewById
(
R
.
id
.
file_join_to_img
)
itemViewHolder
.
fileNone
=
view
.
findViewById
(
R
.
id
.
file_item_none
)
itemViewHolder
.
fileName
=
view
.
findViewById
(
R
.
id
.
file_item_name
)
itemViewHolder
.
selectSwitch
=
view
.
findViewById
(
R
.
id
.
file_select_switch
)
itemViewHolder
.
itemLayout
=
view
.
findViewById
(
R
.
id
.
item_layout
)
view
.
tag
=
itemViewHolder
}
itemViewHolder
.
fileJoinTo
.
visibility
=
View
.
GONE
itemViewHolder
.
selectSwitch
.
visibility
=
if
(!
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
itemViewHolder
.
selectSwitch
.
isChecked
=
sparseBooleanArray
[
position
]
when
(
itemPosition
){
0
->{
itemViewHolder
.
fileName
.
text
=
dataList
[
position
].
fileName
itemViewHolder
.
fileNone
.
text
=
dataList
[
position
].
filePath
}
1
->{
itemViewHolder
.
fileIcon
.
setImageDrawable
(
dataList
[
position
].
drawable
)
itemViewHolder
.
fileName
.
text
=
dataList
[
position
].
fileName
itemViewHolder
.
fileNone
.
text
=
dataList
[
position
].
filePath
}
3
->{
// itemViewHolder.fileIcon.setImageDrawable(dataList[position].drawable)
itemViewHolder
.
fileIcon
.
setImageResource
(
R
.
drawable
.
ic_log_file
)
itemViewHolder
.
fileName
.
text
=
dataList
[
position
].
fileName
itemViewHolder
.
fileNone
.
text
=
dataList
[
position
].
hint
}
4
->{
itemViewHolder
.
fileIcon
.
setImageResource
(
R
.
drawable
.
ic_log_file
)
itemViewHolder
.
fileName
.
text
=
dataList
[
position
].
fileName
itemViewHolder
.
fileNone
.
text
=
dataList
[
position
].
filePath
}
}
itemViewHolder
.
fileIcon
itemViewHolder
.
fileName
itemViewHolder
.
fileNone
if
(
isCleanOver
)
View
.
GONE
else
View
.
VISIBLE
return
view
}
class
ItemViewHolder
{
lateinit
var
fileIcon
:
ImageView
lateinit
var
fileJoinTo
:
ImageView
lateinit
var
fileName
:
TextView
lateinit
var
fileNone
:
TextView
lateinit
var
selectSwitch
:
CheckBox
lateinit
var
itemLayout
:
RelativeLayout
}
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/adapter/CleanAdapter2.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/adapter/CleanAdapter2.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.adapter
package
com.
xm.test.myfilemaster
.adapter
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
androidx.recyclerview.widget.RecyclerView
import
com.
test.mydemo3
.R
import
com.
test.mydemo3
.databinding.CleanListItemLayoutBinding
import
com.
test.mydemo3
.databinding.FilesItemLayoutBinding
import
com.
test.mydemo3
.model.CleanBean
import
com.
test.mydemo3
.model.FileBean
import
com.
xm.test.myfilemaster
.R
import
com.
xm.test.myfilemaster
.databinding.CleanListItemLayoutBinding
import
com.
xm.test.myfilemaster
.databinding.FilesItemLayoutBinding
import
com.
xm.test.myfilemaster
.model.CleanBean
import
com.
xm.test.myfilemaster
.model.FileBean
class
CleanAdapter2
:
RecyclerView
.
Adapter
<
CleanAdapter2
.
AAA
>()
{
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/adapter/FileSimilarAdapter.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/adapter/FileSimilarAdapter.kt
View file @
c81d9d2a
//package com.test.mydemo3.adapter
//
//import android.view.View
//import android.view.ViewGroup
//import androidx.recyclerview.widget.RecyclerView
//import androidx.recyclerview.widget.RecyclerView.ViewHolder
//import com.test.mydemo3.model.FileBean
//
//class FileSimilarAdapter<T : ViewHolder?>() : RecyclerView.Adapter<T>(){
//
// val fileList = arrayListOf<FileBean>()
// private var firstRefresh = true
//
// fun setData(data: List<FileBean>) {
// fileList.clear()
// fileList.addAll(data)
//// notifyDataSetChanged()
// }
//
// fun addData(data: List<FileBean>) {
// fileList.addAll(data)
//// notifyDataSetChanged()
// }
//
//
// fun clearData() {
// if (fileList.size == 0) return
// fileList.clear()
//// notifyDataSetChanged()
// }
//
//// @SuppressLint("NotifyDataSetChanged")
// fun removeData(data: List<FileBean>) {
// data.forEach {
// val index = fileList.indexOf(it)
// if (index != -1) {
// fileList.removeAt(index)
//// notifyItemRemoved(index)
// }
// }
// }
//
//// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T & Any {
////
////
//// }
//
// override fun getItemCount(): Int {
// return fileList.size
// }
//
// override fun onBindViewHolder(holder: T & Any, position: Int) {
// return
// }
//
//
//package com.test.mydemo3.adapter
//
//import android.view.View
//import android.view.ViewGroup
//import androidx.recyclerview.widget.RecyclerView
//import androidx.recyclerview.widget.RecyclerView.ViewHolder
//import com.test.mydemo3.model.FileBean
//
//class FileSimilarAdapter<T : ViewHolder?>() : RecyclerView.Adapter<T>(){
//
// val fileList = arrayListOf<FileBean>()
// private var firstRefresh = true
//
// fun setData(data: List<FileBean>) {
// fileList.clear()
// fileList.addAll(data)
//// notifyDataSetChanged()
// }
//
// fun addData(data: List<FileBean>) {
// fileList.addAll(data)
//// notifyDataSetChanged()
// }
//
//
// fun clearData() {
// if (fileList.size == 0) return
// fileList.clear()
//// notifyDataSetChanged()
// }
//
//// @SuppressLint("NotifyDataSetChanged")
// fun removeData(data: List<FileBean>) {
// data.forEach {
// val index = fileList.indexOf(it)
// if (index != -1) {
// fileList.removeAt(index)
//// notifyItemRemoved(index)
// }
// }
// }
//
//// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T & Any {
////
////
//// }
//
// override fun getItemCount(): Int {
// return fileList.size
// }
//
// override fun onBindViewHolder(holder: T & Any, position: Int) {
// return
// }
//
//
//}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/adapter/FilesItemViewAdapter.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/adapter/FilesItemViewAdapter.kt
View file @
c81d9d2a
package
com.test.mydemo3.adapter
import
android.content.Context
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.ImageView
import
android.widget.TextView
import
com.airbnb.lottie.utils.Utils
import
com.test.mydemo3.R
import
com.test.mydemo3.base.BaseActivity
import
com.test.mydemo3.model.FileBean
import
com.test.mydemo3.util.FileUtil
class
FilesItemViewAdapter
(
mItemFileList
:
List
<
FileBean
>,
mContext
:
Context
,
stateCheckedMap
:
SparseBooleanArray
):
BaseAdapter
()
{
private
var
mFileBeanList
:
List
<
FileBean
>
private
var
mInflater
:
LayoutInflater
private
var
mContext
:
Context
private
var
mStateCheckedMap
:
SparseBooleanArray
private
var
isEditBtnClick
=
false
private
var
isFileShow
=
true
init
{
this
.
mFileBeanList
=
mItemFileList
this
.
mContext
=
mContext
this
.
mInflater
=
LayoutInflater
.
from
(
mContext
)
this
.
mStateCheckedMap
=
stateCheckedMap
}
fun
setData
(
fileList
:
List
<
FileBean
>){
this
.
mFileBeanList
=
fileList
this
.
notifyDataSetChanged
()
}
override
fun
getCount
():
Int
{
return
mFileBeanList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
mFileBeanList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
viewHolder
:
ViewHolder
?
=
null
var
view
:
View
?
=
null
if
(
convertView
!=
null
){
view
=
convertView
viewHolder
=
view
.
tag
as
ViewHolder
}
else
{
view
=
mInflater
.
inflate
(
R
.
layout
.
files_item_layout
,
null
)
viewHolder
=
ViewHolder
()
viewHolder
.
fileIcon
=
view
.
findViewById
(
R
.
id
.
files_item_icon
)
viewHolder
.
fileJoinTo
=
view
.
findViewById
(
R
.
id
.
file_join_to_img
)
viewHolder
.
fileName
=
view
.
findViewById
(
R
.
id
.
file_item_name
)
viewHolder
.
fileNone
=
view
.
findViewById
(
R
.
id
.
file_item_none
)
viewHolder
.
selectSwitch
=
view
.
findViewById
(
R
.
id
.
file_select_switch
)
view
.
tag
=
viewHolder
}
val
filesItemBean
=
mFileBeanList
[
position
]
viewHolder
.
fileName
.
text
=
filesItemBean
.
fileName
if
(
filesItemBean
.
isDir
){
viewHolder
.
fileIcon
.
setImageResource
(
R
.
drawable
.
ic_files
)
viewHolder
.
fileJoinTo
.
visibility
=
if
(
isEditBtnClick
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
selectSwitch
.
visibility
=
if
(
isEditBtnClick
)
View
.
VISIBLE
else
View
.
GONE
val
(
year
,
month
,
day
)
=
FileUtil
.
getFileCreateTime
(
filesItemBean
.
filePath
)
viewHolder
.
fileNone
.
text
=
"${filesItemBean.childList.size} item | $month-$day, $year"
}
else
{
val
icon
=
when
(
filesItemBean
.
fileType
){
"png"
,
"jpg"
->{
R
.
drawable
.
ic_image
}
"mp4"
,
"3gp"
,
"avi"
->{
R
.
drawable
.
ic_video
}
"mp3"
,
"aac"
,
"wav"
->{
R
.
drawable
.
ic_audio
}
"zip"
->{
R
.
drawable
.
ic_zip
}
"apk"
->{
R
.
drawable
.
ic_apk
}
"log"
->{
R
.
drawable
.
ic_log_file
}
"doc"
,
"docm"
,
"docx"
->{
R
.
drawable
.
ic_word
}
"xlsx"
,
"xlsm"
,
"xlsb"
,
"xltx"
->{
R
.
drawable
.
ic_excel
}
"ppt"
->{
R
.
drawable
.
ic_ppt
}
"pdf"
->{
R
.
drawable
.
ic_pdf
}
"txt"
->{
R
.
drawable
.
ic_txt
}
else
->
{
R
.
drawable
.
ic_copy
}
}
viewHolder
.
fileIcon
.
setImageResource
(
icon
)
viewHolder
.
fileJoinTo
.
visibility
=
View
.
GONE
viewHolder
.
selectSwitch
.
visibility
=
if
(
isEditBtnClick
)
View
.
VISIBLE
else
View
.
GONE
var
sizeStr
:
String
=
""
sizeStr
=
if
(
filesItemBean
.
fileSize
>
1024
*
1024
*
1024
){
"size ${filesItemBean.fileSize / 1024 / 1024 / 1024} GB"
}
else
if
(
filesItemBean
.
fileSize
>
1024
*
1024
){
"size ${filesItemBean.fileSize / 1024 / 1024} MB"
}
else
if
(
filesItemBean
.
fileSize
>
1024
){
"size ${filesItemBean.fileSize / 1024} KB"
}
else
{
"size ${filesItemBean.fileSize} B"
}
viewHolder
.
fileNone
.
text
=
"$sizeStr,type ${filesItemBean.fileType}"
}
viewHolder
.
selectSwitch
.
isChecked
=
mStateCheckedMap
[
position
]
// viewHolder.selectSwitch.visibility =
// if (BaseActivity.isClickEditBtn) View.VISIBLE else View.GONE
// viewHolder.fileJoinTo.visibility =
// if (!BaseActivity.isClickEditBtn) View.VISIBLE else View.GONE
return
view
!!
}
fun
setEditClickState
(
isClick
:
Boolean
){
this
.
isEditBtnClick
=
isClick
}
fun
setFileShow
(
isShow
:
Boolean
){
isFileShow
=
isShow
}
class
ViewHolder
{
lateinit
var
fileIcon
:
ImageView
lateinit
var
fileJoinTo
:
ImageView
lateinit
var
fileName
:
TextView
lateinit
var
fileNone
:
TextView
lateinit
var
selectSwitch
:
CheckBox
}
package
com.xm.test.myfilemaster.adapter
import
android.content.Context
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.ImageView
import
android.widget.TextView
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.util.FileUtil
class
FilesItemViewAdapter
(
mItemFileList
:
List
<
FileBean
>,
mContext
:
Context
,
stateCheckedMap
:
SparseBooleanArray
):
BaseAdapter
()
{
private
var
mFileBeanList
:
List
<
FileBean
>
private
var
mInflater
:
LayoutInflater
private
var
mContext
:
Context
private
var
mStateCheckedMap
:
SparseBooleanArray
private
var
isEditBtnClick
=
false
private
var
isFileShow
=
true
init
{
this
.
mFileBeanList
=
mItemFileList
this
.
mContext
=
mContext
this
.
mInflater
=
LayoutInflater
.
from
(
mContext
)
this
.
mStateCheckedMap
=
stateCheckedMap
}
fun
setData
(
fileList
:
List
<
FileBean
>){
this
.
mFileBeanList
=
fileList
this
.
notifyDataSetChanged
()
}
override
fun
getCount
():
Int
{
return
mFileBeanList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
mFileBeanList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
viewHolder
:
ViewHolder
?
=
null
var
view
:
View
?
=
null
if
(
convertView
!=
null
){
view
=
convertView
viewHolder
=
view
.
tag
as
ViewHolder
}
else
{
view
=
mInflater
.
inflate
(
R
.
layout
.
files_item_layout
,
null
)
viewHolder
=
ViewHolder
()
viewHolder
.
fileIcon
=
view
.
findViewById
(
R
.
id
.
files_item_icon
)
viewHolder
.
fileJoinTo
=
view
.
findViewById
(
R
.
id
.
file_join_to_img
)
viewHolder
.
fileName
=
view
.
findViewById
(
R
.
id
.
file_item_name
)
viewHolder
.
fileNone
=
view
.
findViewById
(
R
.
id
.
file_item_none
)
viewHolder
.
selectSwitch
=
view
.
findViewById
(
R
.
id
.
file_select_switch
)
view
.
tag
=
viewHolder
}
val
filesItemBean
=
mFileBeanList
[
position
]
viewHolder
.
fileName
.
text
=
filesItemBean
.
fileName
if
(
filesItemBean
.
isDir
){
viewHolder
.
fileIcon
.
setImageResource
(
R
.
drawable
.
ic_files
)
viewHolder
.
fileJoinTo
.
visibility
=
if
(
isEditBtnClick
)
View
.
GONE
else
View
.
VISIBLE
viewHolder
.
selectSwitch
.
visibility
=
if
(
isEditBtnClick
)
View
.
VISIBLE
else
View
.
GONE
val
(
year
,
month
,
day
)
=
FileUtil
.
getFileCreateTime
(
filesItemBean
.
filePath
)
viewHolder
.
fileNone
.
text
=
"${filesItemBean.childList.size} item | $month-$day, $year"
}
else
{
val
icon
=
when
(
filesItemBean
.
fileType
){
"png"
,
"jpg"
->{
R
.
drawable
.
ic_image
}
"mp4"
,
"3gp"
,
"avi"
->{
R
.
drawable
.
ic_video
}
"mp3"
,
"aac"
,
"wav"
->{
R
.
drawable
.
ic_audio
}
"zip"
->{
R
.
drawable
.
ic_zip
}
"apk"
->{
R
.
drawable
.
ic_apk
}
"log"
->{
R
.
drawable
.
ic_log_file
}
"doc"
,
"docm"
,
"docx"
->{
R
.
drawable
.
ic_word
}
"xlsx"
,
"xlsm"
,
"xlsb"
,
"xltx"
->{
R
.
drawable
.
ic_excel
}
"ppt"
->{
R
.
drawable
.
ic_ppt
}
"pdf"
->{
R
.
drawable
.
ic_pdf
}
"txt"
->{
R
.
drawable
.
ic_txt
}
else
->
{
R
.
drawable
.
ic_copy
}
}
viewHolder
.
fileIcon
.
setImageResource
(
icon
)
viewHolder
.
fileJoinTo
.
visibility
=
View
.
GONE
viewHolder
.
selectSwitch
.
visibility
=
if
(
isEditBtnClick
)
View
.
VISIBLE
else
View
.
GONE
var
sizeStr
:
String
=
""
sizeStr
=
if
(
filesItemBean
.
fileSize
>
1024
*
1024
*
1024
){
"size ${filesItemBean.fileSize / 1024 / 1024 / 1024} GB"
}
else
if
(
filesItemBean
.
fileSize
>
1024
*
1024
){
"size ${filesItemBean.fileSize / 1024 / 1024} MB"
}
else
if
(
filesItemBean
.
fileSize
>
1024
){
"size ${filesItemBean.fileSize / 1024} KB"
}
else
{
"size ${filesItemBean.fileSize} B"
}
viewHolder
.
fileNone
.
text
=
"$sizeStr,type ${filesItemBean.fileType}"
}
viewHolder
.
selectSwitch
.
isChecked
=
mStateCheckedMap
[
position
]
// viewHolder.selectSwitch.visibility =
// if (BaseActivity.isClickEditBtn) View.VISIBLE else View.GONE
// viewHolder.fileJoinTo.visibility =
// if (!BaseActivity.isClickEditBtn) View.VISIBLE else View.GONE
return
view
!!
}
fun
setEditClickState
(
isClick
:
Boolean
){
this
.
isEditBtnClick
=
isClick
}
fun
setFileShow
(
isShow
:
Boolean
){
isFileShow
=
isShow
}
class
ViewHolder
{
lateinit
var
fileIcon
:
ImageView
lateinit
var
fileJoinTo
:
ImageView
lateinit
var
fileName
:
TextView
lateinit
var
fileNone
:
TextView
lateinit
var
selectSwitch
:
CheckBox
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/adapter/ImageItemAdapter.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/adapter/ImageItemAdapter.kt
View file @
c81d9d2a
package
com.
test.mydemo3.adapter
import
android.content.Context
import
android.graphics.BitmapFactory
import
android.graphics.drawable.BitmapDrawable
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.GridView
import
android.widget.ImageView
import
android.widget.TextView
import
com.cloud.cleanjunksdk.similar.PicSimilarInfo
import
com.
test.mydemo3.R
import
com.
test.mydemo3.activity.SimilarImagesActivity
import
com.
test.mydemo3.model.FileBean
import
com.
test.mydemo3.util.FileUtil
class
ImageItemAdapter
(
mContext
:
Context
,
mDataList
:
ArrayList
<
ArrayList
<
FileBean
>>):
BaseAdapter
()
{
private
var
mContext
:
Context
private
var
mDataList
:
ArrayList
<
ArrayList
<
FileBean
>>
private
var
mInfler
:
LayoutInflater
private
var
mItemCheckedArray
=
ArrayList
<
SparseBooleanArray
>()
private
lateinit
var
mImageViewHolder
:
ViewHolder
var
itemAdapter
=
ArrayList
<
ItemAdapter
>()
var
mCheckedLists
=
ArrayList
<
FileBean
>()
init
{
this
.
mInfler
=
LayoutInflater
.
from
(
mContext
)
this
.
mContext
=
mContext
this
.
mDataList
=
mDataList
}
override
fun
getCount
():
Int
{
Log
.
e
(
"yanglin"
,
"getCount: mdatalist ${mDataList.size}"
,
)
return
mDataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
mDataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
=
convertView
if
(
convertView
!=
null
){
mImageViewHolder
=
view
?.
tag
as
ViewHolder
}
else
{
mImageViewHolder
=
ViewHolder
()
view
=
mInfler
.
inflate
(
R
.
layout
.
image_item_layout
,
null
)
mImageViewHolder
.
similar
=
view
.
findViewById
(
R
.
id
.
similar_image_num_text
)
mImageViewHolder
.
itemGrid
=
view
.
findViewById
(
R
.
id
.
image_item_grid
)
view
.
tag
=
mImageViewHolder
}
if
(
mItemCheckedArray
.
size
!=
mDataList
.
size
){
mItemCheckedArray
.
add
(
SparseBooleanArray
())
// itemAdapter.add(ItemAdapter(mDataList[position], mContext, mItemCheckedArray[position], position))
}
mImageViewHolder
.
similar
.
text
=
String
.
format
(
mContext
.
getString
(
R
.
string
.
similar
,
mDataList
[
position
].
size
.
toString
()))
val
layoutParams
=
mImageViewHolder
.
itemGrid
.
layoutParams
if
(
itemAdapter
[
position
].
count
.
toFloat
()
/
4.0
==
1.0
){
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
*(
itemAdapter
[
position
].
count
/
4
),
mContext
)
}
else
{
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
*(
itemAdapter
[
position
].
count
/
4
+
1
),
mContext
)
}
mImageViewHolder
.
itemGrid
.
setOnItemClickListener
{
itemParent
,
itemView
,
itemPosition
,
itemId
->
if
(
SimilarImagesActivity
.
isClickEditBtn
){
println
(
"yanglin positioin $position itemPostion $itemPosition"
)
updateCheckBoxStatus
(
position
,
itemView
,
itemPosition
,
mImageViewHolder
.
itemGrid
,
mDataList
[
position
])
}
}
mImageViewHolder
.
itemGrid
.
adapter
=
itemAdapter
[
position
]
return
view
!!
}
fun
selectAll
(
isChecked
:
Boolean
){
Log
.
e
(
"yanglin"
,
"selectAll: $isChecked"
,
)
mCheckedLists
.
clear
()
if
(!
isChecked
){
for
(
i
in
0
..
<
mDataList
.
size
){
mItemCheckedArray
[
i
].
clear
()
}
}
else
{
for
(
i
in
0
..
<
mDataList
.
size
){
mCheckedLists
.
clear
()
setStateCheckedMap
(
i
,
isChecked
)
mCheckedLists
.
addAll
(
mDataList
[
i
])
itemAdapter
[
i
].
notifyDataSetChanged
()
}
}
}
fun
setStateCheckedMap
(
position
:
Int
,
isChecked
:
Boolean
){
for
(
i
in
mDataList
[
position
].
indices
){
mItemCheckedArray
[
position
].
put
(
i
,
isChecked
)
mImageViewHolder
.
itemGrid
.
setItemChecked
(
i
,
isChecked
)
}
}
fun
updateCheckBoxStatus
(
position
:
Int
,
view
:
View
,
itemPosition
:
Int
,
lv
:
GridView
,
fileBeanList
:
ArrayList
<
FileBean
>){
val
viewHolder
=
view
.
tag
as
ItemAdapter
.
ViewHolder
viewHolder
.
checkBox
.
toggle
()
lv
.
setItemChecked
(
itemPosition
,
viewHolder
.
checkBox
.
isChecked
)
mItemCheckedArray
[
position
].
put
(
itemPosition
,
viewHolder
.
checkBox
.
isChecked
)
if
(
viewHolder
.
checkBox
.
isChecked
){
mCheckedLists
.
add
(
fileBeanList
[
itemPosition
])
}
else
{
mCheckedLists
.
remove
(
fileBeanList
[
itemPosition
])
}
itemAdapter
[
position
].
notifyDataSetChanged
()
}
fun
setData
(
datas
:
ArrayList
<
ArrayList
<
FileBean
>>){
this
.
mDataList
=
datas
notifyDataSetChanged
()
}
class
ViewHolder
{
lateinit
var
similar
:
TextView
lateinit
var
itemGrid
:
GridView
}
class
ItemAdapter
(
list
:
ArrayList
<
PicSimilarInfo
>,
context
:
Context
,
mStateCheckedMap
:
SparseBooleanArray
,
mPosition
:
Int
):
BaseAdapter
(){
private
var
context
:
Context
private
var
dataList
:
ArrayList
<
PicSimilarInfo
>
private
var
stateCheckedMap
:
SparseBooleanArray
private
var
inflater
:
LayoutInflater
private
var
mPosition
:
Int
init
{
this
.
context
=
context
this
.
dataList
=
list
this
.
stateCheckedMap
=
mStateCheckedMap
this
.
inflater
=
LayoutInflater
.
from
(
context
)
this
.
mPosition
=
mPosition
}
override
fun
getCount
():
Int
{
return
dataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
=
convertView
val
itemHolder
:
ViewHolder
if
(
convertView
!=
null
){
itemHolder
=
view
?.
tag
as
ViewHolder
}
else
{
view
=
inflater
.
inflate
(
R
.
layout
.
item_layout
,
null
)
itemHolder
=
ViewHolder
()
itemHolder
.
imageView
=
view
.
findViewById
(
R
.
id
.
item_image
)
itemHolder
.
checkBox
=
view
.
findViewById
(
R
.
id
.
check_item_image_switch
)
view
.
tag
=
itemHolder
}
// BitmapDrawable(context.resources, BitmapFactory.decodeFile(dataList[position].filePath))
itemHolder
.
checkBox
.
visibility
=
if
(
SimilarImagesActivity
.
isClickEditBtn
)
View
.
VISIBLE
else
View
.
GONE
itemHolder
.
imageView
.
setImageDrawable
(
BitmapDrawable
(
context
.
resources
,
BitmapFactory
.
decodeFile
(
dataList
[
mPosition
].
getmList
()[
position
].
path
)))
itemHolder
.
imageView
.
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
,
context
)
// if (DuplicateImagesActivity.isClickCheckBoxAllBtn){
// itemHolder.checkBox.isChecked = true
// }else{
itemHolder
.
checkBox
.
isChecked
=
stateCheckedMap
[
position
]
// }
return
view
!!
}
fun
setData
(
datas
:
ArrayList
<
PicSimilarInfo
>){
this
.
dataList
=
datas
}
class
ViewHolder
{
lateinit
var
checkBox
:
CheckBox
lateinit
var
imageView
:
ImageView
}
}
package
com.
xm.test.myfilemaster.adapter
import
android.content.Context
import
android.graphics.BitmapFactory
import
android.graphics.drawable.BitmapDrawable
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.GridView
import
android.widget.ImageView
import
android.widget.TextView
import
com.cloud.cleanjunksdk.similar.PicSimilarInfo
import
com.
xm.test.myfilemaster.R
import
com.
xm.test.myfilemaster.activity.SimilarImagesActivity
import
com.
xm.test.myfilemaster.model.FileBean
import
com.
xm.test.myfilemaster.util.FileUtil
class
ImageItemAdapter
(
mContext
:
Context
,
mDataList
:
ArrayList
<
ArrayList
<
FileBean
>>):
BaseAdapter
()
{
private
var
mContext
:
Context
private
var
mDataList
:
ArrayList
<
ArrayList
<
FileBean
>>
private
var
mInfler
:
LayoutInflater
private
var
mItemCheckedArray
=
ArrayList
<
SparseBooleanArray
>()
private
lateinit
var
mImageViewHolder
:
ViewHolder
var
itemAdapter
=
ArrayList
<
ItemAdapter
>()
var
mCheckedLists
=
ArrayList
<
FileBean
>()
init
{
this
.
mInfler
=
LayoutInflater
.
from
(
mContext
)
this
.
mContext
=
mContext
this
.
mDataList
=
mDataList
}
override
fun
getCount
():
Int
{
Log
.
e
(
"yanglin"
,
"getCount: mdatalist ${mDataList.size}"
,
)
return
mDataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
mDataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
=
convertView
if
(
convertView
!=
null
){
mImageViewHolder
=
view
?.
tag
as
ViewHolder
}
else
{
mImageViewHolder
=
ViewHolder
()
view
=
mInfler
.
inflate
(
R
.
layout
.
image_item_layout
,
null
)
mImageViewHolder
.
similar
=
view
.
findViewById
(
R
.
id
.
similar_image_num_text
)
mImageViewHolder
.
itemGrid
=
view
.
findViewById
(
R
.
id
.
image_item_grid
)
view
.
tag
=
mImageViewHolder
}
if
(
mItemCheckedArray
.
size
!=
mDataList
.
size
){
mItemCheckedArray
.
add
(
SparseBooleanArray
())
// itemAdapter.add(ItemAdapter(mDataList[position], mContext, mItemCheckedArray[position], position))
}
mImageViewHolder
.
similar
.
text
=
String
.
format
(
mContext
.
getString
(
R
.
string
.
similar
,
mDataList
[
position
].
size
.
toString
()))
val
layoutParams
=
mImageViewHolder
.
itemGrid
.
layoutParams
if
(
itemAdapter
[
position
].
count
.
toFloat
()
/
4.0
==
1.0
){
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
*(
itemAdapter
[
position
].
count
/
4
),
mContext
)
}
else
{
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
*(
itemAdapter
[
position
].
count
/
4
+
1
),
mContext
)
}
mImageViewHolder
.
itemGrid
.
setOnItemClickListener
{
itemParent
,
itemView
,
itemPosition
,
itemId
->
if
(
SimilarImagesActivity
.
isClickEditBtn
){
println
(
"yanglin positioin $position itemPostion $itemPosition"
)
updateCheckBoxStatus
(
position
,
itemView
,
itemPosition
,
mImageViewHolder
.
itemGrid
,
mDataList
[
position
])
}
}
mImageViewHolder
.
itemGrid
.
adapter
=
itemAdapter
[
position
]
return
view
!!
}
fun
selectAll
(
isChecked
:
Boolean
){
Log
.
e
(
"yanglin"
,
"selectAll: $isChecked"
,
)
mCheckedLists
.
clear
()
if
(!
isChecked
){
for
(
i
in
0
..
<
mDataList
.
size
){
mItemCheckedArray
[
i
].
clear
()
}
}
else
{
for
(
i
in
0
..
<
mDataList
.
size
){
mCheckedLists
.
clear
()
setStateCheckedMap
(
i
,
isChecked
)
mCheckedLists
.
addAll
(
mDataList
[
i
])
itemAdapter
[
i
].
notifyDataSetChanged
()
}
}
}
fun
setStateCheckedMap
(
position
:
Int
,
isChecked
:
Boolean
){
for
(
i
in
mDataList
[
position
].
indices
){
mItemCheckedArray
[
position
].
put
(
i
,
isChecked
)
mImageViewHolder
.
itemGrid
.
setItemChecked
(
i
,
isChecked
)
}
}
fun
updateCheckBoxStatus
(
position
:
Int
,
view
:
View
,
itemPosition
:
Int
,
lv
:
GridView
,
fileBeanList
:
ArrayList
<
FileBean
>){
val
viewHolder
=
view
.
tag
as
ItemAdapter
.
ViewHolder
viewHolder
.
checkBox
.
toggle
()
lv
.
setItemChecked
(
itemPosition
,
viewHolder
.
checkBox
.
isChecked
)
mItemCheckedArray
[
position
].
put
(
itemPosition
,
viewHolder
.
checkBox
.
isChecked
)
if
(
viewHolder
.
checkBox
.
isChecked
){
mCheckedLists
.
add
(
fileBeanList
[
itemPosition
])
}
else
{
mCheckedLists
.
remove
(
fileBeanList
[
itemPosition
])
}
itemAdapter
[
position
].
notifyDataSetChanged
()
}
fun
setData
(
datas
:
ArrayList
<
ArrayList
<
FileBean
>>){
this
.
mDataList
=
datas
notifyDataSetChanged
()
}
class
ViewHolder
{
lateinit
var
similar
:
TextView
lateinit
var
itemGrid
:
GridView
}
class
ItemAdapter
(
list
:
ArrayList
<
PicSimilarInfo
>,
context
:
Context
,
mStateCheckedMap
:
SparseBooleanArray
,
mPosition
:
Int
):
BaseAdapter
(){
private
var
context
:
Context
private
var
dataList
:
ArrayList
<
PicSimilarInfo
>
private
var
stateCheckedMap
:
SparseBooleanArray
private
var
inflater
:
LayoutInflater
private
var
mPosition
:
Int
init
{
this
.
context
=
context
this
.
dataList
=
list
this
.
stateCheckedMap
=
mStateCheckedMap
this
.
inflater
=
LayoutInflater
.
from
(
context
)
this
.
mPosition
=
mPosition
}
override
fun
getCount
():
Int
{
return
dataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
=
convertView
val
itemHolder
:
ViewHolder
if
(
convertView
!=
null
){
itemHolder
=
view
?.
tag
as
ViewHolder
}
else
{
view
=
inflater
.
inflate
(
R
.
layout
.
item_layout
,
null
)
itemHolder
=
ViewHolder
()
itemHolder
.
imageView
=
view
.
findViewById
(
R
.
id
.
item_image
)
itemHolder
.
checkBox
=
view
.
findViewById
(
R
.
id
.
check_item_image_switch
)
view
.
tag
=
itemHolder
}
// BitmapDrawable(context.resources, BitmapFactory.decodeFile(dataList[position].filePath))
itemHolder
.
checkBox
.
visibility
=
if
(
SimilarImagesActivity
.
isClickEditBtn
)
View
.
VISIBLE
else
View
.
GONE
itemHolder
.
imageView
.
setImageDrawable
(
BitmapDrawable
(
context
.
resources
,
BitmapFactory
.
decodeFile
(
dataList
[
mPosition
].
getmList
()[
position
].
path
)))
itemHolder
.
imageView
.
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
,
context
)
// if (DuplicateImagesActivity.isClickCheckBoxAllBtn){
// itemHolder.checkBox.isChecked = true
// }else{
itemHolder
.
checkBox
.
isChecked
=
stateCheckedMap
[
position
]
// }
return
view
!!
}
fun
setData
(
datas
:
ArrayList
<
PicSimilarInfo
>){
this
.
dataList
=
datas
}
class
ViewHolder
{
lateinit
var
checkBox
:
CheckBox
lateinit
var
imageView
:
ImageView
}
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/adapter/MediaAdapter.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/adapter/MediaAdapter.kt
View file @
c81d9d2a
package
com.test.mydemo3.adapter
import
android.content.Context
import
android.graphics.BitmapFactory
import
android.graphics.drawable.BitmapDrawable
import
android.os.Looper
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.ImageView
import
com.bumptech.glide.Glide
import
com.test.mydemo3.R
import
com.test.mydemo3.activity.MediaActivity
import
com.test.mydemo3.model.FileBean
import
com.test.mydemo3.util.FileUtil
import
com.test.mydemo3.util.MediaUtil
import
java.util.logging.Handler
class
MediaAdapter
(
mListData
:
ArrayList
<
FileBean
>,
mContext
:
Context
,
mStateCheckedMap
:
SparseBooleanArray
,
fileType
:
String
,
mItemHeight
:
Int
):
BaseAdapter
()
{
private
var
mListData
:
ArrayList
<
FileBean
>
private
var
mContext
:
Context
private
var
mInflater
:
LayoutInflater
private
var
mStateCheckedMap
:
SparseBooleanArray
private
var
mFileType
:
String
private
var
mItemHeight
:
Int
=
0
private
var
dpToPx
=
0
init
{
this
.
mListData
=
mListData
this
.
mContext
=
mContext
this
.
mStateCheckedMap
=
mStateCheckedMap
this
.
mInflater
=
LayoutInflater
.
from
(
mContext
)
this
.
mFileType
=
fileType
this
.
mItemHeight
=
mItemHeight
this
.
dpToPx
=
FileUtil
.
dpToPx
(
mItemHeight
,
mContext
)
}
override
fun
getCount
():
Int
{
return
mListData
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
mListData
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
mViewHolder
:
ViewHolder
var
view
:
View
?
=
convertView
if
(
view
!=
null
){
mViewHolder
=
view
.
tag
as
ViewHolder
}
else
{
mViewHolder
=
ViewHolder
()
view
=
mInflater
.
inflate
(
R
.
layout
.
item_layout
,
null
)
mViewHolder
.
image
=
view
.
findViewById
(
R
.
id
.
item_image
)
mViewHolder
.
checkedBox
=
view
.
findViewById
(
R
.
id
.
check_item_image_switch
)
view
.
tag
=
mViewHolder
}
if
(
mFileType
.
equals
(
"image"
)){
mViewHolder
.
image
.
setImageDrawable
(
mListData
[
position
].
drawable
)
mViewHolder
.
image
.
layoutParams
.
height
=
dpToPx
}
else
{
mViewHolder
.
image
.
setImageResource
(
R
.
drawable
.
ic_video
)
mViewHolder
.
image
.
layoutParams
.
height
=
dpToPx
}
mViewHolder
.
checkedBox
.
visibility
=
if
(
MediaActivity
.
isClickEditBtn
)
View
.
VISIBLE
else
View
.
GONE
mViewHolder
.
checkedBox
.
isChecked
=
mStateCheckedMap
[
position
]
return
view
!!
}
fun
setItemHeight
(
height
:
Int
){
this
.
mItemHeight
=
height
}
fun
setData
(
data
:
ArrayList
<
FileBean
>)
{
this
.
mListData
=
data
this
.
notifyDataSetChanged
()
}
class
ViewHolder
{
lateinit
var
image
:
ImageView
lateinit
var
checkedBox
:
CheckBox
}
package
com.xm.test.myfilemaster.adapter
import
android.content.Context
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.ImageView
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.activity.MediaActivity
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.util.FileUtil
class
MediaAdapter
(
mListData
:
ArrayList
<
FileBean
>,
mContext
:
Context
,
mStateCheckedMap
:
SparseBooleanArray
,
fileType
:
String
,
mItemHeight
:
Int
):
BaseAdapter
()
{
private
var
mListData
:
ArrayList
<
FileBean
>
private
var
mContext
:
Context
private
var
mInflater
:
LayoutInflater
private
var
mStateCheckedMap
:
SparseBooleanArray
private
var
mFileType
:
String
private
var
mItemHeight
:
Int
=
0
private
var
dpToPx
=
0
init
{
this
.
mListData
=
mListData
this
.
mContext
=
mContext
this
.
mStateCheckedMap
=
mStateCheckedMap
this
.
mInflater
=
LayoutInflater
.
from
(
mContext
)
this
.
mFileType
=
fileType
this
.
mItemHeight
=
mItemHeight
this
.
dpToPx
=
FileUtil
.
dpToPx
(
mItemHeight
,
mContext
)
}
override
fun
getCount
():
Int
{
return
mListData
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
mListData
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
mViewHolder
:
ViewHolder
var
view
:
View
?
=
convertView
if
(
view
!=
null
){
mViewHolder
=
view
.
tag
as
ViewHolder
}
else
{
mViewHolder
=
ViewHolder
()
view
=
mInflater
.
inflate
(
R
.
layout
.
item_layout
,
null
)
mViewHolder
.
image
=
view
.
findViewById
(
R
.
id
.
item_image
)
mViewHolder
.
checkedBox
=
view
.
findViewById
(
R
.
id
.
check_item_image_switch
)
view
.
tag
=
mViewHolder
}
if
(
mFileType
.
equals
(
"image"
)){
mViewHolder
.
image
.
setImageDrawable
(
mListData
[
position
].
drawable
)
mViewHolder
.
image
.
layoutParams
.
height
=
dpToPx
}
else
{
mViewHolder
.
image
.
setImageResource
(
R
.
drawable
.
ic_video
)
mViewHolder
.
image
.
layoutParams
.
height
=
dpToPx
}
mViewHolder
.
checkedBox
.
visibility
=
if
(
MediaActivity
.
isClickEditBtn
)
View
.
VISIBLE
else
View
.
GONE
mViewHolder
.
checkedBox
.
isChecked
=
mStateCheckedMap
[
position
]
return
view
!!
}
fun
setItemHeight
(
height
:
Int
){
this
.
mItemHeight
=
height
}
fun
setData
(
data
:
ArrayList
<
FileBean
>)
{
this
.
mListData
=
data
this
.
notifyDataSetChanged
()
}
class
ViewHolder
{
lateinit
var
image
:
ImageView
lateinit
var
checkedBox
:
CheckBox
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/adapter/ScanResultAdapter.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/adapter/ScanResultAdapter.kt
View file @
c81d9d2a
package
com.
test.mydemo3.adapter
import
android.content.Context
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.ImageView
import
android.widget.TextView
import
com.t
est.mydemo3.R
import
com.
trustlook.sdk.data.AppInfo
class
ScanResultAdapter
(
dataList
:
ArrayList
<
AppInfo
>,
context
:
Context
)
:
BaseAdapter
()
{
private
var
dataList
:
ArrayList
<
AppInfo
>
private
var
inflater
:
LayoutInflater
private
var
context
:
Context
init
{
this
.
dataList
=
dataList
this
.
context
=
context
this
.
inflater
=
LayoutInflater
.
from
(
context
)
}
override
fun
getCount
():
Int
{
return
dataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
:
View
var
viewHolder
:
ScanResultViewHolder
if
(
convertView
!=
null
){
view
=
convertView
viewHolder
=
view
.
tag
as
ScanResultViewHolder
}
else
{
viewHolder
=
ScanResultViewHolder
()
view
=
inflater
.
inflate
(
R
.
layout
.
scan_result_list_item_layout
,
null
)
viewHolder
.
appIcon
=
view
.
findViewById
(
R
.
id
.
scan_app_icon
)
viewHolder
.
appName
=
view
.
findViewById
(
R
.
id
.
scan_app_name
)
viewHolder
.
appHint
=
view
.
findViewById
(
R
.
id
.
scan_app_hint
)
view
.
tag
=
viewHolder
}
viewHolder
.
appIcon
viewHolder
.
appName
.
text
=
dataList
[
position
].
appName
viewHolder
.
appHint
.
text
=
dataList
[
position
].
virusName
return
view
}
class
ScanResultViewHolder
{
lateinit
var
appIcon
:
ImageView
lateinit
var
appName
:
TextView
lateinit
var
appHint
:
TextView
}
package
com.
xm.test.myfilemaster.adapter
import
android.content.Context
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.ImageView
import
android.widget.TextView
import
com.t
rustlook.sdk.data.AppInfo
import
com.
xm.test.myfilemaster.R
class
ScanResultAdapter
(
dataList
:
ArrayList
<
AppInfo
>,
context
:
Context
)
:
BaseAdapter
()
{
private
var
dataList
:
ArrayList
<
AppInfo
>
private
var
inflater
:
LayoutInflater
private
var
context
:
Context
init
{
this
.
dataList
=
dataList
this
.
context
=
context
this
.
inflater
=
LayoutInflater
.
from
(
context
)
}
override
fun
getCount
():
Int
{
return
dataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
:
View
var
viewHolder
:
ScanResultViewHolder
if
(
convertView
!=
null
){
view
=
convertView
viewHolder
=
view
.
tag
as
ScanResultViewHolder
}
else
{
viewHolder
=
ScanResultViewHolder
()
view
=
inflater
.
inflate
(
R
.
layout
.
scan_result_list_item_layout
,
null
)
viewHolder
.
appIcon
=
view
.
findViewById
(
R
.
id
.
scan_app_icon
)
viewHolder
.
appName
=
view
.
findViewById
(
R
.
id
.
scan_app_name
)
viewHolder
.
appHint
=
view
.
findViewById
(
R
.
id
.
scan_app_hint
)
view
.
tag
=
viewHolder
}
viewHolder
.
appIcon
viewHolder
.
appName
.
text
=
dataList
[
position
].
appName
viewHolder
.
appHint
.
text
=
dataList
[
position
].
virusName
return
view
}
class
ScanResultViewHolder
{
lateinit
var
appIcon
:
ImageView
lateinit
var
appName
:
TextView
lateinit
var
appHint
:
TextView
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/adapter/SimilarBeanAdapter.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/adapter/SimilarBeanAdapter.kt
View file @
c81d9d2a
package
com.
test.mydemo3.adapter
import
android.content.Context
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.GridView
import
androidx.recyclerview.widget.RecyclerView
import
com.cloud.cleanjunksdk.similar.PicInfo
import
com.cloud.cleanjunksdk.similar.PicSimilarInfo
import
com.
test.mydemo3.R
import
com.
test.mydemo3.activity.SimilarImagesActivity
import
com.
test.mydemo3.databinding.ImageItemLayoutBinding
import
com.
test.mydemo3.util.FileUtil
class
SimilarBeanAdapter
(
context
:
Context
)
:
RecyclerView
.
Adapter
<
SimilarBeanAdapter
.
AA
>()
{
private
val
list
=
arrayListOf
<
PicSimilarInfo
>()
private
var
context
:
Context
var
mCheckedLists
:
MutableList
<
PicInfo
>
=
mutableListOf
<
PicInfo
>()
private
var
mItemCheckedArray
=
ArrayList
<
SparseBooleanArray
>()
val
mGridAdapters
=
ArrayList
<
SimilarGridAdapter
>()
val
holders
=
ArrayList
<
AA
>()
init
{
this
.
context
=
context
}
fun
Int
.
inflate
(
parent
:
ViewGroup
,
attachToRoot
:
Boolean
=
false
):
View
{
return
LayoutInflater
.
from
(
parent
.
context
).
inflate
(
this
,
parent
,
attachToRoot
)
}
class
AA
(
view
:
View
)
:
RecyclerView
.
ViewHolder
(
view
)
{
val
binding
=
ImageItemLayoutBinding
.
bind
(
view
)
}
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
AA
{
val
root
=
R
.
layout
.
image_item_layout
.
inflate
(
parent
)
return
AA
(
root
)
}
override
fun
getItemCount
():
Int
{
return
list
.
size
}
override
fun
onBindViewHolder
(
holder
:
AA
,
position
:
Int
)
{
holders
.
add
(
holder
)
if
(
mItemCheckedArray
.
size
!=
list
.
size
){
mItemCheckedArray
.
add
(
SparseBooleanArray
())
// itemAdapter.add(ItemAdapter(mDataList[position], mContext, mItemCheckedArray[position], position))
}
mGridAdapters
.
add
(
SimilarGridAdapter
(
list
[
position
].
getmList
(),
context
,
mItemCheckedArray
[
position
],
position
))
// val data = list[position]
holder
.
binding
.
similarImageNumText
.
text
=
String
.
format
(
context
.
getString
(
R
.
string
.
similar
,
list
[
position
].
getmList
().
size
.
toString
()))
val
layoutParams
=
holder
.
binding
.
imageItemGrid
.
layoutParams
if
(
list
[
position
].
getmList
().
size
.
toFloat
()
/
4.0
==
1.0
){
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
*(
list
[
position
].
getmList
().
size
/
4
),
context
)
}
else
{
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
*(
list
[
position
].
getmList
().
size
/
4
+
1
),
context
)
}
holder
.
binding
.
imageItemGrid
.
setOnItemClickListener
{
parent
,
view
,
itemPosition
,
id
->
if
(
SimilarImagesActivity
.
isClickEditBtn
){
println
(
"yanglin positioin $position itemPostion $itemPosition"
)
updateCheckBoxStatus
(
position
,
view
,
itemPosition
,
holder
.
binding
.
imageItemGrid
,
list
[
position
].
getmList
())
}
}
holder
.
binding
.
imageItemGrid
.
adapter
=
mGridAdapters
[
position
]
}
fun
updateCheckBoxStatus
(
position
:
Int
,
view
:
View
,
itemPosition
:
Int
,
lv
:
GridView
,
fileBeanList
:
MutableList
<
PicInfo
>){
val
viewHolder
=
view
.
tag
as
ImageItemAdapter
.
ItemAdapter
.
ViewHolder
viewHolder
.
checkBox
.
toggle
()
lv
.
setItemChecked
(
itemPosition
,
viewHolder
.
checkBox
.
isChecked
)
mItemCheckedArray
[
position
].
put
(
itemPosition
,
viewHolder
.
checkBox
.
isChecked
)
if
(
viewHolder
.
checkBox
.
isChecked
){
mCheckedLists
.
add
(
fileBeanList
[
itemPosition
])
}
else
{
mCheckedLists
.
remove
(
fileBeanList
[
itemPosition
])
}
mGridAdapters
[
position
].
notifyDataSetChanged
()
}
fun
setData
(
data
:
List
<
PicSimilarInfo
>)
{
list
.
clear
()
list
.
addAll
(
data
)
notifyDataSetChanged
()
}
fun
selectAll
(
isChecked
:
Boolean
){
Log
.
e
(
"yanglin"
,
"selectAll: $isChecked"
,
)
mCheckedLists
.
clear
()
if
(!
isChecked
){
for
(
i
in
0
..
<
list
.
size
){
mItemCheckedArray
[
i
].
clear
()
}
}
else
{
for
(
i
in
0
..
<
list
.
size
){
mCheckedLists
.
clear
()
setStateCheckedMap
(
i
,
isChecked
)
mCheckedLists
.
addAll
(
list
[
i
].
getmList
())
mGridAdapters
[
i
].
notifyDataSetChanged
()
}
}
}
fun
setStateCheckedMap
(
position
:
Int
,
isChecked
:
Boolean
){
for
(
i
in
list
[
position
].
getmList
().
indices
){
mItemCheckedArray
[
position
].
put
(
i
,
isChecked
)
holders
[
position
].
binding
.
imageItemGrid
.
setItemChecked
(
i
,
isChecked
)
}
}
package
com.
xm.test.myfilemaster.adapter
import
android.content.Context
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.GridView
import
androidx.recyclerview.widget.RecyclerView
import
com.cloud.cleanjunksdk.similar.PicInfo
import
com.cloud.cleanjunksdk.similar.PicSimilarInfo
import
com.
xm.test.myfilemaster.R
import
com.
xm.test.myfilemaster.activity.SimilarImagesActivity
import
com.
xm.test.myfilemaster.databinding.ImageItemLayoutBinding
import
com.
xm.test.myfilemaster.util.FileUtil
class
SimilarBeanAdapter
(
context
:
Context
)
:
RecyclerView
.
Adapter
<
SimilarBeanAdapter
.
AA
>()
{
private
val
list
=
arrayListOf
<
PicSimilarInfo
>()
private
var
context
:
Context
var
mCheckedLists
:
MutableList
<
PicInfo
>
=
mutableListOf
<
PicInfo
>()
private
var
mItemCheckedArray
=
ArrayList
<
SparseBooleanArray
>()
val
mGridAdapters
=
ArrayList
<
SimilarGridAdapter
>()
val
holders
=
ArrayList
<
AA
>()
init
{
this
.
context
=
context
}
fun
Int
.
inflate
(
parent
:
ViewGroup
,
attachToRoot
:
Boolean
=
false
):
View
{
return
LayoutInflater
.
from
(
parent
.
context
).
inflate
(
this
,
parent
,
attachToRoot
)
}
class
AA
(
view
:
View
)
:
RecyclerView
.
ViewHolder
(
view
)
{
val
binding
=
ImageItemLayoutBinding
.
bind
(
view
)
}
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
viewType
:
Int
):
AA
{
val
root
=
R
.
layout
.
image_item_layout
.
inflate
(
parent
)
return
AA
(
root
)
}
override
fun
getItemCount
():
Int
{
return
list
.
size
}
override
fun
onBindViewHolder
(
holder
:
AA
,
position
:
Int
)
{
holders
.
add
(
holder
)
if
(
mItemCheckedArray
.
size
!=
list
.
size
){
mItemCheckedArray
.
add
(
SparseBooleanArray
())
// itemAdapter.add(ItemAdapter(mDataList[position], mContext, mItemCheckedArray[position], position))
}
mGridAdapters
.
add
(
SimilarGridAdapter
(
list
[
position
].
getmList
(),
context
,
mItemCheckedArray
[
position
],
position
))
// val data = list[position]
holder
.
binding
.
similarImageNumText
.
text
=
String
.
format
(
context
.
getString
(
R
.
string
.
similar
,
list
[
position
].
getmList
().
size
.
toString
()))
val
layoutParams
=
holder
.
binding
.
imageItemGrid
.
layoutParams
if
(
list
[
position
].
getmList
().
size
.
toFloat
()
/
4.0
==
1.0
){
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
*(
list
[
position
].
getmList
().
size
/
4
),
context
)
}
else
{
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
*(
list
[
position
].
getmList
().
size
/
4
+
1
),
context
)
}
holder
.
binding
.
imageItemGrid
.
setOnItemClickListener
{
parent
,
view
,
itemPosition
,
id
->
if
(
SimilarImagesActivity
.
isClickEditBtn
){
println
(
"yanglin positioin $position itemPostion $itemPosition"
)
updateCheckBoxStatus
(
position
,
view
,
itemPosition
,
holder
.
binding
.
imageItemGrid
,
list
[
position
].
getmList
())
}
}
holder
.
binding
.
imageItemGrid
.
adapter
=
mGridAdapters
[
position
]
}
fun
updateCheckBoxStatus
(
position
:
Int
,
view
:
View
,
itemPosition
:
Int
,
lv
:
GridView
,
fileBeanList
:
MutableList
<
PicInfo
>){
val
viewHolder
=
view
.
tag
as
ImageItemAdapter
.
ItemAdapter
.
ViewHolder
viewHolder
.
checkBox
.
toggle
()
lv
.
setItemChecked
(
itemPosition
,
viewHolder
.
checkBox
.
isChecked
)
mItemCheckedArray
[
position
].
put
(
itemPosition
,
viewHolder
.
checkBox
.
isChecked
)
if
(
viewHolder
.
checkBox
.
isChecked
){
mCheckedLists
.
add
(
fileBeanList
[
itemPosition
])
}
else
{
mCheckedLists
.
remove
(
fileBeanList
[
itemPosition
])
}
mGridAdapters
[
position
].
notifyDataSetChanged
()
}
fun
setData
(
data
:
List
<
PicSimilarInfo
>)
{
list
.
clear
()
list
.
addAll
(
data
)
notifyDataSetChanged
()
}
fun
selectAll
(
isChecked
:
Boolean
){
Log
.
e
(
"yanglin"
,
"selectAll: $isChecked"
,
)
mCheckedLists
.
clear
()
if
(!
isChecked
){
for
(
i
in
0
..
<
list
.
size
){
mItemCheckedArray
[
i
].
clear
()
}
}
else
{
for
(
i
in
0
..
<
list
.
size
){
mCheckedLists
.
clear
()
setStateCheckedMap
(
i
,
isChecked
)
mCheckedLists
.
addAll
(
list
[
i
].
getmList
())
mGridAdapters
[
i
].
notifyDataSetChanged
()
}
}
}
fun
setStateCheckedMap
(
position
:
Int
,
isChecked
:
Boolean
){
for
(
i
in
list
[
position
].
getmList
().
indices
){
mItemCheckedArray
[
position
].
put
(
i
,
isChecked
)
holders
[
position
].
binding
.
imageItemGrid
.
setItemChecked
(
i
,
isChecked
)
}
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/adapter/SimilarGridAdapter.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/adapter/SimilarGridAdapter.kt
View file @
c81d9d2a
package
com.test.mydemo3.adapter
import
android.content.Context
import
android.graphics.BitmapFactory
import
android.graphics.drawable.BitmapDrawable
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.ImageView
import
com.cloud.cleanjunksdk.similar.PicInfo
import
com.cloud.cleanjunksdk.similar.PicSimilarInfo
import
com.test.mydemo3.R
import
com.test.mydemo3.activity.SimilarImagesActivity
import
com.test.mydemo3.util.FileUtil
class
SimilarGridAdapter
(
list
:
MutableList
<
PicInfo
>,
context
:
Context
,
mStateCheckedMap
:
SparseBooleanArray
,
mPosition
:
Int
):
BaseAdapter
(){
private
var
context
:
Context
private
var
dataList
:
MutableList
<
PicInfo
>
private
var
stateCheckedMap
:
SparseBooleanArray
private
var
inflater
:
LayoutInflater
private
var
mPosition
:
Int
init
{
this
.
context
=
context
this
.
dataList
=
list
this
.
stateCheckedMap
=
mStateCheckedMap
this
.
inflater
=
LayoutInflater
.
from
(
context
)
this
.
mPosition
=
mPosition
}
override
fun
getCount
():
Int
{
return
dataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
=
convertView
val
itemHolder
:
ViewHolder
if
(
convertView
!=
null
){
itemHolder
=
view
?.
tag
as
ViewHolder
}
else
{
view
=
inflater
.
inflate
(
R
.
layout
.
item_layout
,
null
)
itemHolder
=
ViewHolder
()
itemHolder
.
imageView
=
view
.
findViewById
(
R
.
id
.
item_image
)
itemHolder
.
checkBox
=
view
.
findViewById
(
R
.
id
.
check_item_image_switch
)
view
.
tag
=
itemHolder
}
// BitmapDrawable(context.resources, BitmapFactory.decodeFile(dataList[position].filePath))
itemHolder
.
checkBox
.
visibility
=
if
(
SimilarImagesActivity
.
isClickEditBtn
)
View
.
VISIBLE
else
View
.
GONE
itemHolder
.
imageView
.
setImageDrawable
(
BitmapDrawable
(
context
.
resources
,
BitmapFactory
.
decodeFile
(
dataList
[
position
].
path
)))
itemHolder
.
imageView
.
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
,
context
)
// if (DuplicateImagesActivity.isClickCheckBoxAllBtn){
// itemHolder.checkBox.isChecked = true
// }else{
itemHolder
.
checkBox
.
isChecked
=
stateCheckedMap
[
position
]
// }
return
view
!!
}
fun
setData
(
datas
:
MutableList
<
PicInfo
>){
this
.
dataList
=
datas
}
class
ViewHolder
{
lateinit
var
checkBox
:
CheckBox
lateinit
var
imageView
:
ImageView
}
package
com.xm.test.myfilemaster.adapter
import
android.content.Context
import
android.graphics.BitmapFactory
import
android.graphics.drawable.BitmapDrawable
import
android.util.SparseBooleanArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.CheckBox
import
android.widget.ImageView
import
com.cloud.cleanjunksdk.similar.PicInfo
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.activity.SimilarImagesActivity
import
com.xm.test.myfilemaster.util.FileUtil
class
SimilarGridAdapter
(
list
:
MutableList
<
PicInfo
>,
context
:
Context
,
mStateCheckedMap
:
SparseBooleanArray
,
mPosition
:
Int
):
BaseAdapter
(){
private
var
context
:
Context
private
var
dataList
:
MutableList
<
PicInfo
>
private
var
stateCheckedMap
:
SparseBooleanArray
private
var
inflater
:
LayoutInflater
private
var
mPosition
:
Int
init
{
this
.
context
=
context
this
.
dataList
=
list
this
.
stateCheckedMap
=
mStateCheckedMap
this
.
inflater
=
LayoutInflater
.
from
(
context
)
this
.
mPosition
=
mPosition
}
override
fun
getCount
():
Int
{
return
dataList
.
size
}
override
fun
getItem
(
position
:
Int
):
Any
{
return
dataList
[
position
]
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
position
.
toLong
()
}
override
fun
getView
(
position
:
Int
,
convertView
:
View
?,
parent
:
ViewGroup
?):
View
{
var
view
=
convertView
val
itemHolder
:
ViewHolder
if
(
convertView
!=
null
){
itemHolder
=
view
?.
tag
as
ViewHolder
}
else
{
view
=
inflater
.
inflate
(
R
.
layout
.
item_layout
,
null
)
itemHolder
=
ViewHolder
()
itemHolder
.
imageView
=
view
.
findViewById
(
R
.
id
.
item_image
)
itemHolder
.
checkBox
=
view
.
findViewById
(
R
.
id
.
check_item_image_switch
)
view
.
tag
=
itemHolder
}
// BitmapDrawable(context.resources, BitmapFactory.decodeFile(dataList[position].filePath))
itemHolder
.
checkBox
.
visibility
=
if
(
SimilarImagesActivity
.
isClickEditBtn
)
View
.
VISIBLE
else
View
.
GONE
itemHolder
.
imageView
.
setImageDrawable
(
BitmapDrawable
(
context
.
resources
,
BitmapFactory
.
decodeFile
(
dataList
[
position
].
path
)))
itemHolder
.
imageView
.
layoutParams
.
height
=
FileUtil
.
dpToPx
(
83
,
context
)
// if (DuplicateImagesActivity.isClickCheckBoxAllBtn){
// itemHolder.checkBox.isChecked = true
// }else{
itemHolder
.
checkBox
.
isChecked
=
stateCheckedMap
[
position
]
// }
return
view
!!
}
fun
setData
(
datas
:
MutableList
<
PicInfo
>){
this
.
dataList
=
datas
}
class
ViewHolder
{
lateinit
var
checkBox
:
CheckBox
lateinit
var
imageView
:
ImageView
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/antivirus/AntivirusActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/antivirus/AntivirusActivity.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.antivirus
package
com.
xm.test.myfilemaster
.antivirus
import
android.content.Intent
import
android.os.Bundle
...
...
@@ -9,11 +9,11 @@ import android.view.View
import
android.widget.ProgressBar
import
android.widget.TextView
import
androidx.appcompat.app.AppCompatActivity
import
com.test.mydemo3.MyApplication
import
com.test.mydemo3.R
import
com.test.mydemo3.activity.ScanResultActivity
import
com.trustlook.sdk.cloudscan.CloudScanListener
import
com.trustlook.sdk.data.AppInfo
import
com.xm.test.myfilemaster.MyApplication
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.activity.ScanResultActivity
class
AntivirusActivity
:
AppCompatActivity
()
{
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/base/BaseAbsView.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/base/BaseAbsView.kt
View file @
c81d9d2a
package
com.
test.mydemo3.base
import
android.content.Context
import
android.util.AttributeSet
import
android.view.View
import
androidx.activity.ComponentActivity
abstract
class
BaseAbsView
:
ComponentActivity
(),
View
.
OnClickListener
{
override
fun
onCreateView
(
name
:
String
,
context
:
Context
,
attrs
:
AttributeSet
):
View
?
{
return
super
.
onCreateView
(
name
,
context
,
attrs
)
}
abstract
fun
initView
()
package
com.
xm.test.myfilemaster.base
import
android.content.Context
import
android.util.AttributeSet
import
android.view.View
import
androidx.activity.ComponentActivity
abstract
class
BaseAbsView
:
ComponentActivity
(),
View
.
OnClickListener
{
override
fun
onCreateView
(
name
:
String
,
context
:
Context
,
attrs
:
AttributeSet
):
View
?
{
return
super
.
onCreateView
(
name
,
context
,
attrs
)
}
abstract
fun
initView
()
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/base/BaseActivity.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/base/BaseActivity.kt
View file @
c81d9d2a
package
com.test.mydemo3.base
import
android.content.Intent
import
android.net.Uri
import
android.os.Build
import
android.os.Bundle
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.view.View
import
android.widget.CheckBox
import
android.widget.ImageView
import
android.widget.LinearLayout
import
android.widget.ListView
import
android.widget.RelativeLayout
import
android.widget.TextView
import
android.widget.Toast
import
androidx.core.content.FileProvider
import
androidx.core.view.isVisible
import
androidx.lifecycle.Observer
import
androidx.lifecycle.ViewModelProvider
import
com.test.mydemo3.R
import
com.test.mydemo3.activity.BaseActivityViewModel
import
com.test.mydemo3.activity.HomeActivity
import
com.test.mydemo3.activity.MoveOrCopyActivity
import
com.test.mydemo3.adapter.FilesItemViewAdapter
import
com.test.mydemo3.fragment.InternalStorageFragment
import
com.test.mydemo3.model.FileBean
import
com.test.mydemo3.util.FileUtil
import
com.test.mydemo3.util.PermissionUtil
import
com.test.mydemo3.view.CustomDialog
import
java.io.File
abstract
class
BaseActivity
:
BaseAbsView
(),
BaseActivityListener
{
lateinit
var
mTitleText
:
TextView
lateinit
var
mShareBtn
:
ImageView
lateinit
var
mDeleteBtn
:
ImageView
lateinit
var
mNewBtn
:
ImageView
lateinit
var
mCancelBtn
:
ImageView
lateinit
var
mQuitBtn
:
ImageView
lateinit
var
mEditBtn
:
ImageView
lateinit
var
mBottomBar
:
View
lateinit
var
mSelectNumText
:
TextView
lateinit
var
mCheckItemSelectAllBtn
:
CheckBox
lateinit
var
mMoveBottomBtn
:
LinearLayout
lateinit
var
mRenameBottomBtn
:
LinearLayout
lateinit
var
mCopyBottomBtn
:
LinearLayout
lateinit
var
mDeleteBottomBtn
:
LinearLayout
lateinit
var
mCancelBottomBtn
:
LinearLayout
lateinit
var
mSwitchSelectView
:
RelativeLayout
lateinit
var
mNotFileFoundLayout
:
View
lateinit
var
mNotPermissionLayout
:
View
private
lateinit
var
mFilesItemListView
:
ListView
// lateinit var mBinding: Binding
lateinit
var
mBaseViewModel
:
BaseActivityViewModel
var
mIsMove
=
true
//true is move, false is copy,
lateinit
var
mFileAdapter
:
FilesItemViewAdapter
lateinit
var
mItemCheckedArray
:
SparseBooleanArray
var
mFileCheckedItemList
=
ArrayList
<
FileBean
>()
lateinit
var
mItemDataList
:
ArrayList
<
FileBean
>
var
mFilesItemLists
=
ArrayList
<
ArrayList
<
FileBean
>>()
var
mCurrentFilePath
:
String
=
FileUtil
.
EXTERNAL_STORAGE
var
mCurrentFileBean
:
FileBean
?
=
null
var
mTitleStr
:
String
=
""
var
mCurrentList
:
ArrayList
<
FileBean
>
=
ArrayList
()
lateinit
var
mCurrantFilePathTv
:
TextView
companion
object
{
var
isClickEditBtn
=
false
var
isClickCheckBoxAllBtn
=
false
var
switchNumber
=
0
}
abstract
fun
getLayout
():
Int
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
initView
()
isQuitShow
(
true
)
isNewShow
(
true
)
isEditShow
(
true
)
}
override
fun
initView
()
{
setContentView
(
getLayout
())
mBaseViewModel
=
ViewModelProvider
(
this
)[
BaseActivityViewModel
::
class
.
java
]
mTitleText
=
findViewById
(
R
.
id
.
title_bar_text
)
mShareBtn
=
findViewById
(
R
.
id
.
btn_share
)
mDeleteBtn
=
findViewById
(
R
.
id
.
btn_delete
)
mNewBtn
=
findViewById
(
R
.
id
.
btn_new
)
mCancelBtn
=
findViewById
(
R
.
id
.
btn_cancel
)
mQuitBtn
=
findViewById
(
R
.
id
.
btn_quit
)
mEditBtn
=
findViewById
(
R
.
id
.
btn_edit
)
mBottomBar
=
findViewById
(
R
.
id
.
bottom_btn_group
)
mSwitchSelectView
=
findViewById
(
R
.
id
.
switch_and_select_layout
)
mSelectNumText
=
findViewById
(
R
.
id
.
select_num
)
mCheckItemSelectAllBtn
=
findViewById
(
R
.
id
.
checkbox_item_all
)
mNotFileFoundLayout
=
findViewById
(
R
.
id
.
not_file_found_layout
)
mNotPermissionLayout
=
findViewById
(
R
.
id
.
not_file_permission_layout
)
mCurrantFilePathTv
=
findViewById
(
R
.
id
.
current_file_path
)
mMoveBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_move_bottom
)
mRenameBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_rename_bottom
)
mCopyBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_copy_bottom
)
mDeleteBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_delete_bottom
)
mCancelBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_cancel_bottom
)
mTitleText
.
setOnClickListener
(
this
)
mShareBtn
.
setOnClickListener
(
this
)
mDeleteBtn
.
setOnClickListener
(
this
)
mNewBtn
.
setOnClickListener
(
this
)
mCancelBtn
.
setOnClickListener
(
this
)
mQuitBtn
.
setOnClickListener
(
this
)
mEditBtn
.
setOnClickListener
(
this
)
mCheckItemSelectAllBtn
.
setOnClickListener
(
this
)
mMoveBottomBtn
.
setOnClickListener
(
this
)
mRenameBottomBtn
.
setOnClickListener
(
this
)
mCopyBottomBtn
.
setOnClickListener
(
this
)
mDeleteBottomBtn
.
setOnClickListener
(
this
)
mCancelBottomBtn
.
setOnClickListener
(
this
)
findViewById
<
CheckBox
>(
R
.
id
.
checkbox_item_all
).
setOnClickListener
(
this
)
findViewById
<
TextView
>(
R
.
id
.
go_to_setting_btn
).
setOnClickListener
(
this
)
mBaseViewModel
.
setNumber
(
0
)
mBaseViewModel
.
myInt
.
observe
(
this
,
Observer
{
mSelectNumText
.
text
=
String
.
format
(
getString
(
R
.
string
.
select_0
,
switchNumber
.
toString
()))
})
}
override
fun
setTitle
(
str
:
String
)
{
mTitleStr
=
str
mTitleText
.
text
=
mTitleStr
}
override
fun
isDeleteShow
(
isShow
:
Boolean
)
{
mDeleteBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isShareShow
(
isShow
:
Boolean
)
{
mShareBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isNewShow
(
isShow
:
Boolean
)
{
mNewBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isCancelShow
(
isShow
:
Boolean
)
{
mCancelBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isQuitShow
(
isShow
:
Boolean
)
{
mQuitBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isEditShow
(
isShow
:
Boolean
)
{
mEditBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
fun
isCurrantTvShow
(
isShow
:
Boolean
){
mCurrantFilePathTv
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
onClick
(
v
:
View
?)
{
when
(
v
?.
id
){
R
.
id
.
btn_cancel
->{
cancel
()
}
R
.
id
.
btn_quit
->{
if
(
backQuit
())
finish
()
}
R
.
id
.
btn_new
->{
createNewDir
()
}
R
.
id
.
btn_edit
->{
mNewBtn
.
visibility
=
View
.
GONE
mQuitBtn
.
visibility
=
View
.
GONE
mEditBtn
.
visibility
=
View
.
GONE
mCancelBtn
.
visibility
=
View
.
VISIBLE
mShareBtn
.
visibility
=
View
.
VISIBLE
mBottomBar
.
visibility
=
View
.
VISIBLE
mSwitchSelectView
.
visibility
=
View
.
VISIBLE
isClickEditBtn
=
true
mFileAdapter
.
setEditClickState
(
isClickEditBtn
)
}
R
.
id
.
btn_delete
->{
//TODO 删除
}
R
.
id
.
btn_share
->{
if
(
switchNumber
>
1
){
var
uris
=
ArrayList
<
Uri
>()
for
(
fileBean
:
FileBean
in
mFileCheckedItemList
){
uris
.
add
(
FileProvider
.
getUriForFile
(
this
,
this
.
packageName
+
".provider"
,
File
(
fileBean
.
filePath
))
)
}
shareMultipleFiles
(
uris
)
}
else
if
(
switchNumber
==
1
){
val
uri
=
Uri
.
parse
(
mFileCheckedItemList
[
0
].
filePath
)
shareFile
(
uri
)
}
}
R
.
id
.
btn_move_bottom
->{
if
(
switchNumber
==
0
)
return
// mCancelBottomBtn.visibility = View.VISIBLE
// mQuitBtn.visibility = View.VISIBLE
// mCancelBtn.visibility = View.GONE
//// mDeleteBtn.visibility = View.GONE
// mShareBtn.visibility = View.GONE
// mCopyBottomBtn.visibility = View.GONE
// mRenameBottomBtn.visibility = View.GONE
// mDeleteBottomBtn.visibility = View.GONE
// mTitleText.text = "Move To.."
// if (mFilesItemLists.size>0){
// intent.putExtra("fileBeans",mFilesItemLists[0])
// }else{
// intent.putExtra("fileBeans",mItemDataList)
// }
// intent.putExtra("filePath", mFileCheckedItemList[0].filePath)
var
intent
=
Intent
(
this
,
MoveOrCopyActivity
::
class
.
java
)
intent
.
putExtra
(
"checkedItemBeans"
,
mFileCheckedItemList
)
intent
.
putExtra
(
"operate"
,
"move"
)
startActivity
(
intent
)
}
R
.
id
.
btn_rename_bottom
->{
rename
()
}
R
.
id
.
btn_copy_bottom
->{
if
(
switchNumber
==
0
)
return
// mCancelBottomBtn.visibility = View.VISIBLE
// mQuitBtn.visibility = View.VISIBLE
// mCancelBtn.visibility = View.GONE
// mDeleteBtn.visibility = View.GONE
// mShareBtn.visibility = View.GONE
// mMoveBottomBtn.visibility = View.GONE
// mRenameBottomBtn.visibility = View.GONE
// mDeleteBottomBtn.visibility = View.GONE
// mTitleText.text = "Copy To.."
var
intent
=
Intent
(
this
,
MoveOrCopyActivity
::
class
.
java
)
intent
.
putExtra
(
"checkedItemBeans"
,
mFileCheckedItemList
)
intent
.
putExtra
(
"operate"
,
"copy"
)
startActivity
(
intent
)
}
R
.
id
.
btn_delete_bottom
->{
val
files
=
ArrayList
<
String
>()
for
(
fileBean
:
FileBean
in
mFileCheckedItemList
){
files
.
add
(
fileBean
.
filePath
)
}
if
(
FileUtil
.
deleteFiles
(
files
)){
Toast
.
makeText
(
this
,
"delete success!"
,
Toast
.
LENGTH_LONG
).
show
()
}
else
{
Toast
.
makeText
(
this
,
"delete failed!"
,
Toast
.
LENGTH_LONG
).
show
()
}
}
R
.
id
.
btn_cancel_bottom
->{
mTitleText
.
text
=
mTitleStr
mCancelBottomBtn
.
visibility
=
View
.
GONE
mQuitBtn
.
visibility
=
View
.
GONE
mCancelBtn
.
visibility
=
View
.
VISIBLE
// mDeleteBtn.visibility = View.VISIBLE
mShareBtn
.
visibility
=
View
.
VISIBLE
mCopyBottomBtn
.
visibility
=
View
.
VISIBLE
mMoveBottomBtn
.
visibility
=
View
.
VISIBLE
mRenameBottomBtn
.
visibility
=
View
.
VISIBLE
mDeleteBottomBtn
.
visibility
=
View
.
VISIBLE
}
R
.
id
.
checkbox_item_all
->{
isClickCheckBoxAllBtn
=
!
isClickCheckBoxAllBtn
mCheckItemSelectAllBtn
.
isChecked
=
isClickCheckBoxAllBtn
selectAll
()
}
R
.
id
.
go_to_setting_btn
->{
PermissionUtil
.
requestPermission
(
this
)
// Toast.makeText(this, "你好", Toast.LENGTH_LONG).show()
// Intent().apply { action = Intent.ACTION_APPLICATION_DETAILS_SETTINGS }
}
}
}
private
fun
rename
()
{
if
(
switchNumber
==
0
||
switchNumber
>
1
)
return
val
customDialog
=
CustomDialog
(
this
)
customDialog
.
setsConfirm
(
View
.
OnClickListener
{
val
name
=
customDialog
.
getEditTextStr
()
Log
.
e
(
"yanglin "
,
"onClick: rename = $name checkedPath =${mFileCheckedItemList[0].filePath}"
,
)
val
renameFile
=
FileUtil
.
renameFile
(
mFileCheckedItemList
[
0
].
filePath
,
name
+
".${mFileCheckedItemList[0].fileType}"
)
if
(
renameFile
)
{
Toast
.
makeText
(
this
,
"new fileName success!"
,
Toast
.
LENGTH_LONG
).
show
()
for
(
fileBean
:
FileBean
in
mItemDataList
)
{
if
(
fileBean
.
fileName
.
contains
(
mFileCheckedItemList
[
0
].
fileName
)
&&
fileBean
.
filePath
.
contains
(
mFileCheckedItemList
[
0
].
filePath
)
)
{
fileBean
.
fileName
=
name
+
".${mFileCheckedItemList[0].fileType}"
}
}
}
else
{
Toast
.
makeText
(
this
,
"new fileName failed!"
,
Toast
.
LENGTH_LONG
).
show
()
}
customDialog
.
dismiss
()
}).
setsCancel
(
View
.
OnClickListener
{
customDialog
.
dismiss
()
}).
show
()
customDialog
.
setsTitle
(
"Rename"
)
customDialog
.
setsHint
(
"Please enter a new name"
)
}
private
fun
createNewDir
()
{
val
customDialog
=
CustomDialog
(
this
)
customDialog
.
setsCancel
(
View
.
OnClickListener
{
customDialog
.
dismiss
()
}).
setsConfirm
(
View
.
OnClickListener
{
val
editTextStr
=
customDialog
.
getEditTextStr
()
mItemDataList
for
(
fileBean
:
FileBean
in
mItemDataList
)
{
if
(
editTextStr
.
equals
(
fileBean
.
fileName
))
{
Toast
.
makeText
(
this
,
"Existing file"
,
Toast
.
LENGTH_SHORT
).
show
()
customDialog
.
dismiss
()
return
@OnClickListener
}
}
val
filesItemBean
=
FileUtil
.
createDirectory
(
mCurrentFilePath
,
editTextStr
)
if
(
filesItemBean
.
filePath
.
equals
(
"-1"
))
{
Toast
.
makeText
(
this
,
"Create failed"
,
Toast
.
LENGTH_SHORT
).
show
()
customDialog
.
dismiss
()
}
else
{
if
(
filesItemBean
.
childList
.
size
==
0
){
mFilesItemListView
.
visibility
=
View
.
VISIBLE
mNotFileFoundLayout
.
visibility
=
View
.
GONE
mItemDataList
.
clear
()
}
mItemDataList
.
add
(
filesItemBean
)
mFileAdapter
.
setData
(
mItemDataList
)
mFileAdapter
.
notifyDataSetChanged
()
customDialog
.
dismiss
()
}
}).
show
()
}
fun
setStateCheckedMap
(
isChecked
:
Boolean
){
for
(
i
in
mItemDataList
.
indices
){
mItemCheckedArray
.
put
(
i
,
isChecked
)
mFilesItemListView
.
setItemChecked
(
i
,
isChecked
)
}
}
fun
setOnListViewItemClickListener
(
lv
:
ListView
){
lv
.
setOnItemClickListener
{
parent
,
view
,
position
,
id
->
Log
.
e
(
"TAG"
,
"setOnListViewItemClickListener: 第$position"
)
if
(!
isClickEditBtn
){
mCurrentFileBean
=
mItemDataList
[
position
]
if
(!
mCurrentFileBean
?.
fileType
.
equals
(
"dir"
)){
return
@setOnItemClickListener
}
mFilesItemLists
.
add
(
mItemDataList
)
mCurrantFilePathTv
.
text
=
"Internal Storage/ ${mCurrentFileBean?.fileName}"
mCurrentList
.
add
(
mCurrentFileBean
!!
)
if
(
mCurrentFileBean
?.
fileType
.
equals
(
"dir"
)
&&
mCurrentFileBean
?.
childList
?.
size
!!
>
0
){
Thread
(
Runnable
{
runOnUiThread
{
mItemDataList
=
mCurrentFileBean
!!
.
childList
val
fileListSort
=
FileUtil
.
fileListSort
(
mItemDataList
)
mFileAdapter
.
setData
(
fileListSort
)
}
}).
start
()
}
else
if
(
mCurrentFileBean
?.
fileType
.
equals
(
"dir"
)
&&
mCurrentFileBean
?.
childList
?.
size
==
0
){
mFilesItemListView
.
visibility
=
View
.
GONE
mNotFileFoundLayout
.
visibility
=
View
.
VISIBLE
}
}
else
{
updateCheckBoxStatus
(
view
,
position
)
}
}
}
fun
setAdapter
(
lv
:
ListView
,
itemList
:
ArrayList
<
FileBean
>){
mFilesItemListView
=
lv
mItemDataList
=
itemList
mItemCheckedArray
=
SparseBooleanArray
()
mFileAdapter
=
FilesItemViewAdapter
(
itemList
,
this
,
mItemCheckedArray
)
mFilesItemListView
.
adapter
=
mFileAdapter
setOnListViewItemClickListener
(
mFilesItemListView
)
mNotPermissionLayout
.
visibility
=
View
.
GONE
if
(
HomeActivity
.
isPermission
){
if
(
itemList
.
size
>
0
){
mNotFileFoundLayout
.
visibility
=
View
.
GONE
mFilesItemListView
.
visibility
=
View
.
VISIBLE
isEditShow
(
true
)
}
else
{
mFilesItemListView
.
visibility
=
View
.
GONE
mNotFileFoundLayout
.
visibility
=
View
.
VISIBLE
isEditShow
(
false
)
}
}
else
{
mNotPermissionLayout
.
visibility
=
View
.
VISIBLE
mFilesItemListView
.
visibility
=
View
.
GONE
// mNotFileFoundLayout.visibility = View.GONE
isEditShow
(
false
)
}
}
fun
updateCheckBoxStatus
(
view
:
View
,
position
:
Int
){
val
viewHolder
=
view
.
tag
as
FilesItemViewAdapter
.
ViewHolder
viewHolder
.
selectSwitch
.
toggle
()
mFilesItemListView
.
setItemChecked
(
position
,
viewHolder
.
selectSwitch
.
isChecked
)
mItemCheckedArray
.
put
(
position
,
viewHolder
.
selectSwitch
.
isChecked
)
if
(
viewHolder
.
selectSwitch
.
isChecked
){
mFileCheckedItemList
.
add
(
mItemDataList
[
position
])
}
else
{
mFileCheckedItemList
.
remove
(
mItemDataList
[
position
])
}
mFileAdapter
.
notifyDataSetChanged
()
switchNumber
=
mFileCheckedItemList
.
size
mBaseViewModel
.
setNumber
(
switchNumber
)
}
fun
selectAll
(){
mFileCheckedItemList
.
clear
()
switchNumber
=
if
(
isClickCheckBoxAllBtn
){
setStateCheckedMap
(
true
)
mFileCheckedItemList
.
addAll
(
mItemDataList
)
mFileCheckedItemList
.
size
}
else
{
setStateCheckedMap
(
false
)
0
}
mFileAdapter
.
notifyDataSetChanged
()
mBaseViewModel
.
setNumber
(
switchNumber
)
// mSelectNumText.text = String.format(getString(R.string.select_0, mSelectNum.toString()))
}
fun
cancel
(){
setStateCheckedMap
(
false
)
mNewBtn
.
visibility
=
View
.
VISIBLE
mQuitBtn
.
visibility
=
View
.
VISIBLE
mEditBtn
.
visibility
=
View
.
VISIBLE
mCancelBtn
.
visibility
=
View
.
GONE
mDeleteBtn
.
visibility
=
View
.
GONE
mShareBtn
.
visibility
=
View
.
GONE
mBottomBar
.
visibility
=
View
.
GONE
mSwitchSelectView
.
visibility
=
View
.
GONE
isClickEditBtn
=
false
mFileAdapter
.
setEditClickState
(
isClickEditBtn
)
switchNumber
=
0
if
(
mFileAdapter
!=
null
){
mFileAdapter
.
notifyDataSetChanged
()
}
}
override
fun
onBackPressed
()
{
if
(
isClickEditBtn
){
cancel
()
}
else
{
if
(
backQuit
())
super
.
onBackPressed
()
}
}
fun
backQuit
():
Boolean
{
val
size
=
mFilesItemLists
.
size
if
(
size
-
1
==
0
){
mCurrantFilePathTv
.
text
=
"Internal Storage/"
}
if
(
size
<
1
){
if
(
mNotFileFoundLayout
.
isVisible
&&
mItemDataList
.
size
>
0
){
mFilesItemListView
.
visibility
=
View
.
VISIBLE
mNotFileFoundLayout
.
visibility
=
View
.
GONE
mFileAdapter
.
setData
(
mItemDataList
)
return
false
}
return
true
}
else
{
mFileAdapter
.
setData
(
mFilesItemLists
[
size
-
1
])
mItemDataList
=
mFilesItemLists
[
size
-
1
]
mFilesItemListView
.
visibility
=
View
.
VISIBLE
mNotFileFoundLayout
.
visibility
=
View
.
GONE
mFilesItemLists
.
remove
(
mFilesItemLists
[
size
-
1
])
mCurrentList
.
remove
(
mCurrentList
[
size
-
1
])
if
(
size
-
1
>
0
){
mCurrentFileBean
=
mCurrentList
[
size
-
2
]
mCurrantFilePathTv
.
text
=
"Internal Storage/ ${mCurrentFileBean?.fileName}"
}
else
{
mCurrantFilePathTv
.
text
=
"Internal Storage/"
}
return
false
}
}
private
fun
shareFile
(
uri
:
Uri
)
{
val
intent
=
Intent
(
Intent
.
ACTION_SEND
)
intent
.
type
=
"text/plain"
intent
.
putExtra
(
Intent
.
EXTRA_STREAM
,
uri
)
startActivity
(
Intent
.
createChooser
(
intent
,
"Share File"
))
}
private
fun
shareMultipleFiles
(
uris
:
ArrayList
<
Uri
>)
{
val
intent
=
Intent
(
Intent
.
ACTION_SEND_MULTIPLE
)
intent
.
type
=
"*/*"
intent
.
putParcelableArrayListExtra
(
Intent
.
EXTRA_STREAM
,
uris
)
startActivity
(
Intent
.
createChooser
(
intent
,
"Share Files"
))
}
fun
getCurrentFileBean
()
:
FileBean
?{
return
mCurrentFileBean
}
fun
setOnClickBtn
()
{
mEditBtn
.
setOnClickListener
{
mBottomBar
.
visibility
=
View
.
GONE
mEditBtn
.
visibility
=
View
.
GONE
mQuitBtn
.
visibility
=
View
.
GONE
findViewById
<
ImageView
>(
R
.
id
.
btn_share
).
visibility
=
View
.
GONE
findViewById
<
View
>(
R
.
id
.
switch_and_select_layout
).
visibility
=
View
.
VISIBLE
mDeleteBtn
.
visibility
=
View
.
VISIBLE
mCancelBtn
.
visibility
=
View
.
VISIBLE
BaseActivity
.
isClickEditBtn
=
true
isNewShow
(
false
)
mFileAdapter
.
setEditClickState
(
true
)
}
mCancelBtn
.
setOnClickListener
{
mEditBtn
.
visibility
=
View
.
VISIBLE
mQuitBtn
.
visibility
=
View
.
VISIBLE
mDeleteBtn
.
visibility
=
View
.
GONE
mCancelBtn
.
visibility
=
View
.
GONE
findViewById
<
View
>(
R
.
id
.
switch_and_select_layout
).
visibility
=
View
.
GONE
BaseActivity
.
isClickEditBtn
=
false
isNewShow
(
false
)
mFileAdapter
.
setEditClickState
(
false
)
}
// mDeleteBtn.setOnClickListener {
// super.onClick(mDeleteBtn)
// }
}
fun
setFileShow
(
isShow
:
Boolean
){
mFileAdapter
.
setFileShow
(
isShow
)
}
package
com.xm.test.myfilemaster.base
import
android.content.Intent
import
android.net.Uri
import
android.os.Bundle
import
android.util.Log
import
android.util.SparseBooleanArray
import
android.view.View
import
android.widget.CheckBox
import
android.widget.ImageView
import
android.widget.LinearLayout
import
android.widget.ListView
import
android.widget.RelativeLayout
import
android.widget.TextView
import
android.widget.Toast
import
androidx.core.content.FileProvider
import
androidx.core.view.isVisible
import
androidx.lifecycle.Observer
import
androidx.lifecycle.ViewModelProvider
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.activity.BaseActivityViewModel
import
com.xm.test.myfilemaster.activity.HomeActivity
import
com.xm.test.myfilemaster.activity.MoveOrCopyActivity
import
com.xm.test.myfilemaster.adapter.FilesItemViewAdapter
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.util.FileUtil
import
com.xm.test.myfilemaster.util.PermissionUtil
import
com.xm.test.myfilemaster.view.CustomDialog
import
java.io.File
abstract
class
BaseActivity
:
BaseAbsView
(),
BaseActivityListener
{
lateinit
var
mTitleText
:
TextView
lateinit
var
mShareBtn
:
ImageView
lateinit
var
mDeleteBtn
:
ImageView
lateinit
var
mNewBtn
:
ImageView
lateinit
var
mCancelBtn
:
ImageView
lateinit
var
mQuitBtn
:
ImageView
lateinit
var
mEditBtn
:
ImageView
lateinit
var
mBottomBar
:
View
lateinit
var
mSelectNumText
:
TextView
lateinit
var
mCheckItemSelectAllBtn
:
CheckBox
lateinit
var
mMoveBottomBtn
:
LinearLayout
lateinit
var
mRenameBottomBtn
:
LinearLayout
lateinit
var
mCopyBottomBtn
:
LinearLayout
lateinit
var
mDeleteBottomBtn
:
LinearLayout
lateinit
var
mCancelBottomBtn
:
LinearLayout
lateinit
var
mSwitchSelectView
:
RelativeLayout
lateinit
var
mNotFileFoundLayout
:
View
lateinit
var
mNotPermissionLayout
:
View
private
lateinit
var
mFilesItemListView
:
ListView
// lateinit var mBinding: Binding
lateinit
var
mBaseViewModel
:
BaseActivityViewModel
var
mIsMove
=
true
//true is move, false is copy,
lateinit
var
mFileAdapter
:
FilesItemViewAdapter
lateinit
var
mItemCheckedArray
:
SparseBooleanArray
var
mFileCheckedItemList
=
ArrayList
<
FileBean
>()
lateinit
var
mItemDataList
:
ArrayList
<
FileBean
>
var
mFilesItemLists
=
ArrayList
<
ArrayList
<
FileBean
>>()
var
mCurrentFilePath
:
String
=
FileUtil
.
EXTERNAL_STORAGE
var
mCurrentFileBean
:
FileBean
?
=
null
var
mTitleStr
:
String
=
""
var
mCurrentList
:
ArrayList
<
FileBean
>
=
ArrayList
()
lateinit
var
mCurrantFilePathTv
:
TextView
companion
object
{
var
isClickEditBtn
=
false
var
isClickCheckBoxAllBtn
=
false
var
switchNumber
=
0
}
abstract
fun
getLayout
():
Int
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
initView
()
isQuitShow
(
true
)
isNewShow
(
true
)
isEditShow
(
true
)
}
override
fun
initView
()
{
setContentView
(
getLayout
())
mBaseViewModel
=
ViewModelProvider
(
this
)[
BaseActivityViewModel
::
class
.
java
]
mTitleText
=
findViewById
(
R
.
id
.
title_bar_text
)
mShareBtn
=
findViewById
(
R
.
id
.
btn_share
)
mDeleteBtn
=
findViewById
(
R
.
id
.
btn_delete
)
mNewBtn
=
findViewById
(
R
.
id
.
btn_new
)
mCancelBtn
=
findViewById
(
R
.
id
.
btn_cancel
)
mQuitBtn
=
findViewById
(
R
.
id
.
btn_quit
)
mEditBtn
=
findViewById
(
R
.
id
.
btn_edit
)
mBottomBar
=
findViewById
(
R
.
id
.
bottom_btn_group
)
mSwitchSelectView
=
findViewById
(
R
.
id
.
switch_and_select_layout
)
mSelectNumText
=
findViewById
(
R
.
id
.
select_num
)
mCheckItemSelectAllBtn
=
findViewById
(
R
.
id
.
checkbox_item_all
)
mNotFileFoundLayout
=
findViewById
(
R
.
id
.
not_file_found_layout
)
mNotPermissionLayout
=
findViewById
(
R
.
id
.
not_file_permission_layout
)
mCurrantFilePathTv
=
findViewById
(
R
.
id
.
current_file_path
)
mMoveBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_move_bottom
)
mRenameBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_rename_bottom
)
mCopyBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_copy_bottom
)
mDeleteBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_delete_bottom
)
mCancelBottomBtn
=
mBottomBar
.
findViewById
(
R
.
id
.
btn_cancel_bottom
)
mTitleText
.
setOnClickListener
(
this
)
mShareBtn
.
setOnClickListener
(
this
)
mDeleteBtn
.
setOnClickListener
(
this
)
mNewBtn
.
setOnClickListener
(
this
)
mCancelBtn
.
setOnClickListener
(
this
)
mQuitBtn
.
setOnClickListener
(
this
)
mEditBtn
.
setOnClickListener
(
this
)
mCheckItemSelectAllBtn
.
setOnClickListener
(
this
)
mMoveBottomBtn
.
setOnClickListener
(
this
)
mRenameBottomBtn
.
setOnClickListener
(
this
)
mCopyBottomBtn
.
setOnClickListener
(
this
)
mDeleteBottomBtn
.
setOnClickListener
(
this
)
mCancelBottomBtn
.
setOnClickListener
(
this
)
findViewById
<
CheckBox
>(
R
.
id
.
checkbox_item_all
).
setOnClickListener
(
this
)
findViewById
<
TextView
>(
R
.
id
.
go_to_setting_btn
).
setOnClickListener
(
this
)
mBaseViewModel
.
setNumber
(
0
)
mBaseViewModel
.
myInt
.
observe
(
this
,
Observer
{
mSelectNumText
.
text
=
String
.
format
(
getString
(
R
.
string
.
select_0
,
switchNumber
.
toString
()))
})
}
override
fun
setTitle
(
str
:
String
)
{
mTitleStr
=
str
mTitleText
.
text
=
mTitleStr
}
override
fun
isDeleteShow
(
isShow
:
Boolean
)
{
mDeleteBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isShareShow
(
isShow
:
Boolean
)
{
mShareBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isNewShow
(
isShow
:
Boolean
)
{
mNewBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isCancelShow
(
isShow
:
Boolean
)
{
mCancelBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isQuitShow
(
isShow
:
Boolean
)
{
mQuitBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
isEditShow
(
isShow
:
Boolean
)
{
mEditBtn
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
fun
isCurrantTvShow
(
isShow
:
Boolean
){
mCurrantFilePathTv
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
}
override
fun
onClick
(
v
:
View
?)
{
when
(
v
?.
id
){
R
.
id
.
btn_cancel
->{
cancel
()
}
R
.
id
.
btn_quit
->{
if
(
backQuit
())
finish
()
}
R
.
id
.
btn_new
->{
createNewDir
()
}
R
.
id
.
btn_edit
->{
mNewBtn
.
visibility
=
View
.
GONE
mQuitBtn
.
visibility
=
View
.
GONE
mEditBtn
.
visibility
=
View
.
GONE
mCancelBtn
.
visibility
=
View
.
VISIBLE
mShareBtn
.
visibility
=
View
.
VISIBLE
mBottomBar
.
visibility
=
View
.
VISIBLE
mSwitchSelectView
.
visibility
=
View
.
VISIBLE
isClickEditBtn
=
true
mFileAdapter
.
setEditClickState
(
isClickEditBtn
)
}
R
.
id
.
btn_delete
->{
//TODO 删除
}
R
.
id
.
btn_share
->{
if
(
switchNumber
>
1
){
var
uris
=
ArrayList
<
Uri
>()
for
(
fileBean
:
FileBean
in
mFileCheckedItemList
){
uris
.
add
(
FileProvider
.
getUriForFile
(
this
,
this
.
packageName
+
".provider"
,
File
(
fileBean
.
filePath
))
)
}
shareMultipleFiles
(
uris
)
}
else
if
(
switchNumber
==
1
){
val
uri
=
Uri
.
parse
(
mFileCheckedItemList
[
0
].
filePath
)
shareFile
(
uri
)
}
}
R
.
id
.
btn_move_bottom
->{
if
(
switchNumber
==
0
)
return
// mCancelBottomBtn.visibility = View.VISIBLE
// mQuitBtn.visibility = View.VISIBLE
// mCancelBtn.visibility = View.GONE
//// mDeleteBtn.visibility = View.GONE
// mShareBtn.visibility = View.GONE
// mCopyBottomBtn.visibility = View.GONE
// mRenameBottomBtn.visibility = View.GONE
// mDeleteBottomBtn.visibility = View.GONE
// mTitleText.text = "Move To.."
// if (mFilesItemLists.size>0){
// intent.putExtra("fileBeans",mFilesItemLists[0])
// }else{
// intent.putExtra("fileBeans",mItemDataList)
// }
// intent.putExtra("filePath", mFileCheckedItemList[0].filePath)
var
intent
=
Intent
(
this
,
MoveOrCopyActivity
::
class
.
java
)
intent
.
putExtra
(
"checkedItemBeans"
,
mFileCheckedItemList
)
intent
.
putExtra
(
"operate"
,
"move"
)
startActivity
(
intent
)
}
R
.
id
.
btn_rename_bottom
->{
rename
()
}
R
.
id
.
btn_copy_bottom
->{
if
(
switchNumber
==
0
)
return
// mCancelBottomBtn.visibility = View.VISIBLE
// mQuitBtn.visibility = View.VISIBLE
// mCancelBtn.visibility = View.GONE
// mDeleteBtn.visibility = View.GONE
// mShareBtn.visibility = View.GONE
// mMoveBottomBtn.visibility = View.GONE
// mRenameBottomBtn.visibility = View.GONE
// mDeleteBottomBtn.visibility = View.GONE
// mTitleText.text = "Copy To.."
var
intent
=
Intent
(
this
,
MoveOrCopyActivity
::
class
.
java
)
intent
.
putExtra
(
"checkedItemBeans"
,
mFileCheckedItemList
)
intent
.
putExtra
(
"operate"
,
"copy"
)
startActivity
(
intent
)
}
R
.
id
.
btn_delete_bottom
->{
val
files
=
ArrayList
<
String
>()
for
(
fileBean
:
FileBean
in
mFileCheckedItemList
){
files
.
add
(
fileBean
.
filePath
)
}
if
(
FileUtil
.
deleteFiles
(
files
)){
Toast
.
makeText
(
this
,
"delete success!"
,
Toast
.
LENGTH_LONG
).
show
()
}
else
{
Toast
.
makeText
(
this
,
"delete failed!"
,
Toast
.
LENGTH_LONG
).
show
()
}
}
R
.
id
.
btn_cancel_bottom
->{
mTitleText
.
text
=
mTitleStr
mCancelBottomBtn
.
visibility
=
View
.
GONE
mQuitBtn
.
visibility
=
View
.
GONE
mCancelBtn
.
visibility
=
View
.
VISIBLE
// mDeleteBtn.visibility = View.VISIBLE
mShareBtn
.
visibility
=
View
.
VISIBLE
mCopyBottomBtn
.
visibility
=
View
.
VISIBLE
mMoveBottomBtn
.
visibility
=
View
.
VISIBLE
mRenameBottomBtn
.
visibility
=
View
.
VISIBLE
mDeleteBottomBtn
.
visibility
=
View
.
VISIBLE
}
R
.
id
.
checkbox_item_all
->{
isClickCheckBoxAllBtn
=
!
isClickCheckBoxAllBtn
mCheckItemSelectAllBtn
.
isChecked
=
isClickCheckBoxAllBtn
selectAll
()
}
R
.
id
.
go_to_setting_btn
->{
PermissionUtil
.
requestPermission
(
this
)
// Toast.makeText(this, "你好", Toast.LENGTH_LONG).show()
// Intent().apply { action = Intent.ACTION_APPLICATION_DETAILS_SETTINGS }
}
}
}
private
fun
rename
()
{
if
(
switchNumber
==
0
||
switchNumber
>
1
)
return
val
customDialog
=
CustomDialog
(
this
)
customDialog
.
setsConfirm
(
View
.
OnClickListener
{
val
name
=
customDialog
.
getEditTextStr
()
Log
.
e
(
"yanglin "
,
"onClick: rename = $name checkedPath =${mFileCheckedItemList[0].filePath}"
,
)
val
renameFile
=
FileUtil
.
renameFile
(
mFileCheckedItemList
[
0
].
filePath
,
name
+
".${mFileCheckedItemList[0].fileType}"
)
if
(
renameFile
)
{
Toast
.
makeText
(
this
,
"new fileName success!"
,
Toast
.
LENGTH_LONG
).
show
()
for
(
fileBean
:
FileBean
in
mItemDataList
)
{
if
(
fileBean
.
fileName
.
contains
(
mFileCheckedItemList
[
0
].
fileName
)
&&
fileBean
.
filePath
.
contains
(
mFileCheckedItemList
[
0
].
filePath
)
)
{
fileBean
.
fileName
=
name
+
".${mFileCheckedItemList[0].fileType}"
}
}
}
else
{
Toast
.
makeText
(
this
,
"new fileName failed!"
,
Toast
.
LENGTH_LONG
).
show
()
}
customDialog
.
dismiss
()
}).
setsCancel
(
View
.
OnClickListener
{
customDialog
.
dismiss
()
}).
show
()
customDialog
.
setsTitle
(
"Rename"
)
customDialog
.
setsHint
(
"Please enter a new name"
)
}
private
fun
createNewDir
()
{
val
customDialog
=
CustomDialog
(
this
)
customDialog
.
setsCancel
(
View
.
OnClickListener
{
customDialog
.
dismiss
()
}).
setsConfirm
(
View
.
OnClickListener
{
val
editTextStr
=
customDialog
.
getEditTextStr
()
mItemDataList
for
(
fileBean
:
FileBean
in
mItemDataList
)
{
if
(
editTextStr
.
equals
(
fileBean
.
fileName
))
{
Toast
.
makeText
(
this
,
"Existing file"
,
Toast
.
LENGTH_SHORT
).
show
()
customDialog
.
dismiss
()
return
@OnClickListener
}
}
val
filesItemBean
=
FileUtil
.
createDirectory
(
mCurrentFilePath
,
editTextStr
)
if
(
filesItemBean
.
filePath
.
equals
(
"-1"
))
{
Toast
.
makeText
(
this
,
"Create failed"
,
Toast
.
LENGTH_SHORT
).
show
()
customDialog
.
dismiss
()
}
else
{
if
(
filesItemBean
.
childList
.
size
==
0
){
mFilesItemListView
.
visibility
=
View
.
VISIBLE
mNotFileFoundLayout
.
visibility
=
View
.
GONE
mItemDataList
.
clear
()
}
mItemDataList
.
add
(
filesItemBean
)
mFileAdapter
.
setData
(
mItemDataList
)
mFileAdapter
.
notifyDataSetChanged
()
customDialog
.
dismiss
()
}
}).
show
()
}
fun
setStateCheckedMap
(
isChecked
:
Boolean
){
for
(
i
in
mItemDataList
.
indices
){
mItemCheckedArray
.
put
(
i
,
isChecked
)
mFilesItemListView
.
setItemChecked
(
i
,
isChecked
)
}
}
fun
setOnListViewItemClickListener
(
lv
:
ListView
){
lv
.
setOnItemClickListener
{
parent
,
view
,
position
,
id
->
Log
.
e
(
"TAG"
,
"setOnListViewItemClickListener: 第$position"
)
if
(!
isClickEditBtn
){
mCurrentFileBean
=
mItemDataList
[
position
]
if
(!
mCurrentFileBean
?.
fileType
.
equals
(
"dir"
)){
return
@setOnItemClickListener
}
mFilesItemLists
.
add
(
mItemDataList
)
mCurrantFilePathTv
.
text
=
"Internal Storage/ ${mCurrentFileBean?.fileName}"
mCurrentList
.
add
(
mCurrentFileBean
!!
)
if
(
mCurrentFileBean
?.
fileType
.
equals
(
"dir"
)
&&
mCurrentFileBean
?.
childList
?.
size
!!
>
0
){
Thread
(
Runnable
{
runOnUiThread
{
mItemDataList
=
mCurrentFileBean
!!
.
childList
val
fileListSort
=
FileUtil
.
fileListSort
(
mItemDataList
)
mFileAdapter
.
setData
(
fileListSort
)
}
}).
start
()
}
else
if
(
mCurrentFileBean
?.
fileType
.
equals
(
"dir"
)
&&
mCurrentFileBean
?.
childList
?.
size
==
0
){
mFilesItemListView
.
visibility
=
View
.
GONE
mNotFileFoundLayout
.
visibility
=
View
.
VISIBLE
}
}
else
{
updateCheckBoxStatus
(
view
,
position
)
}
}
}
fun
setAdapter
(
lv
:
ListView
,
itemList
:
ArrayList
<
FileBean
>){
mFilesItemListView
=
lv
mItemDataList
=
itemList
mItemCheckedArray
=
SparseBooleanArray
()
mFileAdapter
=
FilesItemViewAdapter
(
itemList
,
this
,
mItemCheckedArray
)
mFilesItemListView
.
adapter
=
mFileAdapter
setOnListViewItemClickListener
(
mFilesItemListView
)
mNotPermissionLayout
.
visibility
=
View
.
GONE
if
(
HomeActivity
.
isPermission
){
if
(
itemList
.
size
>
0
){
mNotFileFoundLayout
.
visibility
=
View
.
GONE
mFilesItemListView
.
visibility
=
View
.
VISIBLE
isEditShow
(
true
)
}
else
{
mFilesItemListView
.
visibility
=
View
.
GONE
mNotFileFoundLayout
.
visibility
=
View
.
VISIBLE
isEditShow
(
false
)
}
}
else
{
mNotPermissionLayout
.
visibility
=
View
.
VISIBLE
mFilesItemListView
.
visibility
=
View
.
GONE
// mNotFileFoundLayout.visibility = View.GONE
isEditShow
(
false
)
}
}
fun
updateCheckBoxStatus
(
view
:
View
,
position
:
Int
){
val
viewHolder
=
view
.
tag
as
FilesItemViewAdapter
.
ViewHolder
viewHolder
.
selectSwitch
.
toggle
()
mFilesItemListView
.
setItemChecked
(
position
,
viewHolder
.
selectSwitch
.
isChecked
)
mItemCheckedArray
.
put
(
position
,
viewHolder
.
selectSwitch
.
isChecked
)
if
(
viewHolder
.
selectSwitch
.
isChecked
){
mFileCheckedItemList
.
add
(
mItemDataList
[
position
])
}
else
{
mFileCheckedItemList
.
remove
(
mItemDataList
[
position
])
}
mFileAdapter
.
notifyDataSetChanged
()
switchNumber
=
mFileCheckedItemList
.
size
mBaseViewModel
.
setNumber
(
switchNumber
)
}
fun
selectAll
(){
mFileCheckedItemList
.
clear
()
switchNumber
=
if
(
isClickCheckBoxAllBtn
){
setStateCheckedMap
(
true
)
mFileCheckedItemList
.
addAll
(
mItemDataList
)
mFileCheckedItemList
.
size
}
else
{
setStateCheckedMap
(
false
)
0
}
mFileAdapter
.
notifyDataSetChanged
()
mBaseViewModel
.
setNumber
(
switchNumber
)
// mSelectNumText.text = String.format(getString(R.string.select_0, mSelectNum.toString()))
}
fun
cancel
(){
setStateCheckedMap
(
false
)
mNewBtn
.
visibility
=
View
.
VISIBLE
mQuitBtn
.
visibility
=
View
.
VISIBLE
mEditBtn
.
visibility
=
View
.
VISIBLE
mCancelBtn
.
visibility
=
View
.
GONE
mDeleteBtn
.
visibility
=
View
.
GONE
mShareBtn
.
visibility
=
View
.
GONE
mBottomBar
.
visibility
=
View
.
GONE
mSwitchSelectView
.
visibility
=
View
.
GONE
isClickEditBtn
=
false
mFileAdapter
.
setEditClickState
(
isClickEditBtn
)
switchNumber
=
0
if
(
mFileAdapter
!=
null
){
mFileAdapter
.
notifyDataSetChanged
()
}
}
override
fun
onBackPressed
()
{
if
(
isClickEditBtn
){
cancel
()
}
else
{
if
(
backQuit
())
super
.
onBackPressed
()
}
}
fun
backQuit
():
Boolean
{
val
size
=
mFilesItemLists
.
size
if
(
size
-
1
==
0
){
mCurrantFilePathTv
.
text
=
"Internal Storage/"
}
if
(
size
<
1
){
if
(
mNotFileFoundLayout
.
isVisible
&&
mItemDataList
.
size
>
0
){
mFilesItemListView
.
visibility
=
View
.
VISIBLE
mNotFileFoundLayout
.
visibility
=
View
.
GONE
mFileAdapter
.
setData
(
mItemDataList
)
return
false
}
return
true
}
else
{
mFileAdapter
.
setData
(
mFilesItemLists
[
size
-
1
])
mItemDataList
=
mFilesItemLists
[
size
-
1
]
mFilesItemListView
.
visibility
=
View
.
VISIBLE
mNotFileFoundLayout
.
visibility
=
View
.
GONE
mFilesItemLists
.
remove
(
mFilesItemLists
[
size
-
1
])
mCurrentList
.
remove
(
mCurrentList
[
size
-
1
])
if
(
size
-
1
>
0
){
mCurrentFileBean
=
mCurrentList
[
size
-
2
]
mCurrantFilePathTv
.
text
=
"Internal Storage/ ${mCurrentFileBean?.fileName}"
}
else
{
mCurrantFilePathTv
.
text
=
"Internal Storage/"
}
return
false
}
}
private
fun
shareFile
(
uri
:
Uri
)
{
val
intent
=
Intent
(
Intent
.
ACTION_SEND
)
intent
.
type
=
"text/plain"
intent
.
putExtra
(
Intent
.
EXTRA_STREAM
,
uri
)
startActivity
(
Intent
.
createChooser
(
intent
,
"Share File"
))
}
private
fun
shareMultipleFiles
(
uris
:
ArrayList
<
Uri
>)
{
val
intent
=
Intent
(
Intent
.
ACTION_SEND_MULTIPLE
)
intent
.
type
=
"*/*"
intent
.
putParcelableArrayListExtra
(
Intent
.
EXTRA_STREAM
,
uris
)
startActivity
(
Intent
.
createChooser
(
intent
,
"Share Files"
))
}
fun
getCurrentFileBean
()
:
FileBean
?{
return
mCurrentFileBean
}
fun
setOnClickBtn
()
{
mEditBtn
.
setOnClickListener
{
mBottomBar
.
visibility
=
View
.
GONE
mEditBtn
.
visibility
=
View
.
GONE
mQuitBtn
.
visibility
=
View
.
GONE
findViewById
<
ImageView
>(
R
.
id
.
btn_share
).
visibility
=
View
.
GONE
findViewById
<
View
>(
R
.
id
.
switch_and_select_layout
).
visibility
=
View
.
VISIBLE
mDeleteBtn
.
visibility
=
View
.
VISIBLE
mCancelBtn
.
visibility
=
View
.
VISIBLE
BaseActivity
.
isClickEditBtn
=
true
isNewShow
(
false
)
mFileAdapter
.
setEditClickState
(
true
)
}
mCancelBtn
.
setOnClickListener
{
mEditBtn
.
visibility
=
View
.
VISIBLE
mQuitBtn
.
visibility
=
View
.
VISIBLE
mDeleteBtn
.
visibility
=
View
.
GONE
mCancelBtn
.
visibility
=
View
.
GONE
findViewById
<
View
>(
R
.
id
.
switch_and_select_layout
).
visibility
=
View
.
GONE
BaseActivity
.
isClickEditBtn
=
false
isNewShow
(
false
)
mFileAdapter
.
setEditClickState
(
false
)
}
// mDeleteBtn.setOnClickListener {
// super.onClick(mDeleteBtn)
// }
}
fun
setFileShow
(
isShow
:
Boolean
){
mFileAdapter
.
setFileShow
(
isShow
)
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/base/BaseActivityListener.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/base/BaseActivityListener.kt
View file @
c81d9d2a
package
com.
test.mydemo3.base
interface
BaseActivityListener
{
fun
setTitle
(
str
:
String
)
fun
isDeleteShow
(
isShow
:
Boolean
)
fun
isShareShow
(
isShow
:
Boolean
)
fun
isNewShow
(
isShow
:
Boolean
)
fun
isCancelShow
(
isShow
:
Boolean
)
fun
isQuitShow
(
isShow
:
Boolean
)
fun
isEditShow
(
isShow
:
Boolean
)
package
com.
xm.test.myfilemaster.base
interface
BaseActivityListener
{
fun
setTitle
(
str
:
String
)
fun
isDeleteShow
(
isShow
:
Boolean
)
fun
isShareShow
(
isShow
:
Boolean
)
fun
isNewShow
(
isShow
:
Boolean
)
fun
isCancelShow
(
isShow
:
Boolean
)
fun
isQuitShow
(
isShow
:
Boolean
)
fun
isEditShow
(
isShow
:
Boolean
)
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/fragment/FileManagerFragment.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/fragment/FileManagerFragment.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.fragment
package
com.
xm.test.myfilemaster
.fragment
import
android.content.Intent
import
androidx.fragment.app.viewModels
import
android.os.Bundle
import
android.util.SparseBooleanArray
import
androidx.fragment.app.Fragment
...
...
@@ -9,17 +8,14 @@ import android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.GridView
import
android.widget.LinearLayout
import
android.widget.RelativeLayout
import
com.test.mydemo3.R
import
com.test.mydemo3.activity.FileManagerActivity
import
com.test.mydemo3.activity.MediaActivity
import
com.test.mydemo3.adapter.MediaAdapter
import
com.test.mydemo3.model.FileBean
import
com.test.mydemo3.util.FileUtil
import
com.test.mydemo3.util.MediaUtil
import
com.test.mydemo3.util.PermissionUtil
import
com.test.mydemo3.view.CustomDialog
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.activity.FileManagerActivity
import
com.xm.test.myfilemaster.activity.MediaActivity
import
com.xm.test.myfilemaster.adapter.MediaAdapter
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.util.MediaUtil
import
com.xm.test.myfilemaster.util.PermissionUtil
import
com.xm.test.myfilemaster.view.CustomDialog
class
FileManagerFragment
:
Fragment
(),
View
.
OnClickListener
{
private
lateinit
var
mView
:
View
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/fragment/FileManagerViewModel.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/fragment/FileManagerViewModel.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.fragment
package
com.
xm.test.myfilemaster
.fragment
import
androidx.lifecycle.ViewModel
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/fragment/HomeFragment.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/fragment/HomeFragment.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.fragment
package
com.
xm.test.myfilemaster
.fragment
import
android.app.ActivityManager
import
android.content.Context
...
...
@@ -15,16 +15,15 @@ import android.view.ViewGroup
import
android.widget.LinearLayout
import
android.widget.ProgressBar
import
android.widget.TextView
import
com.test.mydemo3.R
import
com.test.mydemo3.activity.BatteryActivity
import
com.test.mydemo3.activity.CleanActivity
import
com.test.mydemo3.activity.SimilarImagesActivity
import
com.test.mydemo3.activity.ScanEmptyFilesActivity
import
com.test.mydemo3.activity.ScanLargeFilesActivity
import
com.test.mydemo3.antivirus.AntivirusActivity
import
com.test.mydemo3.util.PermissionUtil
import
com.test.mydemo3.view.CirclePgBar
import
com.test.mydemo3.view.CustomDialog
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.activity.BatteryActivity
import
com.xm.test.myfilemaster.activity.CleanActivity
import
com.xm.test.myfilemaster.activity.ScanEmptyFilesActivity
import
com.xm.test.myfilemaster.activity.ScanLargeFilesActivity
import
com.xm.test.myfilemaster.activity.SimilarImagesActivity
import
com.xm.test.myfilemaster.antivirus.AntivirusActivity
import
com.xm.test.myfilemaster.util.PermissionUtil
import
com.xm.test.myfilemaster.view.CustomDialog
class
HomeFragment
:
Fragment
(),
OnClickListener
{
private
lateinit
var
mView
:
View
...
...
@@ -37,7 +36,7 @@ class HomeFragment : Fragment(), OnClickListener{
private
lateinit
var
mMemoryUseText
:
TextView
private
lateinit
var
mMemoryUseProgress
:
ProgressBar
private
lateinit
var
mBatteryInfo
:
View
private
lateinit
var
mCirclePgBar
:
CirclePgBar
private
lateinit
var
mCirclePgBar
:
com
.
xm
.
test
.
myfilemaster
.
view
.
CirclePgBar
companion
object
{
fun
newInstance
()
=
HomeFragment
()
}
...
...
@@ -81,7 +80,7 @@ class HomeFragment : Fragment(), OnClickListener{
mScanEmptyFiles
.
setOnClickListener
(
this
)
mBatteryInfo
.
setOnClickListener
(
this
)
mView
.
findViewById
<
CirclePgBar
>(
R
.
id
.
progress_circular
).
setOnClickListener
(
this
)
mView
.
findViewById
<
com
.
xm
.
test
.
myfilemaster
.
view
.
CirclePgBar
>(
R
.
id
.
progress_circular
).
setOnClickListener
(
this
)
mView
.
findViewById
<
View
>(
R
.
id
.
home_clean_btn
).
setOnClickListener
(
this
)
mView
.
findViewById
<
View
>(
R
.
id
.
antivirus_btn
).
setOnClickListener
(
this
)
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/fragment/HomeViewModel.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/fragment/HomeViewModel.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.fragment
package
com.
xm.test.myfilemaster
.fragment
import
androidx.lifecycle.ViewModel
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/fragment/InternalStorageFragment.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/fragment/InternalStorageFragment.kt
View file @
c81d9d2a
package
com.
test.mydemo3
.fragment
package
com.
xm.test.myfilemaster
.fragment
import
android.content.Intent
import
android.net.Uri
...
...
@@ -22,18 +22,17 @@ import androidx.core.view.isVisible
import
androidx.lifecycle.Observer
import
androidx.lifecycle.ViewModelProvider
import
com.kongzue.dialogx.dialogs.WaitDialog
import
com.test.mydemo3.MyApplication
import
com.test.mydemo3.R
import
com.test.mydemo3.activity.BaseActivityViewModel
import
com.test.mydemo3.activity.HomeActivity
import
com.test.mydemo3.activity.InternalStorageActivity
import
com.test.mydemo3.activity.MoveOrCopyActivity
import
com.test.mydemo3.adapter.FilesItemViewAdapter
import
com.test.mydemo3.base.BaseActivity
import
com.test.mydemo3.model.FileBean
import
com.test.mydemo3.util.FileUtil
import
com.test.mydemo3.util.PermissionUtil
import
com.test.mydemo3.view.CustomDialog
import
com.xm.test.myfilemaster.MyApplication
import
com.xm.test.myfilemaster.R
import
com.xm.test.myfilemaster.activity.BaseActivityViewModel
import
com.xm.test.myfilemaster.activity.HomeActivity
import
com.xm.test.myfilemaster.activity.MoveOrCopyActivity
import
com.xm.test.myfilemaster.adapter.FilesItemViewAdapter
import
com.xm.test.myfilemaster.base.BaseActivity
import
com.xm.test.myfilemaster.model.FileBean
import
com.xm.test.myfilemaster.util.FileUtil
import
com.xm.test.myfilemaster.util.PermissionUtil
import
com.xm.test.myfilemaster.view.CustomDialog
import
java.io.File
class
InternalStorageFragment
:
Fragment
(),
View
.
OnClickListener
{
...
...
@@ -225,7 +224,7 @@ class InternalStorageFragment : Fragment(), View.OnClickListener {
mBaseViewModel
.
setNumber
(
switchNumber
)
}
R
.
id
.
btn_delete
->{
val
customDialog
=
com
.
test
.
mydemo3
.
view
.
CustomDialog
(
requireContext
())
val
customDialog
=
CustomDialog
(
requireContext
())
customDialog
.
setsCancel
(
View
.
OnClickListener
{
customDialog
.
dismiss
()
}).
setsConfirm
(
View
.
OnClickListener
{
...
...
MyDemo3/app/src/main/java/com/
test/mydemo3
/model/AdConfigData.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/model/AdConfigData.kt
View file @
c81d9d2a
package
com.
test.mydemo3.model
data class
GlobalConfig
(
val
cacheTime
:
Int
,
val
rateWindowInterval
:
Int
,
val
buyInsertInterval
:
Int
,
val
natureInsertInterval
:
Int
,
val
notDialogInterval
:
Int
)
data class
PushManagement
(
val
pushShow
:
Int
,
val
newUserAvoidTime
:
Int
,
val
allPushInterval
:
Int
,
val
oPushInterval
:
Int
,
val
pushCircleOrder
:
List
<
Int
>,
val
scenePush
:
List
<
Int
>
)
data class
AdsCfg
(
val
adOpen
:
AdInfo
,
val
adInsertBattery
:
AdInfo
)
data class
AdInfo
(
val
isShow
:
Boolean
,
val
showInterval
:
Int
,
val
newUserAvoidTime
:
Int
,
val
unitId
:
String
,
val
type
:
String
,
val
openAdIsShow
:
Int
,
val
loadingPageTime
:
Int
)
data class
PushCfg
(
val
batteryPush
:
PushInfo
,
val
batteryLowBoost
:
PushInfo
)
data class
PushInfo
(
val
pushStayTime
:
Int
,
val
lastUseInterval
:
Int
,
val
featureEx1
:
Int
,
val
pushInterval
:
Int
)
data class
Result
(
val
data
:
Data
)
data class
Data
(
val
globalConfig
:
GlobalConfig
,
val
pushManagement
:
PushManagement
,
val
adsCfg
:
AdsCfg
,
val
pushCfg
:
PushCfg
)
data class
AdConfigData
(
val
status
:
Int
,
val
msg
:
String
,
val
sign
:
String
,
val
result
:
Result
,
val
extras
:
Any
?,
val
enc
:
Any
?,
val
security
:
String
)
package
com.
xm.test.myfilemaster.model
data class
GlobalConfig
(
val
cacheTime
:
Int
,
val
rateWindowInterval
:
Int
,
val
buyInsertInterval
:
Int
,
val
natureInsertInterval
:
Int
,
val
notDialogInterval
:
Int
)
data class
PushManagement
(
val
pushShow
:
Int
,
val
newUserAvoidTime
:
Int
,
val
allPushInterval
:
Int
,
val
oPushInterval
:
Int
,
val
pushCircleOrder
:
List
<
Int
>,
val
scenePush
:
List
<
Int
>
)
data class
AdsCfg
(
val
adOpen
:
AdInfo
,
val
adInsertBattery
:
AdInfo
)
data class
AdInfo
(
val
isShow
:
Boolean
,
val
showInterval
:
Int
,
val
newUserAvoidTime
:
Int
,
val
unitId
:
String
,
val
type
:
String
,
val
openAdIsShow
:
Int
,
val
loadingPageTime
:
Int
)
data class
PushCfg
(
val
batteryPush
:
PushInfo
,
val
batteryLowBoost
:
PushInfo
)
data class
PushInfo
(
val
pushStayTime
:
Int
,
val
lastUseInterval
:
Int
,
val
featureEx1
:
Int
,
val
pushInterval
:
Int
)
data class
Result
(
val
data
:
Data
)
data class
Data
(
val
globalConfig
:
GlobalConfig
,
val
pushManagement
:
PushManagement
,
val
adsCfg
:
AdsCfg
,
val
pushCfg
:
PushCfg
)
data class
AdConfigData
(
val
status
:
Int
,
val
msg
:
String
,
val
sign
:
String
,
val
result
:
Result
,
val
extras
:
Any
?,
val
enc
:
Any
?,
val
security
:
String
)
MyDemo3/app/src/main/java/com/
test/mydemo3
/model/CleanBean.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/model/CleanBean.kt
View file @
c81d9d2a
package
com.
test.mydemo3.model
import
java.io.Serializable
class
CleanBean
:
Serializable
{
lateinit
var
typeName
:
String
var
isListViewShow
=
false
var
fileBeans
=
ArrayList
<
FileBean
>()
package
com.
xm.test.myfilemaster.model
import
java.io.Serializable
class
CleanBean
:
Serializable
{
lateinit
var
typeName
:
String
var
isListViewShow
=
false
var
fileBeans
=
ArrayList
<
FileBean
>()
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/model/FileBean.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/model/FileBean.kt
View file @
c81d9d2a
package
com.
test.mydemo3.model
import
android.graphics.Bitmap
import
android.graphics.drawable.Drawable
import
java.io.Serializable
class
FileBean
:
Serializable
{
var
fileName
:
String
=
""
var
filePath
:
String
=
""
var
hint
:
String
?
=
null
var
isDir
:
Boolean
=
false
var
drawable
:
Drawable
?
=
null
var
fileType
:
String
=
""
var
fileSize
:
Long
=
0
var
fileBitmap
:
Bitmap
?
=
null
var
childList
=
ArrayList
<
FileBean
>()
override
fun
toString
():
String
{
return
"FileBean(fileName='$fileName', filePath='$filePath', isDir=$isDir, fileType='$fileType', childList=${childList.toString()})"
}
package
com.
xm.test.myfilemaster.model
import
android.graphics.Bitmap
import
android.graphics.drawable.Drawable
import
java.io.Serializable
class
FileBean
:
Serializable
{
var
fileName
:
String
=
""
var
filePath
:
String
=
""
var
hint
:
String
?
=
null
var
isDir
:
Boolean
=
false
var
drawable
:
Drawable
?
=
null
var
fileType
:
String
=
""
var
fileSize
:
Long
=
0
var
fileBitmap
:
Bitmap
?
=
null
var
childList
=
ArrayList
<
FileBean
>()
override
fun
toString
():
String
{
return
"FileBean(fileName='$fileName', filePath='$filePath', isDir=$isDir, fileType='$fileType', childList=${childList.toString()})"
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/model/FilesItemBean.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/model/FilesItemBean.kt
View file @
c81d9d2a
package
com.
test.mydemo3.model
class
FilesItemBean
{
var
resId
:
Int
=
0
lateinit
var
mItemFileName
:
String
lateinit
var
mItemFileNone
:
String
var
mItemSelectChecked
:
Boolean
=
false
lateinit
var
mItemFilePath
:
String
var
mFileItemCount
:
Int
=
0
var
mFileSize
:
Int
=
0
var
mFileType
:
Int
=
0
// type 1 empty, 2 ..., 3 ...
package
com.
xm.test.myfilemaster.model
class
FilesItemBean
{
var
resId
:
Int
=
0
lateinit
var
mItemFileName
:
String
lateinit
var
mItemFileNone
:
String
var
mItemSelectChecked
:
Boolean
=
false
lateinit
var
mItemFilePath
:
String
var
mFileItemCount
:
Int
=
0
var
mFileSize
:
Int
=
0
var
mFileType
:
Int
=
0
// type 1 empty, 2 ..., 3 ...
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/util/BatteryUtil.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/util/BatteryUtil.kt
View file @
c81d9d2a
package
com.test.mydemo3.util
import
android.annotation.SuppressLint
import
android.content.Context
import
android.content.Intent
import
android.content.IntentFilter
import
java.util.Objects
object
BatteryUtil
{
lateinit
var
technology
:
String
var
voltage
:
Int
=
0
//瓦特
var
level
:
Int
=
0
//电量
var
temperature
:
Double
=
0.0
//温度
lateinit
var
status
:
String
lateinit
var
health
:
String
lateinit
var
plugged
:
String
/**
* 获取电池容量
* */
/*fun getBatteryCapacity(context: Context): String{
val mPowerProfile : Objects
var batteryCapacity = 0.0
val POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile"
try {
mPowerProfile = Class.forName(POWER_PROFILE_CLASS)
.getConstructor(Context::class.java)
.newInstance(context) as Objects
batteryCapacity = Class
.forName(POWER_PROFILE_CLASS)
.getMethod("getBatteryCapacity")
.invoke(mPowerProfile) as Double
}catch (e: Exception){
e.printStackTrace()
}
return batteryCapacity.toString()
}*/
fun
ReceiverBatteryOhterInfo
(
context
:
Context
){
val
intentFilter
=
IntentFilter
(
Intent
.
ACTION_BATTERY_CHANGED
)
val
receiver
=
context
.
registerReceiver
(
null
,
intentFilter
)
technology
=
receiver
?.
getStringExtra
(
"technology"
).
toString
()
if
(
technology
.
equals
(
""
)
||
technology
.
equals
(
null
)){
technology
=
"Unknown"
}
voltage
=
receiver
?.
getIntExtra
(
"voltage"
,
0
)
as
Int
level
=
receiver
.
getIntExtra
(
"level"
,
0
)
as
Int
temperature
=
receiver
.
getIntExtra
(
"temperature"
,
0
)
/
10.0
}
package
com.xm.test.myfilemaster.util
import
android.content.Context
import
android.content.Intent
import
android.content.IntentFilter
object
BatteryUtil
{
lateinit
var
technology
:
String
var
voltage
:
Int
=
0
//瓦特
var
level
:
Int
=
0
//电量
var
temperature
:
Double
=
0.0
//温度
lateinit
var
status
:
String
lateinit
var
health
:
String
lateinit
var
plugged
:
String
/**
* 获取电池容量
* */
/*fun getBatteryCapacity(context: Context): String{
val mPowerProfile : Objects
var batteryCapacity = 0.0
val POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile"
try {
mPowerProfile = Class.forName(POWER_PROFILE_CLASS)
.getConstructor(Context::class.java)
.newInstance(context) as Objects
batteryCapacity = Class
.forName(POWER_PROFILE_CLASS)
.getMethod("getBatteryCapacity")
.invoke(mPowerProfile) as Double
}catch (e: Exception){
e.printStackTrace()
}
return batteryCapacity.toString()
}*/
fun
ReceiverBatteryOhterInfo
(
context
:
Context
){
val
intentFilter
=
IntentFilter
(
Intent
.
ACTION_BATTERY_CHANGED
)
val
receiver
=
context
.
registerReceiver
(
null
,
intentFilter
)
technology
=
receiver
?.
getStringExtra
(
"technology"
).
toString
()
if
(
technology
.
equals
(
""
)
||
technology
.
equals
(
null
)){
technology
=
"Unknown"
}
voltage
=
receiver
?.
getIntExtra
(
"voltage"
,
0
)
as
Int
level
=
receiver
.
getIntExtra
(
"level"
,
0
)
as
Int
temperature
=
receiver
.
getIntExtra
(
"temperature"
,
0
)
/
10.0
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/util/FileUtil.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/util/FileUtil.kt
View file @
c81d9d2a
package
com.test.mydemo3.util
import
android.annotation.SuppressLint
import
android.content.Context
import
android.graphics.BitmapFactory
import
android.graphics.drawable.BitmapDrawable
import
android.net.Uri
import
android.os.Build
import
android.os.Environment
import
android.provider.MediaStore
import
android.util.Log
import
android.util.TypedValue
import
com.test.mydemo3.model.FileBean
import
kotlinx.coroutines.DelicateCoroutinesApi
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.GlobalScope
import
kotlinx.coroutines.launch
import
java.io.File
import
java.io.IOException
import
java.text.SimpleDateFormat
import
java.util.Date
object
FileUtil
{
val
EXTERNAL_STORAGE
:
String
=
Environment
.
getExternalStorageDirectory
().
path
const
val
TEXT_MIME_TYPE
=
"text/plain"
const
val
ZIP_MIME_TYPE
=
"application/zip"
const
val
RAR_MIME_TYPE
=
"application/x-rar-compressed"
const
val
ZIP_7Z_MIME_TYPE
=
"application/x-7z-compressed"
const
val
PDF_MIME_TYPE
=
"application/pdf"
const
val
WORD_MIME_TYPE
=
"application/msword"
const
val
EXCEL_MIME_TYPE
=
"application/vnd.ms-excel"
const
val
PPT_MIME_TYPE
=
"application/vnd.ms-powerpoint"
const
val
APK_MIME_TYPE
=
"application/vnd.android.package-archive"
const
val
MP3_MIME_TYPE
=
"audio/mpeg"
const
val
WAV_MIME_TYPE
=
"audio/x-wav"
fun
getFileCreateTime
(
filePath
:
String
)
:
Triple
<
Int
,
Int
,
Int
>{
val
folder
=
File
(
filePath
)
val
fileCreateTime
=
folder
.
lastModified
()
val
date
=
Date
(
fileCreateTime
)
val
format
=
SimpleDateFormat
(
"yyyy-MM-dd"
)
val
yearMonthDay
=
format
.
format
(
date
).
split
(
"-"
)
return
Triple
(
yearMonthDay
[
0
].
toInt
(),
yearMonthDay
[
1
].
toInt
(),
yearMonthDay
[
2
].
toInt
())
}
fun
createDirectory
(
path
:
String
,
fileDirName
:
String
):
FileBean
{
val
fileBean
=
FileBean
()
val
file
=
File
(
path
+
"/"
+
fileDirName
)
fileBean
.
filePath
=
"-1"
if
(!
file
.
exists
()){
val
mkdirs
=
file
.
mkdirs
()
if
(
mkdirs
){
if
(
file
.
isDirectory
){
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
isDir
=
true
}
}
}
return
fileBean
}
@SuppressLint
(
"Range"
)
fun
scanFiles
(
context
:
Context
,
uri
:
Uri
,
minSize
:
Long
)
:
ArrayList
<
FileBean
>{
var
filesItemBean
:
FileBean
var
fileListItemBean
=
ArrayList
<
FileBean
>()
val
projection
=
arrayOf
(
MediaStore
.
Files
.
FileColumns
.
_ID
,
MediaStore
.
Files
.
FileColumns
.
DISPLAY_NAME
,
MediaStore
.
Files
.
FileColumns
.
SIZE
)
val
cursor
=
context
.
contentResolver
.
query
(
uri
,
projection
,
null
,
null
,
null
)
if
(
cursor
!=
null
&&
cursor
.
moveToFirst
()){
do
{
val
fileSize
=
cursor
.
getLong
(
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
SIZE
))
if
(
fileSize
>
minSize
){
filesItemBean
=
FileBean
()
filesItemBean
.
fileName
=
cursor
.
getString
(
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
DISPLAY_NAME
))
filesItemBean
.
fileSize
=
fileSize
filesItemBean
.
filePath
=
cursor
.
getString
(
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
RELATIVE_PATH
))
filesItemBean
.
isDir
=
false
filesItemBean
.
fileType
=
getFileType
(
File
(
filesItemBean
.
filePath
))
fileListItemBean
.
add
(
filesItemBean
)
}
}
while
(
cursor
.
moveToNext
())
cursor
.
close
()
}
return
fileListItemBean
}
@SuppressLint
(
"Range"
)
fun
sanRecursive
(
context
:
Context
,
uri
:
Uri
,
minSize
:
Long
):
ArrayList
<
FileBean
>{
var
filesItemBeanList
=
ArrayList
<
FileBean
>()
filesItemBeanList
.
addAll
(
scanFiles
(
context
,
uri
,
minSize
))
val
selection
=
MediaStore
.
Files
.
FileColumns
.
MEDIA_TYPE
+
"="
+
MediaStore
.
Files
.
FileColumns
.
MEDIA_TYPE_NONE
val
sortOrder
=
MediaStore
.
Files
.
FileColumns
.
DATE_MODIFIED
val
cursor
=
context
.
contentResolver
.
query
(
uri
,
null
,
selection
,
null
,
sortOrder
)
if
(
cursor
!=
null
&&
cursor
.
moveToFirst
()){
do
{
val
fileId
=
cursor
.
getLong
(
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
_ID
))
val
chiIdUri
=
Uri
.
withAppendedPath
(
uri
,
""
+
fileId
)
filesItemBeanList
.
addAll
(
scanFiles
(
context
,
chiIdUri
,
minSize
))
}
while
(
cursor
.
moveToNext
())
cursor
.
close
()
}
return
filesItemBeanList
}
fun
getAllFilesAndDirectories
(
context
:
Context
):
ArrayList
<
FileBean
>{
var
fileList
=
ArrayList
<
FileBean
>()
// val internalStorageDir = context.filesDir
val
internalStorageDir
=
File
(
EXTERNAL_STORAGE
)
if
(
internalStorageDir
!=
null
&&
internalStorageDir
.
exists
()){
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
O
)
{
traverseDirectory
(
internalStorageDir
,
fileList
)
}
}
return
fileList
}
fun
traverseDirectory
(
directory
:
File
,
fileList
:
ArrayList
<
FileBean
>){
val
files
=
directory
.
listFiles
()
if
(
files
!=
null
){
for
(
file
:
File
in
files
){
val
fileBean
:
FileBean
=
FileBean
()
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
isDir
=
file
.
isDirectory
// val type = Files.probeContentType(Paths.get(file.path))
if
(
file
.
isDirectory
){
val
children
=
ArrayList
<
FileBean
>()
// traverseDirectory(file, children)
fileBean
.
childList
=
children
fileBean
.
fileType
=
"dir"
}
else
{
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
fileSize
=
file
.
length
()
}
fileList
.
add
(
fileBean
)
}
}
}
fun
getFileList
(
directory
:
File
)
:
ArrayList
<
FileBean
>{
val
fileBeans
=
ArrayList
<
FileBean
>()
// val directory = Environment.getExternalStorageDirectory()
val
files
=
directory
.
listFiles
()
for
(
file
in
files
!!
){
if
(!
file
.
isHidden
&&
!
file
.
name
.
startsWith
(
"."
)
&&
file
.
name
!=
".face"
)
{
val
fileBean
=
FileBean
()
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
isDir
=
file
.
isDirectory
// val type = Files.probeContentType(Paths.get(file.path))
if
(
file
.
isDirectory
){
val
children
=
ArrayList
<
FileBean
>()
traverseDirectory
(
file
,
children
)
fileBean
.
childList
=
children
fileBean
.
fileType
=
"dir"
}
else
{
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
fileSize
=
file
.
length
()
}
Log
.
e
(
"yanglin"
,
"getFileList: childList.size = ${fileBean.childList.size}"
,
)
fileBeans
.
add
(
fileBean
)
}
}
return
fileBeans
}
fun
getFileType
(
file
:
File
):
String
{
val
fileName
=
file
.
name
val
indexOf
=
fileName
.
lastIndexOf
(
"."
)
if
(
indexOf
!=
-
1
&&
indexOf
<
fileName
.
length
-
1
){
return
fileName
.
substring
(
indexOf
+
1
)
}
else
{
return
"notType"
}
}
fun
fileListSort
(
fileList
:
ArrayList
<
FileBean
>):
ArrayList
<
FileBean
>{
fileList
.
sortWith
(
Comparator
{
fileBean1
,
fileBean2
->
if
(
File
(
fileBean1
.
filePath
).
isDirectory
&&
!
File
(
fileBean2
.
filePath
).
isDirectory
)
{
-
1
}
else
if
(!
File
(
fileBean1
.
filePath
).
isDirectory
&&
File
(
fileBean2
.
filePath
).
isDirectory
)
{
1
}
else
{
fileBean1
.
fileName
.
compareTo
(
fileBean2
.
fileName
)
}
})
return
fileList
}
/**
* 查询大于10M的文件
* ***/
fun
search10MFiles
(
context
:
Context
,
sizeInByte
:
Int
):
ArrayList
<
FileBean
>{
val
fileBeans
=
ArrayList
<
FileBean
>()
val
projection
=
arrayOf
(
MediaStore
.
Files
.
FileColumns
.
DATA
,
MediaStore
.
Files
.
FileColumns
.
SIZE
)
val
selection
=
"${MediaStore.Files.FileColumns.SIZE} > ?"
val
selectionArgs
=
arrayOf
(
sizeInByte
.
toString
())
context
.
contentResolver
.
query
(
MediaStore
.
Files
.
getContentUri
(
"external"
),
projection
,
selection
,
selectionArgs
,
null
)
?.
use
{
cursor
->
val
dataColumnIndex
=
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
DATA
)
while
(
cursor
.
moveToNext
())
{
val
filePath
=
cursor
.
getString
(
dataColumnIndex
)
val
fileBean
=
FileBean
()
val
file
=
File
(
filePath
)
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
isDir
=
false
fileBeans
.
add
(
fileBean
)
}
}
return
fileBeans
}
fun
renameFile
(
oldPath
:
String
,
newName
:
String
):
Boolean
{
val
oldFile
=
File
(
oldPath
)
val
parentDir
=
oldFile
.
parentFile
// 获取文件的父目录
val
newFile
=
File
(
parentDir
,
newName
)
// 构建新的文件路径
return
oldFile
.
renameTo
(
newFile
)
}
fun
deleteFiles
(
filePaths
:
List
<
String
>):
Boolean
{
var
allDeleted
=
true
for
(
filePath
in
filePaths
)
{
val
file
=
File
(
filePath
)
val
deleted
=
file
.
delete
()
if
(!
deleted
)
{
// 删除失败
allDeleted
=
false
}
}
return
allDeleted
}
fun
moveFile
(
path
:
String
,
destinationPath
:
String
)
:
Boolean
{
val
file
=
File
(
path
)
val
destinationFile
=
File
(
destinationPath
)
Log
.
e
(
"yanglin"
,
"moveFile: filePath = ${path}, currentPath = $destinationPath"
,
)
return
file
.
renameTo
(
destinationFile
)
}
fun
copyFile
(
path
:
String
,
destinationPath
:
String
):
Boolean
{
return
try
{
File
(
path
).
inputStream
().
use
{
input
->
File
(
destinationPath
).
outputStream
().
use
{
output
->
input
.
copyTo
(
output
)
}
}
true
}
catch
(
e
:
IOException
){
e
.
printStackTrace
()
false
}
}
fun
scanEmptyFiles
(
filePath
:
String
,
fileList
:
ArrayList
<
FileBean
>){
val
files
=
File
(
filePath
).
listFiles
()
// 获取当前目录下的所有文件和文件夹
if
(
files
!=
null
)
{
for
(
file
in
files
)
{
if
(
file
.
isDirectory
&&
file
.
listFiles
()
?.
isEmpty
()
==
true
)
{
// 如果是文件夹,则递归搜索
val
fileBean
:
FileBean
=
FileBean
()
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
"dir"
fileBean
.
isDir
=
true
fileList
.
add
(
fileBean
)
}
else
if
(
file
.
isDirectory
){
scanEmptyFiles
(
file
.
path
,
fileList
)
}
}
}
}
fun
dpToPx
(
dp
:
Int
,
context
:
Context
):
Int
{
return
TypedValue
.
applyDimension
(
TypedValue
.
COMPLEX_UNIT_DIP
,
dp
.
toFloat
(),
context
.
resources
.
displayMetrics
).
toInt
()
}
@SuppressLint
(
"Recycle"
)
fun
getMediaData
(
context
:
Context
):
ArrayList
<
FileBean
>{
val
fileBeans
=
ArrayList
<
FileBean
>()
val
projection
=
arrayOf
(
MediaStore
.
Images
.
Media
.
DATA
)
val
cursor
=
context
.
contentResolver
.
query
(
MediaStore
.
Images
.
Media
.
EXTERNAL_CONTENT_URI
,
projection
,
null
,
null
,
null
)
cursor
?.
let
{
val
indexOrThrow
=
cursor
.
getColumnIndexOrThrow
(
MediaStore
.
Images
.
Media
.
DATA
)
while
(
cursor
.
moveToNext
()){
val
imagePath
=
cursor
.
getString
(
indexOrThrow
)
val
bitmap
=
BitmapFactory
.
decodeFile
(
imagePath
)
val
file
=
File
(
imagePath
)
val
fileBean
=
FileBean
()
fileBean
.
fileBitmap
=
bitmap
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
imagePath
fileBean
.
fileType
=
getFileType
(
file
)
Log
.
e
(
"yanglin"
,
"getFileList: childList.size = ${imagePath}"
,
)
fileBeans
.
add
(
fileBean
)
}
}
return
fileBeans
}
fun
getTypeFiles
(
types
:
Array
<
String
>,
fileBeans
:
ArrayList
<
FileBean
>){
MediaStore
.
Files
()
val
externalStorageDir
=
Environment
.
getExternalStorageDirectory
()
externalStorageDir
.
listFiles
()
?.
forEach
{
if
(
it
.
isDirectory
){
getTypeFiles
(
types
,
fileBeans
)
}
else
{
val
fileBean
=
FileBean
()
for
(
type
in
types
){
if
(
type
.
contains
(
getFileType
(
it
))){
fileBean
.
fileName
=
it
.
name
fileBean
.
filePath
=
it
.
path
fileBean
.
fileSize
=
it
.
length
()
fileBean
.
fileType
=
type
fileBean
.
isDir
=
false
fileBeans
.
add
(
fileBean
)
break
}
}
}
}
}
@SuppressLint
(
"Range"
)
fun
getMediaFiles
(
context
:
Context
,
fileType
:
String
,
limit
:
Int
):
ArrayList
<
FileBean
>
{
val
fileBeans
=
ArrayList
<
FileBean
>()
val
projection
=
arrayOf
(
MediaStore
.
Images
.
Media
.
DATA
)
var
contentUri
:
Uri
if
(
fileType
.
contains
(
"image"
)){
contentUri
=
MediaStore
.
Images
.
Media
.
EXTERNAL_CONTENT_URI
}
else
if
(
fileType
.
contains
(
"video"
)){
contentUri
=
MediaStore
.
Video
.
Media
.
EXTERNAL_CONTENT_URI
}
else
if
(
fileType
.
contains
(
"audio"
)){
contentUri
=
MediaStore
.
Audio
.
Media
.
EXTERNAL_CONTENT_URI
}
else
{
contentUri
=
MediaStore
.
Images
.
Media
.
EXTERNAL_CONTENT_URI
}
val
cursor
=
context
.
contentResolver
.
query
(
contentUri
,
projection
,
null
,
null
,
null
)
cursor
?.
use
{
var
count
=
0
while
(
it
.
moveToNext
())
{
if
(
count
<
limit
){
val
imagePath
=
it
.
getString
(
it
.
getColumnIndex
(
MediaStore
.
Images
.
Media
.
DATA
))
// images.add(imagePath)
val
fileBean
=
FileBean
()
val
file
=
File
(
imagePath
)
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
isDir
=
false
fileBean
.
drawable
=
if
(
fileType
.
contains
(
"image"
))
BitmapDrawable
(
context
.
resources
,
BitmapFactory
.
decodeFile
(
file
.
path
))
else
null
fileBeans
.
add
(
fileBean
)
}
count
++
}
cursor
.
close
()
}
return
fileBeans
}
fun
getFileType
(
mimeType
:
String
,
context
:
Context
):
ArrayList
<
FileBean
>{
val
fileBeans
:
ArrayList
<
FileBean
>
=
ArrayList
()
val
projection
=
arrayOf
(
MediaStore
.
Files
.
FileColumns
.
DATA
,
MediaStore
.
Files
.
FileColumns
.
MIME_TYPE
)
val
selection
=
"${MediaStore.Files.FileColumns.MIME_TYPE} = ?"
val
selectionArgs
=
arrayOf
(
mimeType
)
context
.
contentResolver
.
query
(
MediaStore
.
Files
.
getContentUri
(
"external"
),
projection
,
selection
,
selectionArgs
,
null
)
?.
use
{
cursor
->
val
dataColumnIndex
=
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
DATA
)
while
(
cursor
.
moveToNext
())
{
val
filePath
=
cursor
.
getString
(
dataColumnIndex
)
val
fileBean
=
FileBean
()
val
file
=
File
(
filePath
)
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
isDir
=
false
fileBeans
.
add
(
fileBean
)
}
cursor
.
close
()
}
return
fileBeans
}
package
com.xm.test.myfilemaster.util
import
android.annotation.SuppressLint
import
android.content.Context
import
android.graphics.BitmapFactory
import
android.graphics.drawable.BitmapDrawable
import
android.net.Uri
import
android.os.Build
import
android.os.Environment
import
android.provider.MediaStore
import
android.util.Log
import
android.util.TypedValue
import
com.xm.test.myfilemaster.model.FileBean
import
java.io.File
import
java.io.IOException
import
java.text.SimpleDateFormat
import
java.util.Date
object
FileUtil
{
val
EXTERNAL_STORAGE
:
String
=
Environment
.
getExternalStorageDirectory
().
path
const
val
TEXT_MIME_TYPE
=
"text/plain"
const
val
ZIP_MIME_TYPE
=
"application/zip"
const
val
RAR_MIME_TYPE
=
"application/x-rar-compressed"
const
val
ZIP_7Z_MIME_TYPE
=
"application/x-7z-compressed"
const
val
PDF_MIME_TYPE
=
"application/pdf"
const
val
WORD_MIME_TYPE
=
"application/msword"
const
val
EXCEL_MIME_TYPE
=
"application/vnd.ms-excel"
const
val
PPT_MIME_TYPE
=
"application/vnd.ms-powerpoint"
const
val
APK_MIME_TYPE
=
"application/vnd.android.package-archive"
const
val
MP3_MIME_TYPE
=
"audio/mpeg"
const
val
WAV_MIME_TYPE
=
"audio/x-wav"
fun
getFileCreateTime
(
filePath
:
String
)
:
Triple
<
Int
,
Int
,
Int
>{
val
folder
=
File
(
filePath
)
val
fileCreateTime
=
folder
.
lastModified
()
val
date
=
Date
(
fileCreateTime
)
val
format
=
SimpleDateFormat
(
"yyyy-MM-dd"
)
val
yearMonthDay
=
format
.
format
(
date
).
split
(
"-"
)
return
Triple
(
yearMonthDay
[
0
].
toInt
(),
yearMonthDay
[
1
].
toInt
(),
yearMonthDay
[
2
].
toInt
())
}
fun
createDirectory
(
path
:
String
,
fileDirName
:
String
):
FileBean
{
val
fileBean
=
FileBean
()
val
file
=
File
(
path
+
"/"
+
fileDirName
)
fileBean
.
filePath
=
"-1"
if
(!
file
.
exists
()){
val
mkdirs
=
file
.
mkdirs
()
if
(
mkdirs
){
if
(
file
.
isDirectory
){
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
isDir
=
true
}
}
}
return
fileBean
}
@SuppressLint
(
"Range"
)
fun
scanFiles
(
context
:
Context
,
uri
:
Uri
,
minSize
:
Long
)
:
ArrayList
<
FileBean
>{
var
filesItemBean
:
FileBean
var
fileListItemBean
=
ArrayList
<
FileBean
>()
val
projection
=
arrayOf
(
MediaStore
.
Files
.
FileColumns
.
_ID
,
MediaStore
.
Files
.
FileColumns
.
DISPLAY_NAME
,
MediaStore
.
Files
.
FileColumns
.
SIZE
)
val
cursor
=
context
.
contentResolver
.
query
(
uri
,
projection
,
null
,
null
,
null
)
if
(
cursor
!=
null
&&
cursor
.
moveToFirst
()){
do
{
val
fileSize
=
cursor
.
getLong
(
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
SIZE
))
if
(
fileSize
>
minSize
){
filesItemBean
=
FileBean
()
filesItemBean
.
fileName
=
cursor
.
getString
(
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
DISPLAY_NAME
))
filesItemBean
.
fileSize
=
fileSize
filesItemBean
.
filePath
=
cursor
.
getString
(
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
RELATIVE_PATH
))
filesItemBean
.
isDir
=
false
filesItemBean
.
fileType
=
getFileType
(
File
(
filesItemBean
.
filePath
))
fileListItemBean
.
add
(
filesItemBean
)
}
}
while
(
cursor
.
moveToNext
())
cursor
.
close
()
}
return
fileListItemBean
}
@SuppressLint
(
"Range"
)
fun
sanRecursive
(
context
:
Context
,
uri
:
Uri
,
minSize
:
Long
):
ArrayList
<
FileBean
>{
var
filesItemBeanList
=
ArrayList
<
FileBean
>()
filesItemBeanList
.
addAll
(
scanFiles
(
context
,
uri
,
minSize
))
val
selection
=
MediaStore
.
Files
.
FileColumns
.
MEDIA_TYPE
+
"="
+
MediaStore
.
Files
.
FileColumns
.
MEDIA_TYPE_NONE
val
sortOrder
=
MediaStore
.
Files
.
FileColumns
.
DATE_MODIFIED
val
cursor
=
context
.
contentResolver
.
query
(
uri
,
null
,
selection
,
null
,
sortOrder
)
if
(
cursor
!=
null
&&
cursor
.
moveToFirst
()){
do
{
val
fileId
=
cursor
.
getLong
(
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
_ID
))
val
chiIdUri
=
Uri
.
withAppendedPath
(
uri
,
""
+
fileId
)
filesItemBeanList
.
addAll
(
scanFiles
(
context
,
chiIdUri
,
minSize
))
}
while
(
cursor
.
moveToNext
())
cursor
.
close
()
}
return
filesItemBeanList
}
fun
getAllFilesAndDirectories
(
context
:
Context
):
ArrayList
<
FileBean
>{
var
fileList
=
ArrayList
<
FileBean
>()
// val internalStorageDir = context.filesDir
val
internalStorageDir
=
File
(
EXTERNAL_STORAGE
)
if
(
internalStorageDir
!=
null
&&
internalStorageDir
.
exists
()){
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
O
)
{
traverseDirectory
(
internalStorageDir
,
fileList
)
}
}
return
fileList
}
fun
traverseDirectory
(
directory
:
File
,
fileList
:
ArrayList
<
FileBean
>){
val
files
=
directory
.
listFiles
()
if
(
files
!=
null
){
for
(
file
:
File
in
files
){
val
fileBean
:
FileBean
=
FileBean
()
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
isDir
=
file
.
isDirectory
// val type = Files.probeContentType(Paths.get(file.path))
if
(
file
.
isDirectory
){
val
children
=
ArrayList
<
FileBean
>()
// traverseDirectory(file, children)
fileBean
.
childList
=
children
fileBean
.
fileType
=
"dir"
}
else
{
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
fileSize
=
file
.
length
()
}
fileList
.
add
(
fileBean
)
}
}
}
fun
getFileList
(
directory
:
File
)
:
ArrayList
<
FileBean
>{
val
fileBeans
=
ArrayList
<
FileBean
>()
// val directory = Environment.getExternalStorageDirectory()
val
files
=
directory
.
listFiles
()
for
(
file
in
files
!!
){
if
(!
file
.
isHidden
&&
!
file
.
name
.
startsWith
(
"."
)
&&
file
.
name
!=
".face"
)
{
val
fileBean
=
FileBean
()
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
isDir
=
file
.
isDirectory
// val type = Files.probeContentType(Paths.get(file.path))
if
(
file
.
isDirectory
){
val
children
=
ArrayList
<
FileBean
>()
traverseDirectory
(
file
,
children
)
fileBean
.
childList
=
children
fileBean
.
fileType
=
"dir"
}
else
{
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
fileSize
=
file
.
length
()
}
Log
.
e
(
"yanglin"
,
"getFileList: childList.size = ${fileBean.childList.size}"
,
)
fileBeans
.
add
(
fileBean
)
}
}
return
fileBeans
}
fun
getFileType
(
file
:
File
):
String
{
val
fileName
=
file
.
name
val
indexOf
=
fileName
.
lastIndexOf
(
"."
)
if
(
indexOf
!=
-
1
&&
indexOf
<
fileName
.
length
-
1
){
return
fileName
.
substring
(
indexOf
+
1
)
}
else
{
return
"notType"
}
}
fun
fileListSort
(
fileList
:
ArrayList
<
FileBean
>):
ArrayList
<
FileBean
>{
fileList
.
sortWith
(
Comparator
{
fileBean1
,
fileBean2
->
if
(
File
(
fileBean1
.
filePath
).
isDirectory
&&
!
File
(
fileBean2
.
filePath
).
isDirectory
)
{
-
1
}
else
if
(!
File
(
fileBean1
.
filePath
).
isDirectory
&&
File
(
fileBean2
.
filePath
).
isDirectory
)
{
1
}
else
{
fileBean1
.
fileName
.
compareTo
(
fileBean2
.
fileName
)
}
})
return
fileList
}
/**
* 查询大于10M的文件
* ***/
fun
search10MFiles
(
context
:
Context
,
sizeInByte
:
Int
):
ArrayList
<
FileBean
>{
val
fileBeans
=
ArrayList
<
FileBean
>()
val
projection
=
arrayOf
(
MediaStore
.
Files
.
FileColumns
.
DATA
,
MediaStore
.
Files
.
FileColumns
.
SIZE
)
val
selection
=
"${MediaStore.Files.FileColumns.SIZE} > ?"
val
selectionArgs
=
arrayOf
(
sizeInByte
.
toString
())
context
.
contentResolver
.
query
(
MediaStore
.
Files
.
getContentUri
(
"external"
),
projection
,
selection
,
selectionArgs
,
null
)
?.
use
{
cursor
->
val
dataColumnIndex
=
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
DATA
)
while
(
cursor
.
moveToNext
())
{
val
filePath
=
cursor
.
getString
(
dataColumnIndex
)
val
fileBean
=
FileBean
()
val
file
=
File
(
filePath
)
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
isDir
=
false
fileBeans
.
add
(
fileBean
)
}
}
return
fileBeans
}
fun
renameFile
(
oldPath
:
String
,
newName
:
String
):
Boolean
{
val
oldFile
=
File
(
oldPath
)
val
parentDir
=
oldFile
.
parentFile
// 获取文件的父目录
val
newFile
=
File
(
parentDir
,
newName
)
// 构建新的文件路径
return
oldFile
.
renameTo
(
newFile
)
}
fun
deleteFiles
(
filePaths
:
List
<
String
>):
Boolean
{
var
allDeleted
=
true
for
(
filePath
in
filePaths
)
{
val
file
=
File
(
filePath
)
val
deleted
=
file
.
delete
()
if
(!
deleted
)
{
// 删除失败
allDeleted
=
false
}
}
return
allDeleted
}
fun
moveFile
(
path
:
String
,
destinationPath
:
String
)
:
Boolean
{
val
file
=
File
(
path
)
val
destinationFile
=
File
(
destinationPath
)
Log
.
e
(
"yanglin"
,
"moveFile: filePath = ${path}, currentPath = $destinationPath"
,
)
return
file
.
renameTo
(
destinationFile
)
}
fun
copyFile
(
path
:
String
,
destinationPath
:
String
):
Boolean
{
return
try
{
File
(
path
).
inputStream
().
use
{
input
->
File
(
destinationPath
).
outputStream
().
use
{
output
->
input
.
copyTo
(
output
)
}
}
true
}
catch
(
e
:
IOException
){
e
.
printStackTrace
()
false
}
}
fun
scanEmptyFiles
(
filePath
:
String
,
fileList
:
ArrayList
<
FileBean
>){
val
files
=
File
(
filePath
).
listFiles
()
// 获取当前目录下的所有文件和文件夹
if
(
files
!=
null
)
{
for
(
file
in
files
)
{
if
(
file
.
isDirectory
&&
file
.
listFiles
()
?.
isEmpty
()
==
true
)
{
// 如果是文件夹,则递归搜索
val
fileBean
:
FileBean
=
FileBean
()
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
"dir"
fileBean
.
isDir
=
true
fileList
.
add
(
fileBean
)
}
else
if
(
file
.
isDirectory
){
scanEmptyFiles
(
file
.
path
,
fileList
)
}
}
}
}
fun
dpToPx
(
dp
:
Int
,
context
:
Context
):
Int
{
return
TypedValue
.
applyDimension
(
TypedValue
.
COMPLEX_UNIT_DIP
,
dp
.
toFloat
(),
context
.
resources
.
displayMetrics
).
toInt
()
}
@SuppressLint
(
"Recycle"
)
fun
getMediaData
(
context
:
Context
):
ArrayList
<
FileBean
>{
val
fileBeans
=
ArrayList
<
FileBean
>()
val
projection
=
arrayOf
(
MediaStore
.
Images
.
Media
.
DATA
)
val
cursor
=
context
.
contentResolver
.
query
(
MediaStore
.
Images
.
Media
.
EXTERNAL_CONTENT_URI
,
projection
,
null
,
null
,
null
)
cursor
?.
let
{
val
indexOrThrow
=
cursor
.
getColumnIndexOrThrow
(
MediaStore
.
Images
.
Media
.
DATA
)
while
(
cursor
.
moveToNext
()){
val
imagePath
=
cursor
.
getString
(
indexOrThrow
)
val
bitmap
=
BitmapFactory
.
decodeFile
(
imagePath
)
val
file
=
File
(
imagePath
)
val
fileBean
=
FileBean
()
fileBean
.
fileBitmap
=
bitmap
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
imagePath
fileBean
.
fileType
=
getFileType
(
file
)
Log
.
e
(
"yanglin"
,
"getFileList: childList.size = ${imagePath}"
,
)
fileBeans
.
add
(
fileBean
)
}
}
return
fileBeans
}
fun
getTypeFiles
(
types
:
Array
<
String
>,
fileBeans
:
ArrayList
<
FileBean
>){
MediaStore
.
Files
()
val
externalStorageDir
=
Environment
.
getExternalStorageDirectory
()
externalStorageDir
.
listFiles
()
?.
forEach
{
if
(
it
.
isDirectory
){
getTypeFiles
(
types
,
fileBeans
)
}
else
{
val
fileBean
=
FileBean
()
for
(
type
in
types
){
if
(
type
.
contains
(
getFileType
(
it
))){
fileBean
.
fileName
=
it
.
name
fileBean
.
filePath
=
it
.
path
fileBean
.
fileSize
=
it
.
length
()
fileBean
.
fileType
=
type
fileBean
.
isDir
=
false
fileBeans
.
add
(
fileBean
)
break
}
}
}
}
}
@SuppressLint
(
"Range"
)
fun
getMediaFiles
(
context
:
Context
,
fileType
:
String
,
limit
:
Int
):
ArrayList
<
FileBean
>
{
val
fileBeans
=
ArrayList
<
FileBean
>()
val
projection
=
arrayOf
(
MediaStore
.
Images
.
Media
.
DATA
)
var
contentUri
:
Uri
if
(
fileType
.
contains
(
"image"
)){
contentUri
=
MediaStore
.
Images
.
Media
.
EXTERNAL_CONTENT_URI
}
else
if
(
fileType
.
contains
(
"video"
)){
contentUri
=
MediaStore
.
Video
.
Media
.
EXTERNAL_CONTENT_URI
}
else
if
(
fileType
.
contains
(
"audio"
)){
contentUri
=
MediaStore
.
Audio
.
Media
.
EXTERNAL_CONTENT_URI
}
else
{
contentUri
=
MediaStore
.
Images
.
Media
.
EXTERNAL_CONTENT_URI
}
val
cursor
=
context
.
contentResolver
.
query
(
contentUri
,
projection
,
null
,
null
,
null
)
cursor
?.
use
{
var
count
=
0
while
(
it
.
moveToNext
())
{
if
(
count
<
limit
){
val
imagePath
=
it
.
getString
(
it
.
getColumnIndex
(
MediaStore
.
Images
.
Media
.
DATA
))
// images.add(imagePath)
val
fileBean
=
FileBean
()
val
file
=
File
(
imagePath
)
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
isDir
=
false
fileBean
.
drawable
=
if
(
fileType
.
contains
(
"image"
))
BitmapDrawable
(
context
.
resources
,
BitmapFactory
.
decodeFile
(
file
.
path
))
else
null
fileBeans
.
add
(
fileBean
)
}
count
++
}
cursor
.
close
()
}
return
fileBeans
}
fun
getFileType
(
mimeType
:
String
,
context
:
Context
):
ArrayList
<
FileBean
>{
val
fileBeans
:
ArrayList
<
FileBean
>
=
ArrayList
()
val
projection
=
arrayOf
(
MediaStore
.
Files
.
FileColumns
.
DATA
,
MediaStore
.
Files
.
FileColumns
.
MIME_TYPE
)
val
selection
=
"${MediaStore.Files.FileColumns.MIME_TYPE} = ?"
val
selectionArgs
=
arrayOf
(
mimeType
)
context
.
contentResolver
.
query
(
MediaStore
.
Files
.
getContentUri
(
"external"
),
projection
,
selection
,
selectionArgs
,
null
)
?.
use
{
cursor
->
val
dataColumnIndex
=
cursor
.
getColumnIndex
(
MediaStore
.
Files
.
FileColumns
.
DATA
)
while
(
cursor
.
moveToNext
())
{
val
filePath
=
cursor
.
getString
(
dataColumnIndex
)
val
fileBean
=
FileBean
()
val
file
=
File
(
filePath
)
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
path
fileBean
.
fileSize
=
file
.
length
()
fileBean
.
fileType
=
getFileType
(
file
)
fileBean
.
isDir
=
false
fileBeans
.
add
(
fileBean
)
}
cursor
.
close
()
}
return
fileBeans
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/util/HttpRequest.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/util/HttpRequest.kt
View file @
c81d9d2a
package
com.test.mydemo3.util
import
com.google.gson.Gson
import
com.test.mydemo3.model.AdConfigData
import
okhttp3.OkHttpClient
import
okhttp3.Request
import
okhttp3.Response
object
HttpRequest
{
fun
getMaxAdConfig
(){
Thread
(
Runnable
{
val
okHttpClient
=
OkHttpClient
()
val
request
=
Request
.
Builder
()
.
url
(
UrlManager
.
URL_
)
.
build
()
val
response
=
okHttpClient
.
newCall
(
request
).
execute
()
if
(
response
.
isSuccessful
){
Gson
().
fromJson
(
response
.
body
().
toString
(),
AdConfigData
::
class
.
java
)
}
}).
start
()
}
package
com.xm.test.myfilemaster.util
import
com.google.gson.Gson
import
com.xm.test.myfilemaster.model.AdConfigData
import
okhttp3.OkHttpClient
import
okhttp3.Request
object
HttpRequest
{
fun
getMaxAdConfig
(){
Thread
(
Runnable
{
val
okHttpClient
=
OkHttpClient
()
val
request
=
Request
.
Builder
()
.
url
(
UrlManager
.
URL_
)
.
build
()
val
response
=
okHttpClient
.
newCall
(
request
).
execute
()
if
(
response
.
isSuccessful
){
Gson
().
fromJson
(
response
.
body
().
toString
(),
AdConfigData
::
class
.
java
)
}
}).
start
()
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/util/MediaUtil.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/util/MediaUtil.kt
View file @
c81d9d2a
package
com.
test.mydemo3.util
import
android.annotation.SuppressLint
import
android.content.ContentResolver
import
android.content.Context
import
android.graphics.Bitmap
import
android.graphics.BitmapFactory
import
android.provider.MediaStore
import
android.util.TypedValue
import
com.
test.mydemo3.model.FileBean
import
java.io.File
object
MediaUtil
{
fun
cropImage
(
imagePath
:
String
,
desiredWidth
:
Int
,
desiredHeight
:
Int
,
context
:
Context
):
Bitmap
{
val
desiredHeight_
=
TypedValue
.
applyDimension
(
TypedValue
.
COMPLEX_UNIT_DIP
,
desiredHeight
.
toFloat
(),
context
.
resources
.
displayMetrics
).
toInt
()
val
desiredWidth_
=
TypedValue
.
applyDimension
(
TypedValue
.
COMPLEX_UNIT_DIP
,
desiredWidth
.
toFloat
(),
context
.
resources
.
displayMetrics
).
toInt
()
// 从图片路径中加载 Bitmap
val
options
=
BitmapFactory
.
Options
()
options
.
inJustDecodeBounds
=
true
BitmapFactory
.
decodeFile
(
imagePath
,
options
)
// 计算采样率以便加载图片时节省内存
options
.
inSampleSize
=
calculateInSampleSize
(
options
,
desiredWidth_
,
desiredHeight_
)
// 加载 Bitmap
options
.
inJustDecodeBounds
=
false
val
bitmap
=
BitmapFactory
.
decodeFile
(
imagePath
,
options
)
// 裁剪 Bitmap
return
Bitmap
.
createScaledBitmap
(
bitmap
,
desiredWidth_
,
desiredHeight_
,
false
)
}
fun
calculateInSampleSize
(
options
:
BitmapFactory
.
Options
,
desiredWidth
:
Int
,
desiredHeight
:
Int
):
Int
{
val
height
=
options
.
outHeight
val
width
=
options
.
outWidth
var
inSampleSize
=
1
if
(
height
>
desiredHeight
||
width
>
desiredWidth
)
{
val
halfHeight
=
height
/
2
val
halfWidth
=
width
/
2
while
((
halfHeight
/
inSampleSize
)
>=
desiredHeight
&&
(
halfWidth
/
inSampleSize
)
>=
desiredWidth
)
{
inSampleSize
*=
2
}
}
return
inSampleSize
}
@SuppressLint
(
"Range"
)
fun
getRecentImages
(
context
:
Context
,
limit
:
Int
):
ArrayList
<
FileBean
>
{
// val images = mutableListOf<String>()
val
images
=
ArrayList
<
FileBean
>()
val
contentResolver
:
ContentResolver
=
context
.
contentResolver
val
projection
=
arrayOf
(
MediaStore
.
Images
.
Media
.
DATA
)
val
sortOrder
=
"${MediaStore.Images.Media.DATE_MODIFIED} DESC"
val
cursor
=
contentResolver
.
query
(
MediaStore
.
Images
.
Media
.
EXTERNAL_CONTENT_URI
,
projection
,
null
,
null
,
sortOrder
)
cursor
?.
use
{
var
count
=
0
while
(
it
.
moveToNext
()
&&
count
<
limit
)
{
val
fileBean
=
FileBean
()
val
imagePath
=
it
.
getString
(
it
.
getColumnIndex
(
MediaStore
.
Images
.
Media
.
DATA
))
// images.add(imagePath)
val
file
=
File
(
imagePath
)
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
absolutePath
fileBean
.
fileType
=
FileUtil
.
getFileType
(
file
)
fileBean
.
fileBitmap
=
BitmapFactory
.
decodeFile
(
imagePath
)
images
.
add
(
fileBean
)
count
++
}
}
cursor
?.
close
()
return
images
}
// fun findSimilarImages(baseImagePath: String, imageDirectoryPath: String, threshold: Double): List<String> {
// val similarImages = mutableListOf<String>()
//
// val baseImage = File(baseImagePath)
// val baseImageHash = ImageHash.getHash(baseImage)
//
// val imageDirectory = File(imageDirectoryPath)
// val imageFiles = imageDirectory.listFiles { file -> file.isFile }
//
// imageFiles?.let {
// for (imageFile in it) {
// val imageHash = ImageHash.getHash(imageFile)
// val similarity = ImageHash.getSimilarity(baseImageHash, imageHash)
// if (similarity >= threshold) {
// similarImages.add(imageFile.absolutePath)
// }
// }
// }
//
// return similarImages
// }
package
com.
xm.test.myfilemaster.util
import
android.annotation.SuppressLint
import
android.content.ContentResolver
import
android.content.Context
import
android.graphics.Bitmap
import
android.graphics.BitmapFactory
import
android.provider.MediaStore
import
android.util.TypedValue
import
com.
xm.test.myfilemaster.model.FileBean
import
java.io.File
object
MediaUtil
{
fun
cropImage
(
imagePath
:
String
,
desiredWidth
:
Int
,
desiredHeight
:
Int
,
context
:
Context
):
Bitmap
{
val
desiredHeight_
=
TypedValue
.
applyDimension
(
TypedValue
.
COMPLEX_UNIT_DIP
,
desiredHeight
.
toFloat
(),
context
.
resources
.
displayMetrics
).
toInt
()
val
desiredWidth_
=
TypedValue
.
applyDimension
(
TypedValue
.
COMPLEX_UNIT_DIP
,
desiredWidth
.
toFloat
(),
context
.
resources
.
displayMetrics
).
toInt
()
// 从图片路径中加载 Bitmap
val
options
=
BitmapFactory
.
Options
()
options
.
inJustDecodeBounds
=
true
BitmapFactory
.
decodeFile
(
imagePath
,
options
)
// 计算采样率以便加载图片时节省内存
options
.
inSampleSize
=
calculateInSampleSize
(
options
,
desiredWidth_
,
desiredHeight_
)
// 加载 Bitmap
options
.
inJustDecodeBounds
=
false
val
bitmap
=
BitmapFactory
.
decodeFile
(
imagePath
,
options
)
// 裁剪 Bitmap
return
Bitmap
.
createScaledBitmap
(
bitmap
,
desiredWidth_
,
desiredHeight_
,
false
)
}
fun
calculateInSampleSize
(
options
:
BitmapFactory
.
Options
,
desiredWidth
:
Int
,
desiredHeight
:
Int
):
Int
{
val
height
=
options
.
outHeight
val
width
=
options
.
outWidth
var
inSampleSize
=
1
if
(
height
>
desiredHeight
||
width
>
desiredWidth
)
{
val
halfHeight
=
height
/
2
val
halfWidth
=
width
/
2
while
((
halfHeight
/
inSampleSize
)
>=
desiredHeight
&&
(
halfWidth
/
inSampleSize
)
>=
desiredWidth
)
{
inSampleSize
*=
2
}
}
return
inSampleSize
}
@SuppressLint
(
"Range"
)
fun
getRecentImages
(
context
:
Context
,
limit
:
Int
):
ArrayList
<
FileBean
>
{
// val images = mutableListOf<String>()
val
images
=
ArrayList
<
FileBean
>()
val
contentResolver
:
ContentResolver
=
context
.
contentResolver
val
projection
=
arrayOf
(
MediaStore
.
Images
.
Media
.
DATA
)
val
sortOrder
=
"${MediaStore.Images.Media.DATE_MODIFIED} DESC"
val
cursor
=
contentResolver
.
query
(
MediaStore
.
Images
.
Media
.
EXTERNAL_CONTENT_URI
,
projection
,
null
,
null
,
sortOrder
)
cursor
?.
use
{
var
count
=
0
while
(
it
.
moveToNext
()
&&
count
<
limit
)
{
val
fileBean
=
FileBean
()
val
imagePath
=
it
.
getString
(
it
.
getColumnIndex
(
MediaStore
.
Images
.
Media
.
DATA
))
// images.add(imagePath)
val
file
=
File
(
imagePath
)
fileBean
.
fileName
=
file
.
name
fileBean
.
filePath
=
file
.
absolutePath
fileBean
.
fileType
=
FileUtil
.
getFileType
(
file
)
fileBean
.
fileBitmap
=
BitmapFactory
.
decodeFile
(
imagePath
)
images
.
add
(
fileBean
)
count
++
}
}
cursor
?.
close
()
return
images
}
// fun findSimilarImages(baseImagePath: String, imageDirectoryPath: String, threshold: Double): List<String> {
// val similarImages = mutableListOf<String>()
//
// val baseImage = File(baseImagePath)
// val baseImageHash = ImageHash.getHash(baseImage)
//
// val imageDirectory = File(imageDirectoryPath)
// val imageFiles = imageDirectory.listFiles { file -> file.isFile }
//
// imageFiles?.let {
// for (imageFile in it) {
// val imageHash = ImageHash.getHash(imageFile)
// val similarity = ImageHash.getSimilarity(baseImageHash, imageHash)
// if (similarity >= threshold) {
// similarImages.add(imageFile.absolutePath)
// }
// }
// }
//
// return similarImages
// }
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/util/PermissionUtil.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/util/PermissionUtil.kt
View file @
c81d9d2a
package
com.test.mydemo3.util
import
android.Manifest
import
android.app.Activity
import
android.content.Context
import
android.content.Intent
import
android.content.pm.PackageManager
import
android.net.Uri
import
android.os.Build
import
android.os.Environment
import
android.provider.Settings
import
androidx.activity.ComponentActivity
import
androidx.activity.result.contract.ActivityResultContract
import
androidx.activity.result.contract.ActivityResultContracts
import
androidx.core.app.ActivityCompat
import
androidx.core.content.ContextCompat
import
androidx.fragment.app.FragmentActivity
import
com.permissionx.guolindev.PermissionX
import
com.permissionx.guolindev.callback.RequestCallback
import
com.test.mydemo3.activity.HomeActivity
import
com.test.mydemo3.base.BaseActivity
import
java.security.Permissions
object
PermissionUtil
{
var
LOCATION_PERMISSION
=
false
fun
requestPermission
(
context
:
Context
?){
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
TIRAMISU
){
}
else
if
(
Build
.
VERSION
.
SDK_INT
>
Build
.
VERSION_CODES
.
R
)
{
val
intent
=
Intent
().
apply
{
action
=
Settings
.
ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
data
=
Uri
.
fromParts
(
"package"
,
context
?.
packageName
,
null
)
flags
=
Intent
.
FLAG_ACTIVITY_NEW_TASK
}
context
?.
startActivity
(
intent
)
}
else
{
val
intent
=
Intent
().
apply
{
action
=
Settings
.
ACTION_APPLICATION_DETAILS_SETTINGS
data
=
Uri
.
fromParts
(
"package"
,
context
?.
packageName
,
null
)
}
context
?.
startActivity
(
intent
)
}
}
fun
checkGrantedPermission
(
activity
:
ComponentActivity
?)
:
Boolean
{
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
TIRAMISU
){
//TODO android 14以上
HomeActivity
.
isPermission
=
Environment
.
isExternalStorageManager
()
return
HomeActivity
.
isPermission
}
else
if
(
Build
.
VERSION
.
SDK_INT
>
Build
.
VERSION_CODES
.
R
)
{
HomeActivity
.
isPermission
=
Environment
.
isExternalStorageManager
()
return
HomeActivity
.
isPermission
}
else
{
HomeActivity
.
isPermission
=
ActivityCompat
.
checkSelfPermission
(
activity
!!
,
Manifest
.
permission
.
READ_EXTERNAL_STORAGE
)
==
PackageManager
.
PERMISSION_GRANTED
return
HomeActivity
.
isPermission
}
}
fun
requestLocationPermission
(
context
:
FragmentActivity
?){
PermissionX
.
init
(
context
!!
).
permissions
(
Manifest
.
permission
.
ACCESS_FINE_LOCATION
,
Manifest
.
permission
.
ACCESS_COARSE_LOCATION
,
).
request
(
RequestCallback
{
allGranted
,
grantedList
,
deniedList
->
if
(
allGranted
){
LOCATION_PERMISSION
=
true
}
else
{
LOCATION_PERMISSION
=
false
}
})
}
package
com.xm.test.myfilemaster.util
import
android.Manifest
import
android.content.Context
import
android.content.Intent
import
android.content.pm.PackageManager
import
android.net.Uri
import
android.os.Build
import
android.os.Environment
import
android.provider.Settings
import
androidx.activity.ComponentActivity
import
androidx.core.app.ActivityCompat
import
androidx.fragment.app.FragmentActivity
import
com.permissionx.guolindev.PermissionX
import
com.permissionx.guolindev.callback.RequestCallback
import
com.xm.test.myfilemaster.activity.HomeActivity
object
PermissionUtil
{
var
LOCATION_PERMISSION
=
false
fun
requestPermission
(
context
:
Context
?){
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
TIRAMISU
){
}
else
if
(
Build
.
VERSION
.
SDK_INT
>
Build
.
VERSION_CODES
.
R
)
{
val
intent
=
Intent
().
apply
{
action
=
Settings
.
ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
data
=
Uri
.
fromParts
(
"package"
,
context
?.
packageName
,
null
)
flags
=
Intent
.
FLAG_ACTIVITY_NEW_TASK
}
context
?.
startActivity
(
intent
)
}
else
{
val
intent
=
Intent
().
apply
{
action
=
Settings
.
ACTION_APPLICATION_DETAILS_SETTINGS
data
=
Uri
.
fromParts
(
"package"
,
context
?.
packageName
,
null
)
}
context
?.
startActivity
(
intent
)
}
}
fun
checkGrantedPermission
(
activity
:
ComponentActivity
?)
:
Boolean
{
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
TIRAMISU
){
//TODO android 14以上
HomeActivity
.
isPermission
=
Environment
.
isExternalStorageManager
()
return
HomeActivity
.
isPermission
}
else
if
(
Build
.
VERSION
.
SDK_INT
>
Build
.
VERSION_CODES
.
R
)
{
HomeActivity
.
isPermission
=
Environment
.
isExternalStorageManager
()
return
HomeActivity
.
isPermission
}
else
{
HomeActivity
.
isPermission
=
ActivityCompat
.
checkSelfPermission
(
activity
!!
,
Manifest
.
permission
.
READ_EXTERNAL_STORAGE
)
==
PackageManager
.
PERMISSION_GRANTED
return
HomeActivity
.
isPermission
}
}
fun
requestLocationPermission
(
context
:
FragmentActivity
?){
PermissionX
.
init
(
context
!!
).
permissions
(
Manifest
.
permission
.
ACCESS_FINE_LOCATION
,
Manifest
.
permission
.
ACCESS_COARSE_LOCATION
,
).
request
(
RequestCallback
{
allGranted
,
grantedList
,
deniedList
->
if
(
allGranted
){
LOCATION_PERMISSION
=
true
}
else
{
LOCATION_PERMISSION
=
false
}
})
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/util/SystemServerState.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/util/SystemServerState.kt
View file @
c81d9d2a
package
com.
test.mydemo3.util
import
android.bluetooth.BluetoothAdapter
import
android.content.ContentResolver
import
android.content.Context
import
android.location.LocationManager
import
android.net.wifi.WifiManager
import
android.provider.Settings
object
SystemServerState
{
fun
isGPSEnabled
(
context
:
Context
):
Boolean
{
val
locationManager
=
context
.
getSystemService
(
Context
.
LOCATION_SERVICE
)
as
LocationManager
return
locationManager
.
isProviderEnabled
(
LocationManager
.
GPS_PROVIDER
)
?:
false
}
fun
isBluetoothEnabled
():
Boolean
{
val
bluetoothAdapter
=
BluetoothAdapter
.
getDefaultAdapter
()
return
bluetoothAdapter
?.
isEnabled
?:
false
}
fun
isHotspotEnabled
(
context
:
Context
):
Boolean
{
val
wifiManager
=
context
.
getSystemService
(
Context
.
WIFI_SERVICE
)
as
WifiManager
return
wifiManager
.
isWifiEnabled
?:
false
}
fun
isAutoBrightnessEnabled
(
contentResolver
:
ContentResolver
?):
Boolean
{
try
{
val
mode
:
Int
=
Settings
.
System
.
getInt
(
contentResolver
,
Settings
.
System
.
SCREEN_BRIGHTNESS_MODE
)
return
mode
==
Settings
.
System
.
SCREEN_BRIGHTNESS_MODE_AUTOMATIC
}
catch
(
e
:
Settings
.
SettingNotFoundException
)
{
e
.
printStackTrace
()
}
return
false
}
package
com.
xm.test.myfilemaster.util
import
android.bluetooth.BluetoothAdapter
import
android.content.ContentResolver
import
android.content.Context
import
android.location.LocationManager
import
android.net.wifi.WifiManager
import
android.provider.Settings
object
SystemServerState
{
fun
isGPSEnabled
(
context
:
Context
):
Boolean
{
val
locationManager
=
context
.
getSystemService
(
Context
.
LOCATION_SERVICE
)
as
LocationManager
return
locationManager
.
isProviderEnabled
(
LocationManager
.
GPS_PROVIDER
)
?:
false
}
fun
isBluetoothEnabled
():
Boolean
{
val
bluetoothAdapter
=
BluetoothAdapter
.
getDefaultAdapter
()
return
bluetoothAdapter
?.
isEnabled
?:
false
}
fun
isHotspotEnabled
(
context
:
Context
):
Boolean
{
val
wifiManager
=
context
.
getSystemService
(
Context
.
WIFI_SERVICE
)
as
WifiManager
return
wifiManager
.
isWifiEnabled
?:
false
}
fun
isAutoBrightnessEnabled
(
contentResolver
:
ContentResolver
?):
Boolean
{
try
{
val
mode
:
Int
=
Settings
.
System
.
getInt
(
contentResolver
,
Settings
.
System
.
SCREEN_BRIGHTNESS_MODE
)
return
mode
==
Settings
.
System
.
SCREEN_BRIGHTNESS_MODE_AUTOMATIC
}
catch
(
e
:
Settings
.
SettingNotFoundException
)
{
e
.
printStackTrace
()
}
return
false
}
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/util/UrlManager.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/util/UrlManager.kt
View file @
c81d9d2a
package
com.
test.mydemo3.util
object
UrlManager
{
const
val
AD_APP_KEY
=
"GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
const
val
AD_UNIT_ID
=
""
const
val
TEST_PLACEMENT_HERE
=
""
const
val
URL_
=
"https://api.magicfolder.xyz/cccfig?pkg=testonline"
package
com.
xm.test.myfilemaster.util
object
UrlManager
{
const
val
AD_APP_KEY
=
"GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
const
val
AD_UNIT_ID
=
""
const
val
TEST_PLACEMENT_HERE
=
""
const
val
URL_
=
"https://api.magicfolder.xyz/cccfig?pkg=testonline"
}
\ No newline at end of file
MyDemo3/app/src/main/java/com/
test/mydemo3
/view/CirclePgBar.java
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/view/CirclePgBar.java
View file @
c81d9d2a
package
com
.
test
.
mydemo3
.
view
;
import
android.content.Context
;
import
android.graphics.Canvas
;
import
android.graphics.
Color
;
import
android.graphics.
Paint
;
import
android.
graphics.RectF
;
import
android.
util.AttributeSet
;
import
android.view.View
;
import
com.test.mydemo3.R
;
/**
* Created by Jay on 2015/8/5 0005.
*/
public
class
CirclePgBar
extends
View
{
private
Paint
mBackPaint
;
private
Paint
mFrontPaint
;
private
Paint
mTextPaint
;
private
float
mStrokeWidth
=
50
;
private
float
mHalfStrokeWidth
=
mStrokeWidth
/
2
;
private
float
mRadius
=
200
;
private
RectF
mRect
;
private
int
mProgress
=
0
;
//目标值,想改多少就改多少
private
int
mTargetProgress
=
90
;
private
int
mMax
=
100
;
private
int
mWidth
;
private
int
mHeight
;
private
Context
mContext
;
public
CirclePgBar
(
Context
context
)
{
super
(
context
);
this
.
mContext
=
context
;
init
();
}
public
CirclePgBar
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
this
.
mContext
=
context
;
init
();
}
public
CirclePgBar
(
Context
context
,
AttributeSet
attrs
,
int
defStyleAttr
)
{
super
(
context
,
attrs
,
defStyleAttr
);
this
.
mContext
=
context
;
init
();
}
//完成相关参数初始化
private
void
init
()
{
mBackPaint
=
new
Paint
();
mBackPaint
.
setColor
(
mContext
.
getColor
(
R
.
color
.
progress_background
));
mBackPaint
.
setAntiAlias
(
true
);
mBackPaint
.
setStyle
(
Paint
.
Style
.
STROKE
);
mBackPaint
.
setStrokeWidth
(
mStrokeWidth
);
mBackPaint
.
setStrokeWidth
(
20
);
mFrontPaint
=
new
Paint
();
mFrontPaint
.
setColor
(
mContext
.
getColor
(
R
.
color
.
white
));
mFrontPaint
.
setAntiAlias
(
true
);
mFrontPaint
.
setStyle
(
Paint
.
Style
.
STROKE
);
mFrontPaint
.
setStrokeWidth
(
mStrokeWidth
);
mFrontPaint
.
setStrokeWidth
(
20
);
mTextPaint
=
new
Paint
();
mTextPaint
.
setColor
(
mContext
.
getColor
(
R
.
color
.
white
));
mTextPaint
.
setAntiAlias
(
true
);
mTextPaint
.
setTextSize
(
120
);
mTextPaint
.
setTextAlign
(
Paint
.
Align
.
CENTER
);
}
//重写测量大小的onMeasure方法和绘制View的核心方法onDraw()
@Override
protected
void
onMeasure
(
int
widthMeasureSpec
,
int
heightMeasureSpec
)
{
super
.
onMeasure
(
widthMeasureSpec
,
heightMeasureSpec
);
mWidth
=
getRealSize
(
widthMeasureSpec
);
mHeight
=
getRealSize
(
heightMeasureSpec
);
setMeasuredDimension
(
mWidth
,
mHeight
);
}
@Override
protected
void
onDraw
(
Canvas
canvas
)
{
initRect
();
float
angle
=
mProgress
/
(
float
)
mMax
*
360
;
canvas
.
drawCircle
(
mWidth
/
2
,
mHeight
/
2
,
mRadius
,
mBackPaint
);
canvas
.
drawArc
(
mRect
,
-
90
,
angle
,
false
,
mFrontPaint
);
// canvas.drawText(mProgress + "%", mWidth / 2 + mHalfStrokeWidth -20, mHeight / 2 + mHalfStrokeWidth + 20, mTextPaint);
if
(
mProgress
<
mTargetProgress
)
{
mProgress
+=
1
;
invalidate
();
}
}
public
void
setTargetProgress
(
int
value
){
this
.
mTargetProgress
=
value
;
}
public
int
getRealSize
(
int
measureSpec
)
{
int
result
=
1
;
int
mode
=
MeasureSpec
.
getMode
(
measureSpec
);
int
size
=
MeasureSpec
.
getSize
(
measureSpec
);
if
(
mode
==
View
.
MeasureSpec
.
AT_MOST
||
mode
==
MeasureSpec
.
UNSPECIFIED
)
{
//自己计算
result
=
(
int
)
(
mRadius
*
2
+
mStrokeWidth
);
}
else
{
result
=
size
;
}
return
result
;
}
private
void
initRect
()
{
if
(
mRect
==
null
)
{
mRect
=
new
RectF
();
int
viewSize
=
(
int
)
(
mRadius
*
2
);
int
left
=
(
mWidth
-
viewSize
)
/
2
;
int
top
=
(
mHeight
-
viewSize
)
/
2
;
int
right
=
left
+
viewSize
;
int
bottom
=
top
+
viewSize
;
mRect
.
set
(
left
,
top
,
right
,
bottom
);
}
}
}
package
com
.
xm
.
test
.
myfilemaster
.
view
;
import
android.content.Context
;
import
android.graphics.Canvas
;
import
android.graphics.
Paint
;
import
android.graphics.
RectF
;
import
android.
util.AttributeSet
;
import
android.
view.View
;
import
com.xm.test.myfilemaster.R
;
/**
* Created by Jay on 2015/8/5 0005.
*/
public
class
CirclePgBar
extends
View
{
private
Paint
mBackPaint
;
private
Paint
mFrontPaint
;
private
Paint
mTextPaint
;
private
float
mStrokeWidth
=
50
;
private
float
mHalfStrokeWidth
=
mStrokeWidth
/
2
;
private
float
mRadius
=
200
;
private
RectF
mRect
;
private
int
mProgress
=
0
;
//目标值,想改多少就改多少
private
int
mTargetProgress
=
90
;
private
int
mMax
=
100
;
private
int
mWidth
;
private
int
mHeight
;
private
Context
mContext
;
public
CirclePgBar
(
Context
context
)
{
super
(
context
);
this
.
mContext
=
context
;
init
();
}
public
CirclePgBar
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
this
.
mContext
=
context
;
init
();
}
public
CirclePgBar
(
Context
context
,
AttributeSet
attrs
,
int
defStyleAttr
)
{
super
(
context
,
attrs
,
defStyleAttr
);
this
.
mContext
=
context
;
init
();
}
//完成相关参数初始化
private
void
init
()
{
mBackPaint
=
new
Paint
();
mBackPaint
.
setColor
(
mContext
.
getColor
(
R
.
color
.
progress_background
));
mBackPaint
.
setAntiAlias
(
true
);
mBackPaint
.
setStyle
(
Paint
.
Style
.
STROKE
);
mBackPaint
.
setStrokeWidth
(
mStrokeWidth
);
mBackPaint
.
setStrokeWidth
(
20
);
mFrontPaint
=
new
Paint
();
mFrontPaint
.
setColor
(
mContext
.
getColor
(
R
.
color
.
white
));
mFrontPaint
.
setAntiAlias
(
true
);
mFrontPaint
.
setStyle
(
Paint
.
Style
.
STROKE
);
mFrontPaint
.
setStrokeWidth
(
mStrokeWidth
);
mFrontPaint
.
setStrokeWidth
(
20
);
mTextPaint
=
new
Paint
();
mTextPaint
.
setColor
(
mContext
.
getColor
(
R
.
color
.
white
));
mTextPaint
.
setAntiAlias
(
true
);
mTextPaint
.
setTextSize
(
120
);
mTextPaint
.
setTextAlign
(
Paint
.
Align
.
CENTER
);
}
//重写测量大小的onMeasure方法和绘制View的核心方法onDraw()
@Override
protected
void
onMeasure
(
int
widthMeasureSpec
,
int
heightMeasureSpec
)
{
super
.
onMeasure
(
widthMeasureSpec
,
heightMeasureSpec
);
mWidth
=
getRealSize
(
widthMeasureSpec
);
mHeight
=
getRealSize
(
heightMeasureSpec
);
setMeasuredDimension
(
mWidth
,
mHeight
);
}
@Override
protected
void
onDraw
(
Canvas
canvas
)
{
initRect
();
float
angle
=
mProgress
/
(
float
)
mMax
*
360
;
canvas
.
drawCircle
(
mWidth
/
2
,
mHeight
/
2
,
mRadius
,
mBackPaint
);
canvas
.
drawArc
(
mRect
,
-
90
,
angle
,
false
,
mFrontPaint
);
// canvas.drawText(mProgress + "%", mWidth / 2 + mHalfStrokeWidth -20, mHeight / 2 + mHalfStrokeWidth + 20, mTextPaint);
if
(
mProgress
<
mTargetProgress
)
{
mProgress
+=
1
;
invalidate
();
}
}
public
void
setTargetProgress
(
int
value
){
this
.
mTargetProgress
=
value
;
}
public
int
getRealSize
(
int
measureSpec
)
{
int
result
=
1
;
int
mode
=
MeasureSpec
.
getMode
(
measureSpec
);
int
size
=
MeasureSpec
.
getSize
(
measureSpec
);
if
(
mode
==
View
.
MeasureSpec
.
AT_MOST
||
mode
==
MeasureSpec
.
UNSPECIFIED
)
{
//自己计算
result
=
(
int
)
(
mRadius
*
2
+
mStrokeWidth
);
}
else
{
result
=
size
;
}
return
result
;
}
private
void
initRect
()
{
if
(
mRect
==
null
)
{
mRect
=
new
RectF
();
int
viewSize
=
(
int
)
(
mRadius
*
2
);
int
left
=
(
mWidth
-
viewSize
)
/
2
;
int
top
=
(
mHeight
-
viewSize
)
/
2
;
int
right
=
left
+
viewSize
;
int
bottom
=
top
+
viewSize
;
mRect
.
set
(
left
,
top
,
right
,
bottom
);
}
}
}
MyDemo3/app/src/main/java/com/
test/mydemo3
/view/CustomDialog.kt
→
MyDemo3/app/src/main/java/com/
xm/test/myfilemaster
/view/CustomDialog.kt
View file @
c81d9d2a
package
com.test.mydemo3.view
import
android.app.Dialog
import
android.content.Context
import
android.content.res.ColorStateList
import
android.content.res.Resources
import
android.graphics.Color
import
android.graphics.Point
import
android.graphics.drawable.ColorDrawable
import
android.graphics.drawable.Drawable
import
android.os.Bundle
import
android.view.View
import
android.widget.Button
import
android.widget.EditText
import
android.widget.TextView
import
com.test.mydemo3.R
class
CustomDialog
(
context
:
Context
?)
:
Dialog
(
context
!!
),
View
.
OnClickListener
{
private
lateinit
var
mEdit
:
EditText
private
lateinit
var
mCancel
:
TextView
private
lateinit
var
mSure
:
TextView
private
var
mTitle
:
TextView
?
=
null
private
var
mHint
:
TextView
?
=
null
private
var
mCancelListener
:
View
.
OnClickListener
?
=
null
private
var
mSureListener
:
View
.
OnClickListener
?
=
null
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
setContentView
(
R
.
layout
.
dialog_custom_layout
)
setCancelable
(
false
)
window
?.
setBackgroundDrawable
(
ColorDrawable
(
Color
.
TRANSPARENT
))
val
windowManager
=
window
?.
windowManager
val
display
=
windowManager
?.
defaultDisplay
val
params
=
window
?.
attributes
val
size
=
Point
()
display
?.
getSize
(
size
)
params
?.
width
=
((
size
.
x
)
*
0.959
).
toInt
()
window
?.
attributes
=
params
mEdit
=
findViewById
(
R
.
id
.
dialog_edit
)
mCancel
=
findViewById
(
R
.
id
.
dialog_cancel_btn
)
mSure
=
findViewById
(
R
.
id
.
dialog_sure_btn
)
mTitle
=
findViewById
(
R
.
id
.
dialog_title_text
)
mHint
=
findViewById
(
R
.
id
.
dialog_hint_text
)
mCancel
.
setOnClickListener
(
this
)
mSure
.
setOnClickListener
(
this
)
}
fun
setsConfirm
(
sure
:
View
.
OnClickListener
):
CustomDialog
{
this
.
mSureListener
=
sure
return
this
}
fun
setsCancel
(
cancel
:
View
.
OnClickListener
):
CustomDialog
{
this
.
mCancelListener
=
cancel
return
this
}
fun
setsTitle
(
str
:
String
):
CustomDialog
{
findViewById
<
TextView
>(
R
.
id
.
dialog_title_text
).
text
=
str
return
this
}
fun
setsHint
(
str
:
String
):
CustomDialog
{
findViewById
<
TextView
>(
R
.
id
.
dialog_hint_text
).
text
=
str
return
this
}
fun
setsRightDelete
(
str
:
String
):
CustomDialog
{
mSure
.
text
=
str
mSure
.
setTextColor
(
Color
.
RED
)
mSure
.
setBackgroundResource
(
R
.
drawable
.
bg_btn_cancel_shape
)
return
this
}
fun
isShowEditText
(
isShow
:
Boolean
):
CustomDialog
{
mEdit
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
return
this
}
fun
isShowHintText
(
isShow
:
Boolean
):
CustomDialog
{
findViewById
<
TextView
>(
R
.
id
.
dialog_hint_text
).
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
return
this
}
fun
getEditTextStr
():
String
{
return
mEdit
.
text
.
toString
()
}
override
fun
onClick
(
v
:
View
?)
{
when
(
v
?.
id
){
R
.
id
.
dialog_cancel_btn
->{
if
(
mCancelListener
!=
null
){
mCancelListener
?.
onClick
(
v
)
}
}
R
.
id
.
dialog_sure_btn
->{
if
(
mSureListener
!=
null
){
mSureListener
?.
onClick
(
v
)
}
}
}
}
package
com.xm.test.myfilemaster.view
import
android.app.Dialog
import
android.content.Context
import
android.graphics.Color
import
android.graphics.Point
import
android.graphics.drawable.ColorDrawable
import
android.os.Bundle
import
android.view.View
import
android.widget.EditText
import
android.widget.TextView
import
com.xm.test.myfilemaster.R
class
CustomDialog
(
context
:
Context
?)
:
Dialog
(
context
!!
),
View
.
OnClickListener
{
private
lateinit
var
mEdit
:
EditText
private
lateinit
var
mCancel
:
TextView
private
lateinit
var
mSure
:
TextView
private
var
mTitle
:
TextView
?
=
null
private
var
mHint
:
TextView
?
=
null
private
var
mCancelListener
:
View
.
OnClickListener
?
=
null
private
var
mSureListener
:
View
.
OnClickListener
?
=
null
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
setContentView
(
R
.
layout
.
dialog_custom_layout
)
setCancelable
(
false
)
window
?.
setBackgroundDrawable
(
ColorDrawable
(
Color
.
TRANSPARENT
))
val
windowManager
=
window
?.
windowManager
val
display
=
windowManager
?.
defaultDisplay
val
params
=
window
?.
attributes
val
size
=
Point
()
display
?.
getSize
(
size
)
params
?.
width
=
((
size
.
x
)
*
0.959
).
toInt
()
window
?.
attributes
=
params
mEdit
=
findViewById
(
R
.
id
.
dialog_edit
)
mCancel
=
findViewById
(
R
.
id
.
dialog_cancel_btn
)
mSure
=
findViewById
(
R
.
id
.
dialog_sure_btn
)
mTitle
=
findViewById
(
R
.
id
.
dialog_title_text
)
mHint
=
findViewById
(
R
.
id
.
dialog_hint_text
)
mCancel
.
setOnClickListener
(
this
)
mSure
.
setOnClickListener
(
this
)
}
fun
setsConfirm
(
sure
:
View
.
OnClickListener
):
CustomDialog
{
this
.
mSureListener
=
sure
return
this
}
fun
setsCancel
(
cancel
:
View
.
OnClickListener
):
CustomDialog
{
this
.
mCancelListener
=
cancel
return
this
}
fun
setsTitle
(
str
:
String
):
CustomDialog
{
findViewById
<
TextView
>(
R
.
id
.
dialog_title_text
).
text
=
str
return
this
}
fun
setsHint
(
str
:
String
):
CustomDialog
{
findViewById
<
TextView
>(
R
.
id
.
dialog_hint_text
).
text
=
str
return
this
}
fun
setsRightDelete
(
str
:
String
):
CustomDialog
{
mSure
.
text
=
str
mSure
.
setTextColor
(
Color
.
RED
)
mSure
.
setBackgroundResource
(
R
.
drawable
.
bg_btn_cancel_shape
)
return
this
}
fun
isShowEditText
(
isShow
:
Boolean
):
CustomDialog
{
mEdit
.
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
return
this
}
fun
isShowHintText
(
isShow
:
Boolean
):
CustomDialog
{
findViewById
<
TextView
>(
R
.
id
.
dialog_hint_text
).
visibility
=
if
(
isShow
)
View
.
VISIBLE
else
View
.
GONE
return
this
}
fun
getEditTextStr
():
String
{
return
mEdit
.
text
.
toString
()
}
override
fun
onClick
(
v
:
View
?)
{
when
(
v
?.
id
){
R
.
id
.
dialog_cancel_btn
->{
if
(
mCancelListener
!=
null
){
mCancelListener
?.
onClick
(
v
)
}
}
R
.
id
.
dialog_sure_btn
->{
if
(
mSureListener
!=
null
){
mSureListener
?.
onClick
(
v
)
}
}
}
}
}
\ No newline at end of file
MyDemo3/app/src/main/res/layout/fragment_home.xml
View file @
c81d9d2a
...
...
@@ -149,7 +149,7 @@
<!-- android:visibility="gone"-->
<!-- app:lottie_loop="true"/>-->
<com.
test.mydemo3
.view.CirclePgBar
<com.
xm.test.myfilemaster
.view.CirclePgBar
android:id=
"@+id/progress_circular"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
/>
...
...
MyDemo3/app/src/test/java/com/
test
/mydemo3/ExampleUnitTest.kt
→
MyDemo3/app/src/test/java/com/
xm
/mydemo3/ExampleUnitTest.kt
View file @
c81d9d2a
package
com.
test
.mydemo3
package
com.
xm
.mydemo3
import
org.junit.Test
...
...
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