Commit 282c9765 authored by wanglei's avatar wanglei

补充代码

parent 484a940f
...@@ -52,4 +52,5 @@ dependencies { ...@@ -52,4 +52,5 @@ dependencies {
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)
implementation(libs.androidx.navigation.fragment.ktx) implementation(libs.androidx.navigation.fragment.ktx)
implementation(libs.androidx.navigation.ui.ktx) implementation(libs.androidx.navigation.ui.ktx)
implementation(libs.glide)
} }
\ No newline at end of file
package com.zxhy.fastfilemanagerpro
import android.content.Context
import android.os.Environment
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako.Companion.koFileDatako
import com.zxhy.fastfilemanagerpro.kokotools.HelperTraverse
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import java.io.File
import kotlin.reflect.KFunction1
abstract class CommonViewModel : ViewModel() {
fun deleteFiles(files: List<File>, finishAction: () -> Unit) =
viewModelScope.launch(Dispatchers.IO) {
runCatching {
files.forEach {
if (it.exists()) {
it.delete()
}
}
}
finishAction.invoke()
}
fun loadFile(
context: Context,
filter: (file: File) -> Boolean,
onDo: (list: List<KoFileDatako>) -> Unit,
onFinish: (list: List<KoFileDatako>) -> Unit
) {
viewModelScope.launch(Dispatchers.IO) {
val root = Environment.getExternalStorageDirectory()
val resultList = arrayListOf<KoFileDatako>()
var firstSend = false
HelperTraverse.linkedLisTraverseFolder(root) { file ->
if (filter(file)) {
resultList.add(file.koFileDatako(context))
if (resultList.size == 20 && !firstSend) {
onDo.invoke(resultList)
resultList.clear()
firstSend = true
}
}
}
onFinish.invoke(resultList)
}
}
}
\ No newline at end of file
package com.zxhy.fastfilemanagerpro
import android.app.Application
import com.bumptech.glide.annotation.GlideModule
@GlideModule
class GlideApp : Application() {
}
\ No newline at end of file
package com.zxhy.fastfilemanagerpro.gridfile
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.zxhy.fastfilemanagerpro.R
import com.zxhy.fastfilemanagerpro.databinding.ItemKokoGridFileBinding
import com.zxhy.fastfilemanagerpro.kokoadapter.CommonAdapter
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako.Companion.isImage
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako.Companion.isVideo
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako.Companion.toFile
import com.zxhy.fastfilemanagerpro.kokotools.GlideHelper.loadImageView
import com.zxhy.fastfilemanagerpro.kokotools.XmlEx.inflate
class KoFileGridkoAdapter(
private val allSelect: (flag: Boolean) -> Unit
) : CommonAdapter<KoFileGridkoAdapter.KoFileGridkoViewHolder>() {
inner class KoFileGridkoViewHolder(view: View) : ViewHolder(view) {
val binding = ItemKokoGridFileBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): KoFileGridkoViewHolder {
return KoFileGridkoViewHolder(R.layout.item_koko_grid_file.inflate(parent))
}
override fun onBindViewHolder(holder: KoFileGridkoViewHolder, position: Int) {
}
override fun onBindViewHolder(
holder: KoFileGridkoViewHolder,
position: Int,
payloads: MutableList<Any>
) {
val context = holder.binding.root.context
val data = fileList[position]
if (payloads.isEmpty()) {
holder.binding.apply {
ivIcon.loadImageView(context, data.toFile())
if (data.isImage()) {
ivCamera.visibility = View.GONE
}
if (data.isVideo()) {
ivCamera.visibility = View.VISIBLE
}
ivSelector.isSelected = data.isSelect
ivSelector.setOnClickListener {
data.isSelect = !data.isSelect
notifyItemChanged(position, "局部刷新")
allSelect.invoke(fileList.all { it.isSelect })
}
}
} else {
holder.binding.apply {
ivSelector.isSelected = data.isSelect
}
super.onBindViewHolder(holder, position, payloads)
}
}
}
\ No newline at end of file
package com.zxhy.fastfilemanagerpro.gridfile package com.zxhy.fastfilemanagerpro.gridfile
import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.view.View
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.content.ContextCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import com.zxhy.fastfilemanagerpro.R import com.zxhy.fastfilemanagerpro.R
import com.zxhy.fastfilemanagerpro.databinding.ActivityKoGridFilekoBinding import com.zxhy.fastfilemanagerpro.databinding.ActivityKoGridFilekoBinding
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako.Companion.toFile
import com.zxhy.fastfilemanagerpro.kokotools.ActivityLauncher
import com.zxhy.fastfilemanagerpro.kokotools.permission.PermissionCheck.storePermissionCheck
import com.zxhy.fastfilemanagerpro.kokotools.permission.StorePermissionEx.requestStoreFollow
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class KoGridFilekoActivity : AppCompatActivity() { class KoGridFilekoActivity : AppCompatActivity() {
private lateinit var binding: ActivityKoGridFilekoBinding private lateinit var binding: ActivityKoGridFilekoBinding
private val viewModel: KoGridFilekoViewModel by viewModels()
private lateinit var activityLauncher: ActivityLauncher
private var tittle = ""
private lateinit var adapter: KoFileGridkoAdapter
private lateinit var context: Context
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
context = this
activityLauncher = ActivityLauncher(this)
binding = ActivityKoGridFilekoBinding.inflate(layoutInflater) binding = ActivityKoGridFilekoBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
...@@ -20,6 +42,119 @@ class KoGridFilekoActivity : AppCompatActivity() { ...@@ -20,6 +42,119 @@ class KoGridFilekoActivity : 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
adapter = KoFileGridkoAdapter {
binding.ivAllSelector.isSelected = it
enableDelete()
}
binding.rv.adapter=adapter
binding.ivAllSelector.setOnClickListener {
it.isSelected = !it.isSelected
adapter.toggleSelect(it.isSelected)
enableDelete()
}
binding.ivBack.setOnClickListener {
finish()
}
if (storePermissionCheck()) {
showPermissionSet(false)
loadListFile()
} else {
showPermissionSet(true)
}
}
//region
fun showOperationResult() = lifecycleScope.launch(Dispatchers.Main) {
binding.llResult.visibility = View.VISIBLE
delay(500)
binding.llResult.visibility = View.GONE
}
fun showPermissionSet(show: Boolean) {
if (show) {
binding.clContent.visibility = View.GONE
binding.clPermissionSet.visibility = View.VISIBLE
binding.tvSet.setOnClickListener {
requestStoreFollow(activityLauncher, disAgreeAction = {
showPermissionSet(true)
}, agreeAction = {
showPermissionSet(false)
loadListFile()
})
}
} else {
binding.clContent.visibility = View.VISIBLE
binding.clPermissionSet.visibility = View.GONE
}
}
fun enableDelete() {
val enable = adapter.getSelectData().isNotEmpty()
binding.tvDelete.isEnabled = enable
if (enable) {
binding.tvDelete.background =
ContextCompat.getDrawable(context, R.drawable.bg_ffff6767_corners)
binding.tvDelete.setTextColor(ContextCompat.getColor(context, R.color.white))
binding.tvDelete.setOnClickListener {
deleteFiles()
}
} else {
binding.tvDelete.background =
ContextCompat.getDrawable(context, R.drawable.bg_fff4f4f4_corners)
binding.tvDelete.setTextColor(ContextCompat.getColor(context, R.color.color_999999))
binding.tvDelete.setOnClickListener {}
}
}
private fun deleteFiles() {
val selectData = adapter.getSelectData()
val files = selectData.map { it.toFile() }
viewModel.deleteFiles(files) {
lifecycleScope.launch(Dispatchers.Main) {
showOperationResult()
adapter.removeData(selectData)
showEmptyList()
enableDelete()
}
}
}
private fun showEmptyList() {
if (adapter.itemCount == 0) {
binding.clEmpty.visibility = View.VISIBLE
binding.clShowContent.visibility = View.GONE
binding.llAll.visibility = View.GONE
} else {
binding.clEmpty.visibility = View.GONE
binding.clShowContent.visibility = View.VISIBLE
binding.llAll.visibility = View.VISIBLE
}
}
private fun onDoList(list: List<KoFileDatako>) = lifecycleScope.launch(Dispatchers.Main) {
adapter.setData(list)
}
@SuppressLint("SetTextI18n")
private fun onFinishList(list: List<KoFileDatako>) = lifecycleScope.launch(Dispatchers.Main) {
adapter.setData(list)
showEmptyList()
enableDelete()
binding.tvItems.text = "total:${adapter.itemCount} items"
}
//endregion
private fun loadListFile() {
when (tittle) {
IMAGE_FILE -> viewModel.loadImageFile(context, ::onDoList, ::onFinishList)
VIDEO_FILE -> viewModel.loadVideoFile(context, ::onDoList, ::onFinishList)
}
} }
companion object { companion object {
......
package com.zxhy.fastfilemanagerpro.gridfile
import android.content.Context
import com.zxhy.fastfilemanagerpro.CommonViewModel
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako
import java.io.File
class KoGridFilekoViewModel : CommonViewModel() {
fun isImageFilter(file: File): Boolean {
return file.name.contains(".jpg") or
file.name.contains(".png") or
file.name.contains(".gif")
}
fun isVideoFilter(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 loadImageFile(
context: Context,
onDo: (list: List<KoFileDatako>) -> Unit,
onFinish: (list: List<KoFileDatako>) -> Unit
) {
loadFile(context, filter = (::isImageFilter),
onDo = { list ->
onDo.invoke(list)
},
onFinish = { list ->
onFinish.invoke(list)
}
)
}
fun loadVideoFile(
context: Context,
onDo: (list: List<KoFileDatako>) -> Unit,
onFinish: (list: List<KoFileDatako>) -> Unit
) {
loadFile(context, filter = (::isVideoFilter),
onDo = { list ->
onDo.invoke(list)
},
onFinish = { list ->
onFinish.invoke(list)
}
)
}
}
\ No newline at end of file
...@@ -14,6 +14,19 @@ data class KoFileDatako( ...@@ -14,6 +14,19 @@ data class KoFileDatako(
val sizeF: String = "" val sizeF: String = ""
) { ) {
companion object { companion object {
fun KoFileDatako.isImage(): Boolean {
return name.contains(".jpg") or name.contains(".png") or name.contains(".gif")
}
fun KoFileDatako.isVideo(): Boolean {
return name.contains(".mp4") or
name.contains(".avi") or
name.contains(".flv") or
name.contains(".rmvb") or
name.contains(".mkv")
}
fun KoFileDatako.toFile(): File { fun KoFileDatako.toFile(): File {
return File(path) return File(path)
} }
......
...@@ -148,7 +148,7 @@ class KoListFilekoActivity : AppCompatActivity() { ...@@ -148,7 +148,7 @@ class KoListFilekoActivity : AppCompatActivity() {
adapter.setData(list) adapter.setData(list)
showEmptyList() showEmptyList()
enableDelete() enableDelete()
binding.tvTittle.text = "total:${adapter.itemCount} items" binding.tvItems.text = "total:${adapter.itemCount} items"
} }
......
...@@ -4,6 +4,7 @@ import android.content.Context ...@@ -4,6 +4,7 @@ import android.content.Context
import android.os.Environment import android.os.Environment
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.zxhy.fastfilemanagerpro.CommonViewModel
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako
import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako.Companion.koFileDatako import com.zxhy.fastfilemanagerpro.kokodata.KoFileDatako.Companion.koFileDatako
import com.zxhy.fastfilemanagerpro.kokotools.HelperTraverse.linkedLisTraverseFolder import com.zxhy.fastfilemanagerpro.kokotools.HelperTraverse.linkedLisTraverseFolder
...@@ -13,7 +14,7 @@ import kotlinx.coroutines.launch ...@@ -13,7 +14,7 @@ import kotlinx.coroutines.launch
import java.io.File import java.io.File
import kotlin.reflect.KFunction1 import kotlin.reflect.KFunction1
class KoListFilekoViewModel : ViewModel() { class KoListFilekoViewModel : CommonViewModel() {
fun isEmptyFilter(file: File): Boolean { fun isEmptyFilter(file: File): Boolean {
...@@ -25,23 +26,33 @@ class KoListFilekoViewModel : ViewModel() { ...@@ -25,23 +26,33 @@ class KoListFilekoViewModel : ViewModel() {
} }
fun isAudioFilter(file: File): Boolean { fun isAudioFilter(file: File): Boolean {
return file.length() >= 10 * 1024 * 1024L return file.name.contains(".mp3") or
file.name.contains(".aac") or
file.name.contains(".ogg") or
file.name.contains(".aac")
} }
fun isLogFilter(file: File): Boolean { fun isLogFilter(file: File): Boolean {
return file.length() >= 10 * 1024 * 1024L return file.name.contains("log") or file.name.contains("Log")
} }
fun isZipFilter(file: File): Boolean { fun isZipFilter(file: File): Boolean {
return file.length() >= 10 * 1024 * 1024L return file.name.contains(".zip") or file.name.contains(".7z")
} }
fun isApkFilter(file: File): Boolean { fun isApkFilter(file: File): Boolean {
return file.length() >= 10 * 1024 * 1024L return file.name.contains(".apk")
} }
fun isDocumentsFilter(file: File): Boolean { fun isDocumentsFilter(file: File): Boolean {
return file.length() >= 10 * 1024 * 1024L 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 loadEmptyFile( fun loadEmptyFile(
...@@ -150,45 +161,4 @@ class KoListFilekoViewModel : ViewModel() { ...@@ -150,45 +161,4 @@ class KoListFilekoViewModel : ViewModel() {
) )
} }
private fun loadFile(
context: Context,
filter: (file: File) -> Boolean,
onDo: (list: List<KoFileDatako>) -> Unit,
onFinish: (list: List<KoFileDatako>) -> Unit
) {
viewModelScope.launch(Dispatchers.IO) {
val root = Environment.getExternalStorageDirectory()
val resultList = arrayListOf<KoFileDatako>()
var firstSend = false
linkedLisTraverseFolder(root) { file ->
if (filter(file)) {
resultList.add(file.koFileDatako(context))
if (resultList.size == 20 && !firstSend) {
onDo.invoke(resultList)
resultList.clear()
firstSend = true
}
}
}
onFinish.invoke(resultList)
}
}
fun deleteFiles(files: List<File>, finishAction: () -> Unit) =
viewModelScope.launch(Dispatchers.IO) {
runCatching {
files.forEach {
if (it.exists()) {
it.delete()
}
}
}
finishAction.invoke()
}
} }
\ No newline at end of file
...@@ -5,8 +5,16 @@ import androidx.fragment.app.Fragment ...@@ -5,8 +5,16 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.zxhy.fastfilemanagerpro.R import com.zxhy.fastfilemanagerpro.R
import com.zxhy.fastfilemanagerpro.databinding.FragmentKoManagerkoBinding import com.zxhy.fastfilemanagerpro.databinding.FragmentKoManagerkoBinding
import com.zxhy.fastfilemanagerpro.gridfile.KoGridFilekoActivity.Companion.IMAGE_FILE
import com.zxhy.fastfilemanagerpro.gridfile.KoGridFilekoActivity.Companion.VIDEO_FILE
import com.zxhy.fastfilemanagerpro.kokolistfile.KoListFilekoActivity.Companion.APK_FILE
import com.zxhy.fastfilemanagerpro.kokolistfile.KoListFilekoActivity.Companion.AUDIO_FILE
import com.zxhy.fastfilemanagerpro.kokolistfile.KoListFilekoActivity.Companion.DOCUMENTS_FILE
import com.zxhy.fastfilemanagerpro.kokolistfile.KoListFilekoActivity.Companion.LOG_FILE
import com.zxhy.fastfilemanagerpro.kokolistfile.KoListFilekoActivity.Companion.ZIP_FILE
class KoManagerkoFragment : Fragment() { class KoManagerkoFragment : Fragment() {
...@@ -27,10 +35,48 @@ class KoManagerkoFragment : Fragment() { ...@@ -27,10 +35,48 @@ class KoManagerkoFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
} binding.llImage.setOnClickListener {
val bundle = Bundle().apply {
companion object{ putString("Tittle", IMAGE_FILE)
}
findNavController().navigate(R.id.koGridFilekoActivity, bundle)
}
binding.llVideo.setOnClickListener {
val bundle = Bundle().apply {
putString("Tittle", VIDEO_FILE)
}
findNavController().navigate(R.id.koGridFilekoActivity, bundle)
}
binding.llAudio.setOnClickListener {
val bundle = Bundle().apply {
putString("Tittle", AUDIO_FILE)
}
findNavController().navigate(R.id.koListFilekoActivity, bundle)
}
binding.llLogFile.setOnClickListener {
val bundle = Bundle().apply {
putString("Tittle", LOG_FILE)
}
findNavController().navigate(R.id.koListFilekoActivity, bundle)
}
binding.llZip.setOnClickListener {
val bundle = Bundle().apply {
putString("Tittle", ZIP_FILE)
}
findNavController().navigate(R.id.koListFilekoActivity, bundle)
}
binding.llApk.setOnClickListener {
val bundle = Bundle().apply {
putString("Tittle", APK_FILE)
}
findNavController().navigate(R.id.koListFilekoActivity, bundle)
}
binding.llDocuments.setOnClickListener {
val bundle = Bundle().apply {
putString("Tittle", DOCUMENTS_FILE)
}
findNavController().navigate(R.id.koListFilekoActivity, bundle)
}
} }
} }
\ No newline at end of file
package com.zxhy.fastfilemanagerpro.kokotools
import android.content.Context
import android.widget.ImageView
import com.bumptech.glide.Glide
import java.io.File
object GlideHelper {
fun ImageView.loadImageView(context: Context, file: File) {
Glide.with(context).load(file).centerCrop().into(this)
}
}
\ 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:drawable="@mipmap/dda_026336" android:state_selected="false" />
<item android:drawable="@mipmap/d_998989" android:state_selected="true" />
</selector>
\ No newline at end of file
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
tools:ignore="UseCompoundDrawables"> tools:ignore="UseCompoundDrawables">
<ImageView <ImageView
android:id="@+id/iv_back"
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"
...@@ -82,8 +83,7 @@ ...@@ -82,8 +83,7 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_show_content" android:id="@+id/cl_show_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:visibility="gone">
<TextView <TextView
android:id="@+id/tv_items" android:id="@+id/tv_items"
...@@ -103,6 +103,7 @@ ...@@ -103,6 +103,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="20dp" android:layout_marginEnd="20dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/tv_items" app:layout_constraintBottom_toBottomOf="@id/tv_items"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_items" app:layout_constraintTop_toTopOf="@id/tv_items"
...@@ -118,6 +119,7 @@ ...@@ -118,6 +119,7 @@
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<ImageView <ImageView
android:id="@+id/iv_all_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"
...@@ -127,14 +129,16 @@ ...@@ -127,14 +129,16 @@
</LinearLayout> </LinearLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:layout_width="0dp" android:id="@+id/rv"
android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginVertical="8dp" android:layout_marginVertical="8dp"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toTopOf="@id/tv_delete"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_items" /> app:layout_constraintTop_toBottomOf="@id/tv_items"
app:spanCount="4" />
<TextView <TextView
android:id="@+id/tv_delete" android:id="@+id/tv_delete"
...@@ -151,6 +155,41 @@ ...@@ -151,6 +155,41 @@
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_000000_corners"
android:orientation="horizontal"
android:paddingVertical="8dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="20dp"
android:layout_marginEnd="8dp"
android:src="@mipmap/dd_899900"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_operation_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:singleLine="true"
android:text="Delete successful!"
android:textColor="#FFFFFF"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
...@@ -188,6 +227,7 @@ ...@@ -188,6 +227,7 @@
app:layout_constraintTop_toBottomOf="@id/iv_lock" /> app:layout_constraintTop_toBottomOf="@id/iv_lock" />
<TextView <TextView
android:id="@+id/tv_set"
android:layout_width="270dp" android:layout_width="270dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
......
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
app:layout_constraintTop_toBottomOf="@id/tv_Folder"> app:layout_constraintTop_toBottomOf="@id/tv_Folder">
<LinearLayout <LinearLayout
android:id="@+id/ll_image"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start" android:layout_gravity="start"
...@@ -89,6 +90,7 @@ ...@@ -89,6 +90,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/ll_video"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
...@@ -114,6 +116,7 @@ ...@@ -114,6 +116,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/ll_audio"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end" android:layout_gravity="end"
...@@ -150,6 +153,7 @@ ...@@ -150,6 +153,7 @@
app:layout_constraintTop_toBottomOf="@id/fl_1"> app:layout_constraintTop_toBottomOf="@id/fl_1">
<LinearLayout <LinearLayout
android:id="@+id/ll_log_file"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start" android:layout_gravity="start"
...@@ -175,6 +179,7 @@ ...@@ -175,6 +179,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/ll_zip"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
...@@ -200,6 +205,7 @@ ...@@ -200,6 +205,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/ll_apk"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end" android:layout_gravity="end"
...@@ -230,18 +236,18 @@ ...@@ -230,18 +236,18 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start" android:layout_gravity="start"
android:layout_marginTop="20dp"
android:layout_marginStart="-10dp" android:layout_marginStart="-10dp"
android:layout_marginTop="20dp"
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintStart_toStartOf="@id/fl_2" app:layout_constraintStart_toStartOf="@id/fl_2"
app:layout_constraintTop_toBottomOf="@id/fl_2" app:layout_constraintTop_toBottomOf="@id/fl_2"
tools:ignore="UseCompoundDrawables"> tools:ignore="UseCompoundDrawables">
<ImageView <ImageView
android:src="@mipmap/qwe_889989"
android:layout_width="45dp" android:layout_width="45dp"
android:layout_height="45dp" android:layout_height="45dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:src="@mipmap/qwe_889989"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
......
<?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="70dp"
android:layout_margin="8dp"
android:layout_height="70dp"
app:cardCornerRadius="8dp">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_camera"
android:layout_width="20dp"
android:layout_height="16dp"
android:layout_gravity="center"
android:src="@mipmap/cc_87897"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="end|bottom"
android:layout_margin="4dp"
android:src="@drawable/bg_grid_file_selector"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
\ No newline at end of file
...@@ -13,6 +13,9 @@ ...@@ -13,6 +13,9 @@
<action <action
android:id="@+id/action_koManagerkoFragment_to_koHomekoFragment" android:id="@+id/action_koManagerkoFragment_to_koHomekoFragment"
app:destination="@id/koHomekoFragment" /> app:destination="@id/koHomekoFragment" />
<action
android:id="@+id/action_koManagerkoFragment_to_koGridFilekoActivity"
app:destination="@id/koGridFilekoActivity" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/koHomekoFragment" android:id="@+id/koHomekoFragment"
...@@ -31,4 +34,9 @@ ...@@ -31,4 +34,9 @@
android:name="com.zxhy.fastfilemanagerpro.kokolistfile.KoListFilekoActivity" android:name="com.zxhy.fastfilemanagerpro.kokolistfile.KoListFilekoActivity"
android:label="activity_ko_list_fileko" android:label="activity_ko_list_fileko"
tools:layout="@layout/activity_ko_list_fileko" /> tools:layout="@layout/activity_ko_list_fileko" />
<activity
android:id="@+id/koGridFilekoActivity"
android:name="com.zxhy.fastfilemanagerpro.gridfile.KoGridFilekoActivity"
android:label="activity_ko_grid_fileko"
tools:layout="@layout/activity_ko_grid_fileko" />
</navigation> </navigation>
\ No newline at end of file
...@@ -13,6 +13,7 @@ activityKtx = "1.6.2" ...@@ -13,6 +13,7 @@ activityKtx = "1.6.2"
fragmentKtx = "1.6.2" fragmentKtx = "1.6.2"
navigationFragmentKtx = "2.7.7" navigationFragmentKtx = "2.7.7"
navigationUiKtx = "2.7.7" navigationUiKtx = "2.7.7"
glide = "4.16.0"
[libraries] [libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
...@@ -27,6 +28,7 @@ androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", ve ...@@ -27,6 +28,7 @@ androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", ve
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtx" } androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtx" }
androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtx" } androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtx" }
glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" }
[plugins] [plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" } androidApplication = { id = "com.android.application", version.ref = "agp" }
......
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