Commit c81d9d2a authored by wanglei's avatar wanglei

替换包名

parent 28cd9e39
......@@ -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
......
package com.test.mydemo3
package com.xm.mydemo3
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
......
......@@ -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
package com.test.mydemo3.adapter
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
class HomeViewPagerAdapter() {
}
\ No newline at end of file
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()
}
......
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
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
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
......
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() {
......
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>()
......
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
......
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
......
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
......
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() {
......
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() {
......
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() {
......
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() {
......
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 {
......
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
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>() {
......
//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
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
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
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
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.test.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.trustlook.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
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
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
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() {
......
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
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
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
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
......
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)
......
package com.test.mydemo3.fragment
package com.xm.test.myfilemaster.fragment
import androidx.lifecycle.ViewModel
......
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 {
......
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
)
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
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
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
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
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
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
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
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
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
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
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);
}
}
}
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
......@@ -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"/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment