Commit 29ea9ca7 authored by wanglei's avatar wanglei

aaa

parent b709b22c
...@@ -21,11 +21,26 @@ ...@@ -21,11 +21,26 @@
android:theme="@style/Theme.SimpleFilesManager" android:theme="@style/Theme.SimpleFilesManager"
tools:targetApi="31"> tools:targetApi="31">
<activity <activity
android:name=".simplelist.SimpleListActivity" android:name=".internalstorage.InternalStorageActivity"
android:exported="false" /> 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 <activity
android:name=".simplegrid.SimpleGridActivity" android:name=".simplegrid.SimpleGridActivity"
android:exported="false" /> android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity <activity
android:name=".JoLaunchjoActivity" android:name=".JoLaunchjoActivity"
android:exported="true" android:exported="true"
......
...@@ -80,13 +80,10 @@ class MainActivity : AppCompatActivity() { ...@@ -80,13 +80,10 @@ class MainActivity : AppCompatActivity() {
return true return true
} }
}) })
}
override fun onStart() {
super.onStart()
if (!jostorejoPermissionCheck()) { if (!jostorejoPermissionCheck()) {
jorequestjoStoreFollow(joActivityJoLauncher, disAgreeAction = {}, agreeAction = {}) 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() { ...@@ -88,4 +88,27 @@ abstract class SimpleCommonViewModel : ViewModel() {
onFinish.invoke(resultList) 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 package com.zxhy.simplefilesmanager.simpleadpter
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder 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.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
abstract class JoCommonJoAdapter<T : ViewHolder, E : JoFileJo>() : RecyclerView.Adapter<T>() { abstract class JoCommonJoAdapter<T : ViewHolder, E : JoFileJo>() : RecyclerView.Adapter<T>() {
val joFileList = arrayListOf<E>() 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 { override fun getItemCount(): Int {
return joFileList.size 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( ...@@ -11,6 +11,57 @@ abstract class JoFileJo(
var path: String = "" 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 { fun toFile(): File {
return File(path) return File(path)
} }
......
...@@ -15,11 +15,7 @@ class JoGridFileJo( ...@@ -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 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( class JoListFileJo(
val timeE: String = "", var timeE: String = "",
val sss: Int = 0, val sss: Int = 0,
) : JoFileJo() { ) : 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() { ...@@ -59,6 +59,46 @@ class SimpleFileFragment() : Fragment() {
} }
findNavController().navigate(R.id.simpleGridActivity, args) 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() { ...@@ -84,8 +84,8 @@ class SimpleGridActivity : AppCompatActivity() {
private fun onCompleteRefresh(list: List<JoGridFileJo>) = private fun onCompleteRefresh(list: List<JoGridFileJo>) =
lifecycleScope.launch(Dispatchers.Main) { lifecycleScope.launch(Dispatchers.Main) {
if (list.isNotEmpty()) {
binding.pb.visibility = View.GONE binding.pb.visibility = View.GONE
if (list.isNotEmpty()) {
binding.rv.visibility = View.VISIBLE binding.rv.visibility = View.VISIBLE
binding.flDelete.visibility = View.VISIBLE binding.flDelete.visibility = View.VISIBLE
adapter.addData(list) adapter.addData(list)
......
...@@ -2,6 +2,8 @@ package com.zxhy.simplefilesmanager.simplegrid ...@@ -2,6 +2,8 @@ package com.zxhy.simplefilesmanager.simplegrid
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel 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
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo.Companion.joGridFileJo import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo.Companion.joGridFileJo
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -9,17 +11,7 @@ import kotlinx.coroutines.launch ...@@ -9,17 +11,7 @@ import kotlinx.coroutines.launch
import java.io.File import java.io.File
class SimpleGridViewModel : SimpleCommonViewModel() { 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( fun loadImage(
onDo: (list: List<JoGridFileJo>) -> Unit, 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 package com.zxhy.simplefilesmanager.simplelist
import android.annotation.SuppressLint
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.widget.ImageView
import android.widget.PopupWindow
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.zxhy.simplefilesmanager.R import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ActivitySimpleListBinding import com.zxhy.simplefilesmanager.databinding.ActivitySimpleListBinding
import com.zxhy.simplefilesmanager.databinding.PopupwindowFileFilterBinding
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo.Companion.isImage
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo.Companion.isVideo
import com.zxhy.simplefilesmanager.simplegrid.SimpleGridAdapter
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 SimpleListActivity : AppCompatActivity() { class SimpleListActivity : AppCompatActivity() {
private lateinit var binding: ActivitySimpleListBinding private lateinit var binding: ActivitySimpleListBinding
private val viewModel: SimpleListViewModel by viewModels()
private lateinit var fileAdapter: SimpleListAdapter
private lateinit var imagerAdapter: SimpleGridAdapter
private lateinit var videoAdapter: SimpleGridAdapter
private var tittle: String = ""
private var listData = arrayListOf<JoListFileJo>()
private var canFilter = false
private var showFileRv = true
private var showImageRv = true
private var showVideoRv = true
private var fileSelectCount = 0
private var imageSelectCount = 0
private var videoSelectCount = 0
private lateinit var launcher: JoActivityJoLauncher
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
launcher = JoActivityJoLauncher(this)
binding = ActivitySimpleListBinding.inflate(layoutInflater) binding = ActivitySimpleListBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
...@@ -22,5 +59,246 @@ class SimpleListActivity : AppCompatActivity() { ...@@ -22,5 +59,246 @@ class SimpleListActivity : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets insets
} }
tittle = intent.extras?.getString("Tittle") ?: ""
binding.tvTittle.text = tittle
initAdapter()
if (!jostorejoPermissionCheck()) {
showPermissionSet()
} else {
loadData()
}
}
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
when (tittle) {
"AUDIO" -> {
canFilter = false
showFileRv = true
showImageRv = false
showVideoRv = false
viewModel.loadAudio(::onCompleteRefresh)
}
"LARGE FILE" -> {
canFilter = true
showFileRv = true
showImageRv = true
showVideoRv = true
viewModel.loadLargeFile(::onCompleteRefresh)
}
"EMPTY FILE" -> {
canFilter = false
showFileRv = true
showImageRv = false
showVideoRv = false
viewModel.loadEmptyFile(::onCompleteRefresh)
}
"ZIP" -> {
canFilter = false
showFileRv = true
showImageRv = false
showVideoRv = false
viewModel.loadZip(::onCompleteRefresh)
}
"APK" -> {
canFilter = false
showFileRv = true
showImageRv = false
showVideoRv = false
viewModel.loadApk(::onCompleteRefresh)
}
"DOCUMENT" -> {
canFilter = false
showFileRv = true
showImageRv = false
showVideoRv = false
viewModel.loadDocument(::onCompleteRefresh)
}
}
}
private fun initAdapter() {
fileAdapter = SimpleListAdapter(this) { _, count ->
fileSelectCount = count
showItemsCount()
}
binding.rvFile.adapter = fileAdapter
imagerAdapter = SimpleGridAdapter(isVideo = false, this, selectClick = { count ->
imageSelectCount = count
showItemsCount()
}, itemClick = {})
binding.rvImage.adapter = imagerAdapter
videoAdapter = SimpleGridAdapter(isVideo = true, this, selectClick = { count ->
videoSelectCount = count
showItemsCount()
}, itemClick = {})
binding.rvVideo.adapter = videoAdapter
binding.flFilter.setOnClickListener {
showFilterPopupWindow()
}
}
private fun showItemsCount() {
val count = fileSelectCount + imageSelectCount + videoSelectCount
binding.tvItems.text = this.getString(R.string.select_d_items, count)
if (count == 0) {
binding.tvDelete.visibility = View.GONE
} else {
binding.tvDelete.visibility = View.VISIBLE
binding.tvDelete.setOnClickListener {
val selectData = arrayListOf<JoFileJo>()
val selectFile =
if (binding.rvFile.isVisible) fileAdapter.getSelectData() else listOf()
selectData.addAll(selectFile)
val selectImage =
if (binding.rvImage.isVisible) imagerAdapter.getSelectData() else listOf()
selectData.addAll(selectImage)
val selectVideo =
if (binding.rvVideo.isVisible) videoAdapter.getSelectData() else listOf()
selectData.addAll(selectVideo)
viewModel.deleteFiles(selectData.map { it.toFile() }) {
lifecycleScope.launch(Dispatchers.Main) {
listData.removeAll(selectData.toSet())
showItemsCount()
switchUi()
} }
}
}
}
}
private fun onCompleteRefresh(list: List<JoListFileJo>) =
lifecycleScope.launch(Dispatchers.Main) {
binding.pb.visibility = View.GONE
if (list.isNotEmpty()) {
binding.tvItems.visibility = View.VISIBLE
listData = list as ArrayList<JoListFileJo>
if (canFilter) {
binding.flFilter.visibility = View.VISIBLE
}
binding.scrollContent.visibility = View.VISIBLE
switchUi()
} else {
binding.tvItems.visibility = View.INVISIBLE
binding.flEmpty.visibility = View.VISIBLE
}
}
private fun switchUi() {
val imageFile = listData.filter { it.isImage() }
val videoFile = listData.filter { it.isVideo() }
val file = listData.filter { !it.isVideo() && !it.isImage() }
val fileList = arrayListOf<JoListFileJo>()
if (showImageRv) {
binding.tvImage.visibility = View.VISIBLE
binding.rvImage.visibility = View.VISIBLE
imagerAdapter.setData(imageFile)
} else {
binding.tvImage.visibility = View.GONE
binding.rvImage.visibility = View.GONE
}
if (showVideoRv) {
binding.tvVideo.visibility = View.VISIBLE
binding.rvVideo.visibility = View.VISIBLE
videoAdapter.setData(videoFile)
} else {
binding.tvVideo.visibility = View.GONE
binding.rvVideo.visibility = View.GONE
}
if (showFileRv) {
binding.tvFile.visibility = View.VISIBLE
binding.rvFile.visibility = View.VISIBLE
fileList.addAll(file)
if (!showImageRv) fileList.addAll(imageFile)
if (!showVideoRv) fileList.addAll(videoFile)
fileAdapter.setData(file)
} else {
binding.tvFile.visibility = View.GONE
binding.rvFile.visibility = View.GONE
}
if (!showFileRv && !showVideoRv && !showImageRv) {
binding.tvItems.visibility = View.GONE
} else {
binding.tvItems.visibility = View.VISIBLE
}
}
@SuppressLint("ClickableViewAccessibility", "InflateParams")
private fun showFilterPopupWindow() {
val popupWindowView = layoutInflater.inflate(R.layout.popupwindow_file_filter, null)
val popupBinding = PopupwindowFileFilterBinding.bind(popupWindowView)
val width =
resources.getDimensionPixelSize(R.dimen.dp_94)
val height =
resources.getDimensionPixelSize(R.dimen.dp_124)
val popupWindow = PopupWindow(popupWindowView, width, height, true)
popupWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
popupWindow.isOutsideTouchable = true
popupWindow.isTouchable = true
popupWindow.showAsDropDown(binding.ivFilter, 0, 0)
popupBinding.tvFile.isSelected = showFileRv
popupBinding.ivFile.isSelected = showFileRv
popupBinding.tvImage.isSelected = showImageRv
popupBinding.ivImage.isSelected = showImageRv
popupBinding.tvVideo.isSelected = showVideoRv
popupBinding.ivVideo.isSelected = showVideoRv
popupBinding.llFile.setOnClickListener {
showFileRv = !showFileRv
popupBinding.tvFile.isSelected = showFileRv
popupBinding.ivFile.isSelected = showFileRv
popupWindow.dismiss()
switchUi()
}
popupBinding.llImage.setOnClickListener {
showImageRv = !showImageRv
popupBinding.tvImage.isSelected = showImageRv
popupBinding.ivImage.isSelected = showImageRv
popupWindow.dismiss()
switchUi()
}
popupBinding.llVideo.setOnClickListener {
showVideoRv = !showVideoRv
popupBinding.tvVideo.isSelected = showVideoRv
popupBinding.ivVideo.isSelected = showVideoRv
popupWindow.dismiss()
switchUi()
}
}
} }
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplelist package com.zxhy.simplefilesmanager.simplelist
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder 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.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
...@@ -12,39 +12,60 @@ import com.zxhy.simplefilesmanager.R ...@@ -12,39 +12,60 @@ import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ItemJoListFileJoBinding import com.zxhy.simplefilesmanager.databinding.ItemJoListFileJoBinding
import com.zxhy.simplefilesmanager.simpleadpter.JoCommonJoAdapter import com.zxhy.simplefilesmanager.simpleadpter.JoCommonJoAdapter
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo 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.DipPxEx
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
class SimpleListAdapter(val context: Context) : class SimpleListAdapter(
JoCommonJoAdapter<SimpleListAdapter.CC, JoListFileJo>() { val context: Context,
private val selectClick: (select: Boolean, count: Int) -> Unit
) : JoCommonJoAdapter<SimpleListAdapter.MultiCC, JoListFileJo>() {
private val options = private val options =
RequestOptions() RequestOptions()
.transform(CenterCrop(), RoundedCorners(DipPxEx.dp2px(context, R.dimen.dp_8))) .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) 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 data = joFileList[position]
val context = holder.binding.root.context
if (payloads.isEmpty()) { if (payloads.isEmpty()) {
Glide.with(context) bindIcon(data, holder.binding.iv)
.load(data.path) holder.binding.tvName.text = data.fName
.apply(options) val file = data.toFile()
.into(holder.binding.iv) 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 { } else {
holder.binding.root.setOnClickListener {
holder.binding.ivSelector.isSelected = data.isSelected
}
super.onBindViewHolder(holder, position, payloads) super.onBindViewHolder(holder, position, payloads)
} }
} }
} }
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplelist package com.zxhy.simplefilesmanager.simplelist
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import java.io.File 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() { 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( fun loadAudio(
onDo: (list: List<JoGridFileJo>) -> Unit, onFinish: (list: List<JoListFileJo>) -> Unit
onFinish: (list: List<JoGridFileJo>) -> Unit ) = loadFile(::isAudio, ::joListFileJo, onFinish)
) = loadFile(::isAudio, JoGridFileJo.Companion ::joGridFileJo, onDo, 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 package com.zxhy.simplefilesmanager.simplemanager
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
...@@ -7,6 +8,8 @@ import android.view.View ...@@ -7,6 +8,8 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.zxhy.simplefilesmanager.R import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.FragmentSimpleManagerBinding import com.zxhy.simplefilesmanager.databinding.FragmentSimpleManagerBinding
import com.zxhy.simplefilesmanager.simpledup.SimpleDupActivity
import com.zxhy.simplefilesmanager.simplelist.SimpleListActivity
class SimpleManagerFragment() : Fragment() { class SimpleManagerFragment() : Fragment() {
...@@ -26,6 +29,14 @@ class SimpleManagerFragment() : Fragment() { ...@@ -26,6 +29,14 @@ class SimpleManagerFragment() : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) 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"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main" android:id="@+id/main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".simplelist.SimpleListActivity"> android:orientation="vertical"
tools:context=".simplegrid.SimpleGridActivity">
</androidx.constraintlayout.widget.ConstraintLayout> <FrameLayout
\ No newline at end of file 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:textColor="#FF333333"
android:textSize="16sp"
android:textStyle="bold" />
<FrameLayout
android:id="@+id/fl_filter"
android:layout_width="65dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:visibility="gone">
<ImageView
android:id="@+id/iv_filter"
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" />
<ScrollView
android:id="@+id/scroll_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="24dp"
android:visibility="invisible">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_items"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top"
android:text="Select 0 items"
android:textColor="#FF999999"
android:textSize="12sp"
android:visibility="invisible"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_file"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="File"
android:textColor="#FF333333"
android:textSize="15sp"
android:textStyle="bold"
android:visibility="invisible"
tools:ignore="HardcodedText" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_file"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="8dp"
android:overScrollMode="never"
android:visibility="invisible"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_jo_list_file_jo" />
<TextView
android:id="@+id/tv_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="24dp"
android:text="Image"
android:textColor="#FF333333"
android:textSize="15sp"
android:textStyle="bold"
android:visibility="invisible"
tools:ignore="HardcodedText" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="8dp"
android:overScrollMode="never"
android:visibility="invisible"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:listitem="@layout/item_jo_i_v_jo_select" />
<TextView
android:id="@+id/tv_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="24dp"
android:text="Video"
android:textColor="#FF333333"
android:textSize="15sp"
android:textStyle="bold"
android:visibility="invisible"
tools:ignore="HardcodedText" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_video"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="8dp"
android:overScrollMode="never"
android:visibility="invisible"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:listitem="@layout/item_jo_i_v_jo_select" />
</LinearLayout>
</ScrollView>
<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>
<?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"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="100dp" android:layout_height="100dp"
android:layout_margin="6dp"> android:layout_margin="6dp">
...@@ -7,7 +8,8 @@ ...@@ -7,7 +8,8 @@
<ImageView <ImageView
android:id="@+id/iv" android:id="@+id/iv"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<ImageView <ImageView
android:id="@+id/iv_camera" android:id="@+id/iv_camera"
...@@ -15,8 +17,8 @@ ...@@ -15,8 +17,8 @@
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center" android:layout_gravity="center"
android:src="@mipmap/wkoe_41879" android:src="@mipmap/wkoe_41879"
android:visibility="invisible" /> android:visibility="invisible"
tools:ignore="ContentDescription" />
<ImageView <ImageView
android:id="@+id/iv_selector" android:id="@+id/iv_selector"
...@@ -24,6 +26,7 @@ ...@@ -24,6 +26,7 @@
android:layout_height="30dp" android:layout_height="30dp"
android:layout_gravity="end|bottom" android:layout_gravity="end|bottom"
android:layout_margin="5dp" android:layout_margin="5dp"
android:src="@drawable/bg_grid_selector" /> android:src="@drawable/bg_grid_selector"
tools:ignore="ContentDescription" />
</FrameLayout> </FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" 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_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal">
...@@ -16,6 +23,7 @@ ...@@ -16,6 +23,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical"> android:orientation="vertical">
...@@ -41,9 +49,22 @@ ...@@ -41,9 +49,22 @@
</LinearLayout> </LinearLayout>
<ImageView <ImageView
android:id="@+id/iv_selector"
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_margin="12dp" android:layout_marginStart="8dp"
android:src="@drawable/bg_list_selector" /> 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> </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 @@ ...@@ -29,6 +29,10 @@
android:id="@+id/simpleGridActivity" android:id="@+id/simpleGridActivity"
android:name="com.zxhy.simplefilesmanager.simplegrid.SimpleGridActivity" android:name="com.zxhy.simplefilesmanager.simplegrid.SimpleGridActivity"
android:label="activity_simple_grid" android:label="activity_simple_grid"
tools:layout="@layout/activity_simple_grid"> tools:layout="@layout/activity_simple_grid" />
</activity> <activity
android:id="@+id/simpleListActivity"
android:name="com.zxhy.simplefilesmanager.simplelist.SimpleListActivity"
android:label="SimpleListActivity"
tools:layout="@layout/activity_simple_list" />
</navigation> </navigation>
\ No newline at end of file
...@@ -2,4 +2,7 @@ ...@@ -2,4 +2,7 @@
<resources> <resources>
<dimen name="dp_24">24dp</dimen> <dimen name="dp_24">24dp</dimen>
<dimen name="dp_8">8dp</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> </resources>
\ No newline at end of file
...@@ -3,4 +3,5 @@ ...@@ -3,4 +3,5 @@
<!-- TODO: Remove or change this placeholder text --> <!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string> <string name="hello_blank_fragment">Hello blank fragment</string>
<string name="select_d_items">Select %d items</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> </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