Commit 29ea9ca7 authored by wanglei's avatar wanglei

aaa

parent b709b22c
......@@ -21,11 +21,26 @@
android:theme="@style/Theme.SimpleFilesManager"
tools:targetApi="31">
<activity
android:name=".simplelist.SimpleListActivity"
android:name=".internalstorage.InternalStorageActivity"
android:exported="false" />
<activity
android:name=".simpledup.SimpleDupActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".simplelist.SimpleListActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="fullSensor"
tools:ignore="DiscouragedApi" />
<activity
android:name=".simplegrid.SimpleGridActivity"
android:exported="false" />
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".JoLaunchjoActivity"
android:exported="true"
......
......@@ -80,13 +80,10 @@ class MainActivity : AppCompatActivity() {
return true
}
})
}
override fun onStart() {
super.onStart()
if (!jostorejoPermissionCheck()) {
jorequestjoStoreFollow(joActivityJoLauncher, disAgreeAction = {}, agreeAction = {})
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.internalstorage
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ActivityInternalStorageBinding
class InternalStorageActivity : AppCompatActivity() {
private lateinit var binding: ActivityInternalStorageBinding
private val viewModel: InternalStorageViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityInternalStorageBinding.inflate(layoutInflater)
setContentView(R.layout.activity_internal_storage)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.internalstorage
import androidx.lifecycle.ViewModel
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel
class InternalStorageViewModel : SimpleCommonViewModel() {
}
\ No newline at end of file
......@@ -88,4 +88,27 @@ abstract class SimpleCommonViewModel : ViewModel() {
onFinish.invoke(resultList)
}
/**
* @param filter 过滤条件
* @param convert 抓换为JoFileJo的转换方法
* @param onDo 扫描部分数据执行
* @param onFinish 扫描完成执行
*/
fun <T : JoFileJo> loadFile(
filter: (file: File) -> Boolean,
convert: (file: File) -> T,
onFinish: (list: List<T>) -> Unit
) = viewModelScope.launch(Dispatchers.IO) {
val root = Environment.getExternalStorageDirectory()
val resultList = arrayListOf<T>()
linkedWhileFolder(root) { file ->
if (filter(file)) {
resultList.add(convert(file))
}
}
onFinish.invoke(resultList)
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpleadpter
import android.annotation.SuppressLint
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx
@SuppressLint("NotifyDataSetChanged")
abstract class JoCommonJoAdapter<T : ViewHolder, E : JoFileJo>() : RecyclerView.Adapter<T>() {
val joFileList = arrayListOf<E>()
fun bindIcon(data: JoFileJo, iv: ImageView) {
val file = data.toFile()
when {
JoFileJo.isImage(file) or JoFileJo.isVideo(file) -> {
val radius = DipPxEx.dp2px(iv.context, R.dimen.dp_5)
val options =
RequestOptions().transform(
CenterCrop(), RoundedCorners(radius)
)
Glide.with(iv.context)
.load(data.path)
.apply(options)
.into(iv)
}
JoFileJo.isAudio(file) -> iv.setImageResource(R.mipmap.sfaad_598)
JoFileJo.isZip(file) -> iv.setImageResource(R.mipmap.sfz_6985)
JoFileJo.isApk(file) -> iv.setImageResource(R.mipmap.vzxv_59875)
JoFileJo.isDocument(file) -> iv.setImageResource(R.mipmap.szxv_8859)
JoFileJo.isLargeFile(file) -> iv.setImageResource(R.mipmap.fasd_589256)
}
}
override fun getItemCount(): Int {
return joFileList.size
}
......
package com.zxhy.simplefilesmanager.simpledata
data class JoDupFileJo(
val md5: String,
val dups: ArrayList<JoGridFileJo>,
var isSelected: Boolean = false,
)
\ No newline at end of file
......@@ -11,6 +11,57 @@ abstract class JoFileJo(
var path: String = ""
) {
companion object {
fun isImage(file: File): Boolean {
return file.name.contains(".jpg") or
file.name.contains(".png") or
file.name.contains(".gif")
}
fun isVideo(file: File): Boolean {
return file.name.contains(".mp4") or
file.name.contains(".avi") or
file.name.contains(".flv") or
file.name.contains(".rmvb") or
file.name.contains(".mkv")
}
fun isAudio(file: File): Boolean {
return file.name.contains(".mp3") or
file.name.contains(".aac") or
file.name.contains(".ogg") or
file.name.contains(".aac")
}
fun isLargeFile(file: File): Boolean {
return file.length() >= 10 * 1024 * 1024
}
fun isEmptyFile(file: File): Boolean {
return file.length() >= 0
}
fun isZip(file: File): Boolean {
return file.name.contains(".zip")
}
fun isApk(file: File): Boolean {
return file.name.contains(".apk")
}
fun isDocument(file: File): Boolean {
return file.name.contains(".doc") or
file.name.contains(".docx") or
file.name.contains(".ppt") or
file.name.contains(".pptx") or
file.name.contains(".xls") or
file.name.contains(".xlsx") or
file.name.contains(".txt") or
file.name.contains(".pdf")
}
}
fun toFile(): File {
return File(path)
}
......
......@@ -15,11 +15,7 @@ class JoGridFileJo(
}
}
fun File.joGridFileJo2(): JoGridFileJo {
return JoGridFileJo().apply {
fName = name
}
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpledata
import android.content.Context
import android.text.format.Formatter
import android.widget.ImageView
import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
class JoListFileJo(
val timeE: String = "",
var timeE: String = "",
val sss: Int = 0,
) : JoFileJo() {
companion object {
fun JoListFileJo.isImage(): Boolean {
return JoFileJo.isImage(toFile())
}
fun JoListFileJo.isVideo(): Boolean {
return JoFileJo.isVideo(toFile())
}
fun joListFileJo(file: File): JoListFileJo {
return JoListFileJo().apply {
fName = file.name
timeE = file.timeE()
path = file.absolutePath
}
}
fun File.sizeF(context: Context): String {
return Formatter.formatFileSize(context, length())
}
fun File.timeE(): String {
return SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH).format(lastModified())
}
}
}
package com.zxhy.simplefilesmanager.simpledup
import android.os.Bundle
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ActivitySimpleDupBinding
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simplejoke.JoActivityJoLauncher
import com.zxhy.simplefilesmanager.simplejoke.permission.JoPermissionJoCheckEx.jostorejoPermissionCheck
import com.zxhy.simplefilesmanager.simplejoke.permission.JoStoreJoPermissionEx.jorequestjoStoreFollow
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class SimpleDupActivity : AppCompatActivity() {
private val viewModel: SimpleDupViewModel by viewModels()
private lateinit var binding: ActivitySimpleDupBinding
private lateinit var launcher: JoActivityJoLauncher
private lateinit var adapter: SimpleDupAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
launcher = JoActivityJoLauncher(this)
binding = ActivitySimpleDupBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
initAdapter()
if (!jostorejoPermissionCheck()) {
showPermissionSet()
} else {
loadData()
}
}
private fun initAdapter() {
adapter = SimpleDupAdapter { flag, count ->
binding.ivAll.isSelected = flag
if (count == 0) {
binding.tvDelete.visibility = View.GONE
} else {
binding.tvDelete.visibility = View.VISIBLE
binding.tvDelete.setOnClickListener {
val data = adapter.getSubList()
viewModel.deleteFiles(data.map { it.toFile() }) {
lifecycleScope.launch(Dispatchers.Main) {
adapter.removeData(data)
}
}
}
}
}
binding.rvDup.adapter = adapter
binding.flAll.setOnClickListener {
binding.ivAll.isSelected = !binding.ivAll.isSelected
adapter.toggleSelect(binding.ivAll.isSelected)
}
}
private fun showPermissionSet() {
binding.flPermissionSet.visibility = View.VISIBLE
binding.tvSet.setOnClickListener {
jorequestjoStoreFollow(launcher,
disAgreeAction = {
},
agreeAction = {
binding.flPermissionSet.visibility = View.GONE
loadData()
})
}
}
private fun loadData() {
binding.pb.visibility = View.VISIBLE
viewModel.loadDup { list ->
lifecycleScope.launch(Dispatchers.Main) {
binding.pb.visibility = View.GONE
adapter.setData(list)
}
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpledup
import android.annotation.SuppressLint
import android.content.Context
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.zxhy.simplefilesmanager.databinding.ItemJoDupJoBinding
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import android.view.ViewGroup
import com.bumptech.glide.request.RequestOptions
import com.zxhy.simplefilesmanager.R
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.zxhy.simplefilesmanager.simpledata.JoDupFileJo
import com.zxhy.simplefilesmanager.simpleadpter.JoCommonJoAdapter
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
import com.zxhy.simplefilesmanager.databinding.ItemJoIJoSelectBinding
class SimpleDupAdapter(
private val allSelect: (allSelect: Boolean, count: Int) -> Unit
) : RecyclerView.Adapter<SimpleDupAdapter.DDD>() {
private var dupList = arrayListOf<JoDupFileJo>()
class DDD(view: View) : ViewHolder(view) {
val binding = ItemJoDupJoBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DDD {
return DDD(R.layout.item_jo_dup_jo.jojoinflate(parent))
}
override fun getItemCount(): Int = dupList.size
override fun onBindViewHolder(holder: DDD, position: Int) = Unit
override fun onBindViewHolder(holder: DDD, position: Int, payloads: MutableList<Any>) {
super.onBindViewHolder(holder, position, payloads)
val data = dupList[position]
val context = holder.itemView.context
if (payloads.isEmpty()) {
holder.binding.ivSelector.isSelected = data.isSelected
val adapter = SSS(context) { flag ->
data.isSelected = flag
holder.binding.ivSelector.isSelected = data.isSelected
notifyItemChanged(position, "sadsf")
val allFlag = dupList.all { it.isSelected }
val count = getSubList().size
allSelect.invoke(allFlag, count)
}
holder.binding.rv.adapter = adapter
adapter.setData(data.dups)
holder.binding.ivSelector.setOnClickListener {
it.isSelected = !it.isSelected
data.isSelected = it.isSelected
notifyItemChanged(position, "sfsaf")
adapter.toggleSelect(it.isSelected)
}
} else {
holder.binding.ivSelector.isSelected = data.isSelected
super.onBindViewHolder(holder, position, payloads)
}
}
@SuppressLint("NotifyDataSetChanged")
fun toggleSelect(select: Boolean) {
dupList.forEach { data ->
data.dups.forEach { it.isSelected = select }
}
notifyDataSetChanged()
}
fun getSubList(): ArrayList<JoGridFileJo> {
val select = arrayListOf<JoGridFileJo>()
dupList.forEach { data ->
select.addAll(data.dups.filter { it.isSelected })
}
return select
}
fun removeData(deletes: ArrayList<JoGridFileJo>) {
dupList.forEach { data ->
deletes.forEach { delete ->
data.dups.remove(delete)
}
}
val new = dupList.filter { it.dups.size > 1 }
setData(new)
}
@SuppressLint("NotifyDataSetChanged")
fun setData(data: List<JoDupFileJo>) {
dupList.clear()
dupList.addAll(data)
notifyDataSetChanged()
}
private class SSS(
context: Context,
val allSelectAction: (allSelect: Boolean) -> Unit
) : JoCommonJoAdapter<SSS.FFF, JoGridFileJo>() {
private val options =
RequestOptions()
.transform(CenterCrop(), RoundedCorners(DipPxEx.dp2px(context, R.dimen.dp_8)))
inner class FFF(view: View) : ViewHolder(view) {
val binding = ItemJoIJoSelectBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FFF {
return FFF(R.layout.item_jo_i_jo_select.jojoinflate(parent))
}
override fun onBindViewHolder(holder: FFF, position: Int) {}
override fun onBindViewHolder(holder: FFF, position: Int, payloads: MutableList<Any>) {
val context = holder.binding.root.context
val data = joFileList[position]
if (payloads.isEmpty()) {
Glide.with(context)
.load(data.path)
.apply(options)
.into(holder.binding.iv)
holder.binding.ivSelector.isSelected = data.isSelected
holder.binding.ivSelector.setOnClickListener {
data.isSelected = !data.isSelected
holder.binding.ivSelector.isSelected = data.isSelected
notifyItemChanged(position, "sumdk")
allSelectAction.invoke(joFileList.all { subData -> subData.isSelected })
}
} else {
holder.binding.ivSelector.isSelected = data.isSelected
super.onBindViewHolder(holder, position, payloads)
}
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpledup
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel
import com.zxhy.simplefilesmanager.simpledata.JoDupFileJo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo.Companion.joGridFileJo
import com.zxhy.simplefilesmanager.simpledata.JoFileJo.Companion.isImage
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simplejoke.JoMd5Ex.toHexString
import com.zxhy.simplefilesmanager.simplejoke.JoMd5Ex.partDigestMd5
class SimpleDupViewModel : SimpleCommonViewModel() {
fun loadDup(onFinish: (list: List<JoDupFileJo>) -> Unit) = loadFile(::isImage, ::joGridFileJo) {
val dups = calculateDup(it)
onFinish.invoke(dups)
}
private fun calculateDup(data: List<JoGridFileJo>): List<JoDupFileJo> {
val dupMap = HashMap<String, ArrayList<JoGridFileJo>>()
data.forEach {
val md5 = it.toFile().partDigestMd5().toHexString()
val dupList = dupMap[md5]
if (dupList == null) {
val newList = arrayListOf<JoGridFileJo>()
dupMap[md5] = newList
newList.add(it)
} else {
dupList.add(it)
}
}
val dupList = dupMap.filter { it.value.size > 1 }
.map { map ->
JoDupFileJo(md5 = map.key, dups = map.value)
}
return dupList
}
}
\ No newline at end of file
......@@ -59,6 +59,46 @@ class SimpleFileFragment() : Fragment() {
}
findNavController().navigate(R.id.simpleGridActivity, args)
}
binding.ivAudio.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "AUDIO")
}
findNavController().navigate(R.id.simpleListActivity, args)
}
binding.ivZip.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "ZIP")
}
findNavController().navigate(R.id.simpleListActivity, args)
}
binding.ivApk.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "APK")
}
findNavController().navigate(R.id.simpleListActivity, args)
}
binding.ivDocument.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "DOCUMENT")
}
findNavController().navigate(R.id.simpleListActivity, args)
}
binding.ivLargeFile.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "LARGE FILE")
}
findNavController().navigate(R.id.simpleListActivity, args)
}
binding.ivEmptyFile.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "EMPTY FILE")
}
findNavController().navigate(R.id.simpleListActivity, args)
}
}
......
......@@ -84,8 +84,8 @@ class SimpleGridActivity : AppCompatActivity() {
private fun onCompleteRefresh(list: List<JoGridFileJo>) =
lifecycleScope.launch(Dispatchers.Main) {
if (list.isNotEmpty()) {
binding.pb.visibility = View.GONE
if (list.isNotEmpty()) {
binding.rv.visibility = View.VISIBLE
binding.flDelete.visibility = View.VISIBLE
adapter.addData(list)
......
......@@ -2,6 +2,8 @@ package com.zxhy.simplefilesmanager.simplegrid
import androidx.lifecycle.viewModelScope
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel
import com.zxhy.simplefilesmanager.simpledata.JoFileJo.Companion.isImage
import com.zxhy.simplefilesmanager.simpledata.JoFileJo.Companion.isVideo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo.Companion.joGridFileJo
import kotlinx.coroutines.Dispatchers
......@@ -9,17 +11,7 @@ import kotlinx.coroutines.launch
import java.io.File
class SimpleGridViewModel : SimpleCommonViewModel() {
private fun isImage(file: File): Boolean {
return file.name.contains(".jpg") or file.name.contains(".png") or file.name.contains(".gif")
}
private fun isVideo(file: File): Boolean {
return file.name.contains(".mp4") or
file.name.contains(".avi") or
file.name.contains(".flv") or
file.name.contains(".rmvb") or
file.name.contains(".mkv")
}
fun loadImage(
onDo: (list: List<JoGridFileJo>) -> Unit,
......
package com.zxhy.simplefilesmanager.simplejoke
import java.io.File
import java.nio.channels.FileChannel
import java.security.MessageDigest
//生成、查看文件的MD5、SHA1、SHA2、SHA3值
//https://blog.csdn.net/COCO56/article/details/106161207
object JoMd5Ex {
fun File.partDigestMd5(): ByteArray {
if (length() > Integer.MAX_VALUE) {
return "${name.length} $name".toByteArray()
}
val byteBuffer =
inputStream().channel.map(FileChannel.MapMode.READ_ONLY, length() / 3, length() / 2)
val digest = MessageDigest.getInstance("MD5")
digest.update(byteBuffer)
return digest.digest()
}
private const val HEXES = "0123456789ABCDEF"
/**
* ByteArray转Hex码
*/
fun ByteArray.toHexString(): String {
val hex = StringBuilder(2 * this.size)
for (element in this) {
val high = element.toInt().and(0xFF).shr(4)
val low = element.toInt().and(0x0F)
hex.append(HEXES[high]).append(HEXES[low])
}
return hex.toString()
}
}
package com.zxhy.simplefilesmanager.simplelist
import android.annotation.SuppressLint
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
......@@ -12,39 +12,60 @@ import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ItemJoListFileJoBinding
import com.zxhy.simplefilesmanager.simpleadpter.JoCommonJoAdapter
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo.Companion.sizeF
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
class SimpleListAdapter(val context: Context) :
JoCommonJoAdapter<SimpleListAdapter.CC, JoListFileJo>() {
class SimpleListAdapter(
val context: Context,
private val selectClick: (select: Boolean, count: Int) -> Unit
) : JoCommonJoAdapter<SimpleListAdapter.MultiCC, JoListFileJo>() {
private val options =
RequestOptions()
.transform(CenterCrop(), RoundedCorners(DipPxEx.dp2px(context, R.dimen.dp_8)))
class CC(view: View) : ViewHolder(view) {
class MultiCC(view: View) : ViewHolder(view) {
val binding = ItemJoListFileJoBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CC {
return CC(R.layout.item_jo_list_file_jo.jojoinflate(parent))
}
override fun onBindViewHolder(holder: CC, position: Int) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MultiCC {
return MultiCC(R.layout.item_jo_list_file_jo.jojoinflate(parent))
}
override fun onBindViewHolder(holder: CC, position: Int, payloads: MutableList<Any>) {
override fun onBindViewHolder(holder: MultiCC, position: Int) {}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: MultiCC, position: Int, payloads: MutableList<Any>) {
val data = joFileList[position]
val context = holder.binding.root.context
if (payloads.isEmpty()) {
Glide.with(context)
.load(data.path)
.apply(options)
.into(holder.binding.iv)
bindIcon(data, holder.binding.iv)
holder.binding.tvName.text = data.fName
val file = data.toFile()
if (file.isFile) {
holder.binding.tvInfo.text = data.timeE + " ${file.sizeF(context)}"
} else {
val count = file.list()?.size ?: 0
holder.binding.tvInfo.text = data.timeE + " ${count}items"
}
holder.binding.ivSelector.setOnClickListener {
data.isSelected = !data.isSelected
holder.binding.ivSelector.isSelected = data.isSelected
notifyItemChanged(position, "sdada")
selectClick.invoke(data.isSelected, getSelectData().size)
}
} else {
holder.binding.root.setOnClickListener {
holder.binding.ivSelector.isSelected = data.isSelected
}
super.onBindViewHolder(holder, position, payloads)
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplelist
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import java.io.File
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel
import com.zxhy.simplefilesmanager.simpledata.JoFileJo.Companion.isAudio
import com.zxhy.simplefilesmanager.simpledata.JoFileJo.Companion.isDocument
import com.zxhy.simplefilesmanager.simpledata.JoFileJo.Companion.isEmptyFile
import com.zxhy.simplefilesmanager.simpledata.JoFileJo.Companion.isLargeFile
import com.zxhy.simplefilesmanager.simpledata.JoFileJo.Companion.isZip
import com.zxhy.simplefilesmanager.simpledata.JoFileJo.Companion.isApk
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo.Companion.joListFileJo
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo
class SimpleListViewModel : SimpleCommonViewModel() {
fun isAudio(file: File): Boolean {
return file.name.contains(".mp3") or
file.name.contains(".aac") or
file.name.contains(".ogg") or
file.name.contains(".aac")
}
fun loadAudio(
onDo: (list: List<JoGridFileJo>) -> Unit,
onFinish: (list: List<JoGridFileJo>) -> Unit
) = loadFile(::isAudio, JoGridFileJo.Companion ::joGridFileJo, onDo, onFinish)
onFinish: (list: List<JoListFileJo>) -> Unit
) = loadFile(::isAudio, ::joListFileJo, onFinish)
fun loadLargeFile(onFinish: (list: List<JoListFileJo>) -> Unit) =
loadFile(::isLargeFile, ::joListFileJo, onFinish)
fun loadEmptyFile(onFinish: (list: List<JoListFileJo>) -> Unit) =
loadFile(::isEmptyFile, ::joListFileJo, onFinish)
fun loadZip(onFinish: (list: List<JoListFileJo>) -> Unit) =
loadFile(::isZip, ::joListFileJo, onFinish)
fun loadApk(onFinish: (list: List<JoListFileJo>) -> Unit) =
loadFile(::isApk, ::joListFileJo, onFinish)
fun loadDocument(onFinish: (list: List<JoListFileJo>) -> Unit) =
loadFile(::isDocument, ::joListFileJo, onFinish)
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplemanager
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
......@@ -7,6 +8,8 @@ import android.view.View
import android.view.ViewGroup
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.FragmentSimpleManagerBinding
import com.zxhy.simplefilesmanager.simpledup.SimpleDupActivity
import com.zxhy.simplefilesmanager.simplelist.SimpleListActivity
class SimpleManagerFragment() : Fragment() {
......@@ -26,6 +29,14 @@ class SimpleManagerFragment() : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.llDupPicture.setOnClickListener {
startActivity(Intent(requireContext(), SimpleDupActivity::class.java))
}
binding.llLarge.setOnClickListener {
startActivity(Intent(requireContext(), SimpleListActivity::class.java).apply {
putExtra("Tittle", "LARGE FILE")
})
}
}
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF333333" />
<corners android:radius="20dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#333333" android:state_selected="true" />
<item android:color="#999999" android:state_selected="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".internalstorage.InternalStorageActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="36dp">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="65dp"
android:layout_height="match_parent">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@mipmap/dsf_5978897"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="DUPLICATE PICTURE"
android:textColor="#FF333333"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/fl_all"
android:layout_width="65dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:visibility="gone">
<ImageView
android:id="@+id/iv_all"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="20dp"
android:src="@mipmap/sldo_089"
tools:ignore="ContentDescription" />
</FrameLayout>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<LinearLayout
android:id="@+id/ll_operation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
android:layout_marginVertical="10dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="DisableBaselineAlignment">
<LinearLayout
android:id="@+id/ll_move"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables,UselessParent">
<ImageView
android:id="@+id/iv_move"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/sfad_6959"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="4dp"
android:text="Move"
android:textColor="#FF333333"
android:textSize="12sp"
tools:ignore="HardcodedText,SmallSp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_copy"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables,UselessParent">
<ImageView
android:id="@+id/iv_copy"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/wsd_69859"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="4dp"
android:text="Copy"
android:textColor="#FF333333"
android:textSize="12sp"
tools:ignore="HardcodedText,SmallSp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_share"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables,UselessParent">
<ImageView
android:id="@+id/iv_share"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/ewfa_698959"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="4dp"
android:text="Share"
android:textColor="#FF333333"
android:textSize="12sp"
tools:ignore="HardcodedText,SmallSp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_move"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables,UselessParent">
<ImageView
android:id="@+id/iv_copy"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/dsd_69859"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="4dp"
android:text="Move"
android:textColor="#FF333333"
android:textSize="12sp"
tools:ignore="HardcodedText,SmallSp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".simpledup.SimpleDupActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="36dp">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="65dp"
android:layout_height="match_parent">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@mipmap/dsf_5978897"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="DUPLICATE PICTURE"
android:textColor="#FF333333"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/fl_all"
android:layout_width="65dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:visibility="gone">
<ImageView
android:id="@+id/iv_all"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="20dp"
android:src="@mipmap/sldo_089"
tools:ignore="ContentDescription" />
</FrameLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ProgressBar
android:id="@+id/pb"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:indeterminate="true"
android:indeterminateTint="#5BBAFF"
android:indeterminateTintMode="src_atop"
android:visibility="invisible" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_dup"
tools:listitem="@layout/item_jo_dup_jo"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<FrameLayout
android:id="@+id/fl_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone">
<ImageView
android:layout_width="200dp"
android:layout_height="175dp"
android:layout_marginBottom="30dp"
android:src="@mipmap/sda_887965"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:text="The folder is empty"
android:textColor="#FF333333"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</FrameLayout>
<LinearLayout
android:id="@+id/fl_permission_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="96dp"
android:orientation="vertical"
android:visibility="gone">
<ImageView
android:layout_width="140dp"
android:layout_height="172dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/jaos_7986"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="66dp"
android:layout_marginTop="20dp"
android:gravity="center"
android:text="@string/permission_tip"
android:textColor="#FF666666"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_set"
android:layout_width="290dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginTop="28dp"
android:layout_marginBottom="5dp"
android:background="@drawable/bg_333333_corners"
android:gravity="center"
android:text="Set"
android:textColor="#FFFFFFFF"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
<TextView
android:id="@+id/tv_delete"
android:layout_width="290dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginTop="8dp"
android:layout_marginBottom="30dp"
android:background="@drawable/bg_333333_corners"
android:gravity="center"
android:text="Delete"
android:textColor="#FFFFFFFF"
android:textSize="17sp"
android:textStyle="bold"
android:visibility="gone"
tools:ignore="HardcodedText" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
android:layout_marginVertical="10dp"
app:cardCornerRadius="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:text="2 items"
android:textColor="#FF999999"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="end"
android:layout_margin="12dp"
android:src="@drawable/bg_grid_selector"
tools:ignore="ContentDescription" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="4"
tools:listitem="@layout/item_jo_i_jo_select" />
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="69dp"
android:layout_height="69dp"
android:layout_margin="8dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="end|bottom"
android:layout_margin="3dp"
android:src="@drawable/bg_grid_selector"
tools:ignore="ContentDescription" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_margin="6dp">
......@@ -7,7 +8,8 @@
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_camera"
......@@ -15,8 +17,8 @@
android:layout_height="24dp"
android:layout_gravity="center"
android:src="@mipmap/wkoe_41879"
android:visibility="invisible" />
android:visibility="invisible"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_selector"
......@@ -24,6 +26,7 @@
android:layout_height="30dp"
android:layout_gravity="end|bottom"
android:layout_margin="5dp"
android:src="@drawable/bg_grid_selector" />
android:src="@drawable/bg_grid_selector"
tools:ignore="ContentDescription" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
android:layout_marginTop="12dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
......@@ -16,6 +23,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:orientation="vertical">
......@@ -41,9 +49,22 @@
</LinearLayout>
<ImageView
android:id="@+id/iv_selector"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_margin="12dp"
android:src="@drawable/bg_list_selector" />
android:layout_marginStart="8dp"
android:src="@drawable/bg_list_selector"
tools:ignore="ContentDescription" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="40dp"
android:layout_marginTop="13dp"
android:layout_marginEnd="20dp"
android:background="#FFF4F4F4" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
app:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_file"
android:layout_width="90dp"
android:layout_height="40dp"
android:clickable="true"
android:focusable="true"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/tv_file"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:layout_weight="1"
android:text="File"
android:textColor="@drawable/textcolor_selector"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_file"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="3dp"
android:src="@drawable/bg_list_selector"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_image"
android:layout_width="90dp"
android:layout_height="40dp"
android:clickable="true"
android:focusable="true"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/tv_image"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:layout_weight="1"
android:text="Image"
android:textColor="@drawable/textcolor_selector"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_image"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="3dp"
android:src="@drawable/bg_list_selector"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_video"
android:layout_width="90dp"
android:layout_height="40dp"
android:clickable="true"
android:focusable="true"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/tv_video"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:layout_weight="1"
android:text="Video"
android:textColor="@drawable/textcolor_selector"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_video"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="3dp"
android:src="@drawable/bg_list_selector"
tools:ignore="ContentDescription" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
......@@ -29,6 +29,10 @@
android:id="@+id/simpleGridActivity"
android:name="com.zxhy.simplefilesmanager.simplegrid.SimpleGridActivity"
android:label="activity_simple_grid"
tools:layout="@layout/activity_simple_grid">
</activity>
tools:layout="@layout/activity_simple_grid" />
<activity
android:id="@+id/simpleListActivity"
android:name="com.zxhy.simplefilesmanager.simplelist.SimpleListActivity"
android:label="SimpleListActivity"
tools:layout="@layout/activity_simple_list" />
</navigation>
\ No newline at end of file
......@@ -2,4 +2,7 @@
<resources>
<dimen name="dp_24">24dp</dimen>
<dimen name="dp_8">8dp</dimen>
<dimen name="dp_5">5dp</dimen>
<dimen name="dp_94">94dp</dimen>
<dimen name="dp_124">124dp</dimen>
</resources>
\ No newline at end of file
......@@ -3,4 +3,5 @@
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="select_d_items">Select %d items</string>
<string name="permission_tip">There are no permissions We need to get permission to read all files.</string>
</resources>
\ No newline at end of file
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