Commit 904f996d authored by wanglei's avatar wanglei

补齐多种类型文件

parents 28177901 aa4eb488
...@@ -9,12 +9,9 @@ ...@@ -9,12 +9,9 @@
android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32" android:maxSdkVersion="32"
tools:ignore="ScopedStorage" /> tools:ignore="ScopedStorage" />
<uses-permission <uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" /> tools:ignore="ScopedStorage" /> <!-- https://developer.android.com/about/versions/14/changes/partial-photo-video-access?hl=zh-cn -->
<!-- https://developer.android.com/about/versions/14/changes/partial-photo-video-access?hl=zh-cn -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" /> <uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<uses-permission <uses-permission
android:name="android.permission.READ_MEDIA_IMAGES" android:name="android.permission.READ_MEDIA_IMAGES"
...@@ -33,6 +30,13 @@ ...@@ -33,6 +30,13 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.HFileManagerMaster" android:theme="@style/Theme.HFileManagerMaster"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name="com.zxhy.hfilemanagermaster.image.ImageShowActivity"
android:exported="false"
android:launchMode="singleTop" />
<activity
android:name="com.zxhy.hfilemanagermaster.filebrowse.FileBrowseActivity"
android:exported="false" />
<activity <activity
android:name="com.zxhy.hfilemanagermaster.internalstorage.InternalStorageActivity" android:name="com.zxhy.hfilemanagermaster.internalstorage.InternalStorageActivity"
android:exported="false" /> android:exported="false" />
...@@ -62,23 +66,16 @@ ...@@ -62,23 +66,16 @@
<activity <activity
android:name="com.zxhy.hfilemanagermaster.OverviewActivity" android:name="com.zxhy.hfilemanagermaster.OverviewActivity"
android:exported="true" android:exported="true"
android:launchMode="singleTop"> android:launchMode="singleTop" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity <activity
android:name="com.zxhy.hfilemanagermaster.HLaunchActivity" android:name="com.zxhy.hfilemanagermaster.HLaunchActivity"
android:exported="true"> android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!-- <intent-filter> --> <category android:name="android.intent.category.LAUNCHER" />
<!-- <action android:name="android.intent.action.MAIN" /> --> </intent-filter>
<!-- <category android:name="android.intent.category.LAUNCHER" /> -->
<!-- </intent-filter> -->
</activity> </activity>
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
......
package com.zxhy.hfilemanagermaster
import android.app.Application
class MyApplication: Application() {
override fun onCreate() {
super.onCreate()
}
}
\ No newline at end of file
package com.zxhy.hfilemanagermaster.data package com.zxhy.hfilemanagermaster.data
import android.content.Context
import android.net.Uri import android.net.Uri
import android.text.format.Formatter
import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
const val MediaDataC_TYPE_IMAGE = 101 const val MediaDataC_TYPE_IMAGE = 101
const val MediaDataC_TYPE_VIDEO = 102 const val MediaDataC_TYPE_VIDEO = 102
...@@ -15,3 +20,18 @@ data class MediaDataC( ...@@ -15,3 +20,18 @@ data class MediaDataC(
val md5: String = "", val md5: String = "",
var select: Boolean = false, var select: Boolean = false,
) )
fun File.file2MediaDataC(context: Context): MediaDataC {
return try {
val sizeS = Formatter.formatFileSize(context, length())
val timeE = SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH).format(lastModified())
MediaDataC(
name = name,
size = sizeS,
time = timeE,
path = absolutePath
)
} catch (e: Exception) {
MediaDataC()
}
}
\ No newline at end of file
package com.zxhy.hfilemanagermaster.dialog
import android.content.Context
import android.view.LayoutInflater
import androidx.appcompat.app.AlertDialog
import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.DialogFileNameBinding
fun Context.showFileNameDialog(
tittle: String = "",
sureAction: (name: String) -> Unit,
dismissAction: () -> Unit
) {
val binding = DialogFileNameBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).setView(binding.root).create()
dialog.show()
dialog.setCanceledOnTouchOutside(false)
//修改dialog的尺寸
val lp = dialog.window?.attributes
lp?.width = this.resources.getDimensionPixelOffset(R.dimen.dp_255)
lp?.height = this.resources.getDimensionPixelOffset(R.dimen.dp_177)
dialog.window?.attributes = lp
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
dialog.window?.setDimAmount(0f)
binding.tvTittle.text = tittle
binding.tvSure.setOnClickListener {
sureAction.invoke(binding.etName.text.toString())
}
binding.ivCancel.setOnClickListener {
dialog.dismiss()
}
dialog.setOnCancelListener { dismissAction.invoke() }
}
package com.zxhy.hfilemanagermaster.dialog
import android.app.Dialog
import android.content.Context
import android.view.LayoutInflater
import android.view.animation.Animation
import android.view.animation.LinearInterpolator
import android.view.animation.RotateAnimation
import androidx.appcompat.app.AlertDialog
import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.DialogLoadingBinding
fun Context.showLoadingDialog(): Dialog {
val binding = DialogLoadingBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).setView(binding.root).create()
dialog.show()
dialog.setCanceledOnTouchOutside(false)
//修改dialog的尺寸
val lp = dialog.window?.attributes
lp?.width = this.resources.getDimensionPixelOffset(R.dimen.dp_255)
lp?.height = this.resources.getDimensionPixelOffset(R.dimen.dp_177)
dialog.window?.attributes = lp
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
// dialog.window?.setDimAmount(0f)
// 添加旋转动画
val rotateAnimation = RotateAnimation(
0f, 360f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f
)
rotateAnimation.duration = 1000
rotateAnimation.interpolator = LinearInterpolator()
rotateAnimation.repeatCount = Animation.INFINITE
binding.ivLoading.startAnimation(rotateAnimation)
return dialog
}
\ No newline at end of file
package com.zxhy.hfilemanagermaster.dialog
import android.app.Dialog
import android.content.Context
import android.view.LayoutInflater
import androidx.annotation.DrawableRes
import androidx.appcompat.app.AlertDialog
import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.DialogOperationBinding
fun Context.showOperationDialog(
@DrawableRes imageRes: Int,
tips: String = "",
dismissAction: () -> Unit
): Dialog {
val binding = DialogOperationBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).setView(binding.root).create()
dialog.show()
dialog.setCanceledOnTouchOutside(true)
//修改dialog的尺寸
val lp = dialog.window?.attributes
lp?.width = this.resources.getDimensionPixelOffset(R.dimen.dp_150)
lp?.height = this.resources.getDimensionPixelOffset(R.dimen.dp_120)
dialog.window?.attributes = lp
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
dialog.window?.setDimAmount(0f)
binding.iv.setImageResource(imageRes)
binding.tv.text = tips
dialog.setOnCancelListener { dismissAction.invoke() }
return dialog
}
\ No newline at end of file
...@@ -144,6 +144,16 @@ class DupImageAdapter( ...@@ -144,6 +144,16 @@ class DupImageAdapter(
} }
return i return i
} }
fun getSelectData(): ArrayList<MediaDataC> {
val list = arrayListOf<MediaDataC>()
dupImageList.forEach {
it.dupList.forEach { mediaDataC ->
if (mediaDataC.select) list.add(mediaDataC)
}
}
return list
}
} }
private class DupImageItemAdapter( private class DupImageItemAdapter(
......
package com.zxhy.hfilemanagermaster.duplicate package com.zxhy.hfilemanagermaster.duplicate
import android.app.AlertDialog
import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
...@@ -10,11 +12,16 @@ import androidx.lifecycle.lifecycleScope ...@@ -10,11 +12,16 @@ import androidx.lifecycle.lifecycleScope
import com.example.hfilemanagermaster.R import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ActivityDupPictureBinding import com.example.hfilemanagermaster.databinding.ActivityDupPictureBinding
import com.zxhy.hfilemanagermaster.data.DupImageData import com.zxhy.hfilemanagermaster.data.DupImageData
import com.zxhy.hfilemanagermaster.dialog.showOperationDialog
import com.zxhy.hfilemanagermaster.knife.deleteDirectory
import com.zxhy.hfilemanagermaster.knife.dupImage import com.zxhy.hfilemanagermaster.knife.dupImage
import com.zxhy.hfilemanagermaster.knife.getDupImageList import com.zxhy.hfilemanagermaster.knife.getDupImageList
import com.zxhy.hfilemanagermaster.knife.toast
import com.zxhy.hfilemanagermaster.permission.alert import com.zxhy.hfilemanagermaster.permission.alert
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File
class DupPictureActivity : AppCompatActivity() { class DupPictureActivity : AppCompatActivity() {
private lateinit var binding: ActivityDupPictureBinding private lateinit var binding: ActivityDupPictureBinding
...@@ -43,11 +50,16 @@ class DupPictureActivity : AppCompatActivity() { ...@@ -43,11 +50,16 @@ class DupPictureActivity : AppCompatActivity() {
binding.tvDelete.setOnClickListener { binding.tvDelete.setOnClickListener {
val num = adapter.getSelectNum() val num = adapter.getSelectNum()
if (num == 0) return@setOnClickListener if (num == 0) return@setOnClickListener
this.alert("当前选中${num}项,是否确认删除", "删除确认") { this.alert(
positiveButton("确定") { dialog -> "Currently selected $num items, are you sure to delete them",
"Delete Confirm"
) {
positiveButton("sure") { dialog ->
val data = adapter.getSelectData().map { File(it.path) }
deleteFiles(data)
dialog.dismiss() dialog.dismiss()
} }
negativeButton("取消") { dialog -> negativeButton("cancel") { dialog ->
dialog.dismiss() dialog.dismiss()
} }
//禁止取消 //禁止取消
...@@ -59,6 +71,29 @@ class DupPictureActivity : AppCompatActivity() { ...@@ -59,6 +71,29 @@ class DupPictureActivity : AppCompatActivity() {
loadData() loadData()
} }
private fun deleteFiles(files: List<File>) = Thread {
try {
files.forEach {
if (it.exists()) {
if (it.isFile) it.delete() else deleteDirectory(it)
}
}
runOnUiThread {
lifecycleScope.launch(Dispatchers.Main) {
val dialog = showOperationDialog(R.mipmap.dads_889562, "delete success!") {}
delay(200)
dialog.dismiss()
}
}
loadData()
} catch (e: Exception) {
e.printStackTrace()
runOnUiThread {
toast("delete failed")
}
}
}.start()
private fun loadData() { private fun loadData() {
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
val list = dupImage() val list = dupImage()
......
package com.zxhy.hfilemanagermaster.emptyfile package com.zxhy.hfilemanagermaster.emptyfile
import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import android.view.View
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat 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.example.hfilemanagermaster.R import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ActivityEmptyFileBinding import com.example.hfilemanagermaster.databinding.ActivityEmptyFileBinding
import com.zxhy.hfilemanagermaster.dialog.showOperationDialog
import com.zxhy.hfilemanagermaster.knife.deleteDirectory
import com.zxhy.hfilemanagermaster.knife.emptyFile
import com.zxhy.hfilemanagermaster.knife.toast
import com.zxhy.hfilemanagermaster.permission.IntentLauncher
import com.zxhy.hfilemanagermaster.permission.PermissionLauncher
import com.zxhy.hfilemanagermaster.permission.alert
import com.zxhy.hfilemanagermaster.permission.requestStoreFollow
import com.zxhy.hfilemanagermaster.permission.settingManageExternalStorage
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
class EmptyFileActivity : AppCompatActivity() { class EmptyFileActivity : AppCompatActivity() {
private lateinit var binding: ActivityEmptyFileBinding private lateinit var binding: ActivityEmptyFileBinding
private lateinit var intentLauncher: IntentLauncher
private lateinit var permissionLauncher: PermissionLauncher
private lateinit var emptyFileAdapter: EmptyFileAdapter
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
intentLauncher = IntentLauncher(this)
permissionLauncher = PermissionLauncher(this)
binding = ActivityEmptyFileBinding.inflate(layoutInflater) binding = ActivityEmptyFileBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
...@@ -26,5 +49,118 @@ class EmptyFileActivity : AppCompatActivity() { ...@@ -26,5 +49,118 @@ class EmptyFileActivity : AppCompatActivity() {
binding.ivArrow.setOnClickListener { binding.ivArrow.setOnClickListener {
finish() finish()
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
fileMode()
} else {
lockMode()
}
} else {
fileMode()
}
}
private fun loadEmptyFile() = Thread {
val list = emptyFile(this)
runOnUiThread {
emptyFileAdapter.setData(list)
}
}.start()
private fun lockMode() {
binding.clLock.visibility = View.VISIBLE
binding.rv.visibility = View.INVISIBLE
binding.ivAll.visibility = View.GONE
binding.tvAll.visibility = View.GONE
binding.tvSet.setOnClickListener {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) {
val uri = Uri.parse("package:$packageName")
val intent = settingManageExternalStorage(uri)
intentLauncher.launch(intent) {
val flag = Environment.isExternalStorageManager()
if (flag) {
fileMode()
// toast("已设置额外储存管理")
} else {
// toast("未设置额外储存管理")
lockMode()
}
}
} else {
// toast("已设置额外储存管理")
fileMode()
}
} else {
requestStoreFollow(permissionLauncher, intentLauncher) { fileMode() }
}
}
} }
private fun fileMode() {
binding.clLock.visibility = View.GONE
binding.rv.visibility = View.VISIBLE
binding.ivAll.visibility = View.VISIBLE
binding.tvAll.visibility = View.VISIBLE
emptyFileAdapter = EmptyFileAdapter {
binding.ivAll.isSelected = it
}
binding.rv.adapter = emptyFileAdapter
binding.ivAll.setOnClickListener {
it.isSelected = emptyFileAdapter.setToggleSelect()
}
binding.tvDelete.setOnClickListener {
val list = emptyFileAdapter.getSelectFile()
if (list.isEmpty()) return@setOnClickListener
this.alert(
"Currently selected ${list.size} items, are you sure to delete them",
"Delete Confirm"
) {
positiveButton("confirm") { dialog ->
val fileList = list.map { File(it.path) }
deleteFiles(fileList)
dialog.dismiss()
}
negativeButton("cancel") { dialog ->
dialog.dismiss()
}
//禁止取消
isCancel(false)
}
}
loadEmptyFile()
}
private fun deleteFiles(files: List<File>) = Thread {
try {
files.forEach {
if (it.exists()) {
if (it.isFile) it.delete() else deleteDirectory(it)
}
}
runOnUiThread {
lifecycleScope.launch(Dispatchers.Main) {
val dialog = showOperationDialog(R.mipmap.dads_889562, "delete success!") {}
delay(200)
dialog.dismiss()
}
}
loadEmptyFile()
} catch (e: Exception) {
e.printStackTrace()
runOnUiThread {
toast("delete failed")
}
}
}.start()
} }
\ No newline at end of file
package com.zxhy.hfilemanagermaster.emptyfile
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ItemMediaSelectBinding
import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.glide.loadIntoImageView
import com.zxhy.hfilemanagermaster.knife.inflate
class EmptyFileAdapter(
private val selectAction: ((flag: Boolean) -> Unit)? = null
) : RecyclerView.Adapter<EmptyFileAdapter.EmptyFileViewHolder>() {
private val mediaList = arrayListOf<MediaDataC>()
class EmptyFileViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemMediaSelectBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EmptyFileViewHolder {
val root = R.layout.item_media_select.inflate(parent)
return EmptyFileViewHolder(root)
}
override fun getItemCount(): Int {
return mediaList.size
}
override fun onBindViewHolder(holder: EmptyFileViewHolder, position: Int) {
val context = holder.binding.root.context
val data = mediaList[position]
holder.binding.apply {
loadIntoImageView(context, data.uri, iv)
tvName.text = data.name
tvSize.text = data.size
ivSelector.isSelected = data.select
flSelector.setOnClickListener {
data.select = !data.select
notifyItemChanged(position, "单条刷新")
}
}
if (data == mediaList.last()) {
selectAction?.invoke(mediaList.all { it.select })
}
}
override fun onBindViewHolder(
holder: EmptyFileViewHolder,
position: Int,
payloads: MutableList<Any>
) {
val context = holder.binding.root.context
val data = mediaList[position]
//判断是做局部刷新还是单条刷新
if (payloads.isEmpty()) {//局部刷新
holder.binding.apply {
loadIntoImageView(context, data.uri, iv)
tvName.text = data.name
tvSize.text = data.size
ivSelector.isSelected = data.select
flSelector.setOnClickListener {
data.select = !data.select
notifyItemChanged(position, "单条刷新")
}
if (data == mediaList.last()) {
selectAction?.invoke(mediaList.all { it.select })
}
}
} else {// 单条刷新
holder.binding.apply {
ivSelector.isSelected = data.select
}
super.onBindViewHolder(holder, position, payloads)
selectAction?.invoke(mediaList.all { it.select })
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(data: List<MediaDataC>) {
mediaList.clear()
mediaList.addAll(data)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun setToggleSelect(): Boolean {
val flag = mediaList.all { it.select }
mediaList.forEach { it.select = !flag }
notifyDataSetChanged()
return !flag
}
fun getSelectSize(): Int {
return mediaList.count { it.select }
}
fun getSelectFile(): List<MediaDataC> {
return mediaList.filter { it.select }
}
}
\ No newline at end of file
package com.zxhy.hfilemanagermaster.filebrowse
import android.app.Dialog
import android.os.Bundle
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ActivityFileBrowseBinding
import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.dialog.showLoadingDialog
import com.zxhy.hfilemanagermaster.dialog.showOperationDialog
import com.zxhy.hfilemanagermaster.knife.apkFile
import com.zxhy.hfilemanagermaster.knife.audioFile
import com.zxhy.hfilemanagermaster.knife.deleteDirectory
import com.zxhy.hfilemanagermaster.knife.excelFile
import com.zxhy.hfilemanagermaster.knife.logFile
import com.zxhy.hfilemanagermaster.knife.pdfFile
import com.zxhy.hfilemanagermaster.knife.pptFile
import com.zxhy.hfilemanagermaster.knife.toast
import com.zxhy.hfilemanagermaster.knife.wordFile
import com.zxhy.hfilemanagermaster.knife.zipFile
import com.zxhy.hfilemanagermaster.permission.alert
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
class FileBrowseActivity : AppCompatActivity() {
private lateinit var binding: ActivityFileBrowseBinding
private var tittle = ""
private lateinit var fileSelectAdapter: FileSelectorAdapter
private lateinit var loadDialog: Dialog
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityFileBrowseBinding.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
}
tittle = intent.extras?.getString("tittle") ?: "tittle"
binding.tvTittle.text = tittle
window.statusBarColor = ContextCompat.getColor(this, R.color.color_C2F300)
binding.ivArrow.setOnClickListener {
finish()
}
fileSelectAdapter = FileSelectorAdapter()
binding.rv.adapter = fileSelectAdapter
binding.tvDelete.setOnClickListener {
val list = fileSelectAdapter.getSelectFile()
if (list.isEmpty()) return@setOnClickListener
this.alert(
"Currently selected ${list.size} items, are you sure to delete them",
"Delete Confirm"
) {
positiveButton("confirm") { dialog ->
deleteFiles(list)
dialog.dismiss()
}
negativeButton("cancel") { dialog ->
dialog.dismiss()
}
//禁止取消
isCancel(false)
}
}
binding.ivAll.setOnClickListener {
it.isSelected = fileSelectAdapter.setToggleSelect()
}
loadDialog = showLoadingDialog()
loadData()
}
private fun loadData() {
when (tittle) {
"Word" -> wordFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
fileSelectAdapter.addData(list)
}
},
finishAction = {
runOnUiThread {
loadDialog.dismiss()
isEmptyUi()
}
})
"Excel" -> excelFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
fileSelectAdapter.addData(list)
}
},
finishAction = {
runOnUiThread {
loadDialog.dismiss()
isEmptyUi()
}
})
"PDF" -> pdfFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
fileSelectAdapter.addData(list)
}
},
finishAction = {
runOnUiThread {
loadDialog.dismiss()
isEmptyUi()
}
})
"PPT" -> pptFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
fileSelectAdapter.addData(list)
}
},
finishAction = {
runOnUiThread {
loadDialog.dismiss()
isEmptyUi()
}
})
"Audio" -> audioFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
fileSelectAdapter.addData(list)
}
},
finishAction = {
runOnUiThread {
loadDialog.dismiss()
isEmptyUi()
}
})
"Apk" -> apkFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
fileSelectAdapter.addData(list)
}
},
finishAction = {
loadDialog.dismiss()
runOnUiThread { isEmptyUi() }
})
"Zip" -> zipFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
fileSelectAdapter.addData(list)
}
},
finishAction = {
loadDialog.dismiss()
runOnUiThread { isEmptyUi() }
})
"Log File" -> logFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
fileSelectAdapter.addData(list)
}
},
finishAction = {
loadDialog.dismiss()
runOnUiThread { isEmptyUi() }
})
}
}
private fun deleteFiles(files: List<MediaDataC>) = Thread {
try {
files.forEach {
val file =File(it.path)
if (file.exists()) {
if (file.isFile) file.delete() else deleteDirectory(file)
}
}
lifecycleScope.launch(Dispatchers.Main) {
val dialog = showOperationDialog(R.mipmap.dads_889562, "delete success!") {}
delay(200)
dialog.dismiss()
fileSelectAdapter.removeData(files)
}
} catch (e: Exception) {
e.printStackTrace()
runOnUiThread {
toast("delete failed")
}
}
}.start()
private fun isEmptyUi() {
val count = fileSelectAdapter.itemCount
if (count == 0) {
binding.rv.visibility = View.GONE
binding.tvDelete.visibility = View.GONE
binding.ivEmpty.visibility = View.VISIBLE
} else {
binding.rv.visibility = View.VISIBLE
binding.tvDelete.visibility = View.VISIBLE
binding.ivEmpty.visibility = View.GONE
}
}
}
\ No newline at end of file
package com.zxhy.hfilemanagermaster.filebrowse
import android.annotation.SuppressLint
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ItemMediaSelectBinding
import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.glide.loadIntoImageView
import com.zxhy.hfilemanagermaster.knife.inflate
import java.io.File
class FileSelectorAdapter(
private val selectAction: ((flag: Boolean) -> Unit)? = null
) : RecyclerView.Adapter<FileSelectorAdapter.MediaSelectViewHolder>() {
private val mediaList = arrayListOf<MediaDataC>()
class MediaSelectViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemMediaSelectBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MediaSelectViewHolder {
val root = R.layout.item_media_select.inflate(parent)
return MediaSelectViewHolder(root)
}
override fun getItemCount(): Int {
return mediaList.size
}
override fun onBindViewHolder(holder: MediaSelectViewHolder, position: Int) {
val context = holder.binding.root.context
val data = mediaList[position]
holder.binding.apply {
if (data.path.contains(".jpg")
or
data.path.contains(".mp4")
or
data.path.contains(".png")
) {
loadIntoImageView(context, File(data.path), iv)
} else if (data.path.contains(".txt")) {
iv.setImageResource(R.mipmap.io_002)
} else if (data.path.contains(".xlsx") or data.path.contains(".xls")) {
iv.setImageResource(R.mipmap.as_85230)
} else if (data.path.contains(".pdf")) {
iv.setImageResource(R.mipmap.io_0012)
} else if (data.path.contains(".ppt") or data.path.contains(".pptx")) {
iv.setImageResource(R.mipmap.io_002223)
} else if (data.path.contains(".apk")) {
iv.setImageResource(R.mipmap.fe_98856)
} else if (data.path.contains(".zip")) {
iv.setImageResource(R.mipmap.qwett_98959)
} else if (data.path.contains("log")) {
iv.setImageResource(R.mipmap.rqwr_875)
} else {
iv.setImageResource(R.mipmap.tt_695)
}
tvName.text = data.name
tvSize.text = data.size
ivSelector.isSelected = data.select
flSelector.setOnClickListener {
data.select = !data.select
notifyItemChanged(position, "单条刷新")
}
}
if (data == mediaList.last()) {
selectAction?.invoke(mediaList.all { it.select })
}
}
override fun onBindViewHolder(
holder: MediaSelectViewHolder,
position: Int,
payloads: MutableList<Any>
) {
val context = holder.binding.root.context
val data = mediaList[position]
//判断是做局部刷新还是单条刷新
if (payloads.isEmpty()) {//局部刷新
holder.binding.apply {
if (data.path.contains(".jpg")
or
data.path.contains(".mp4")
or
data.path.contains(".png")
) {
loadIntoImageView(context, File(data.path), iv)
} else if (data.path.contains(".txt")) {
iv.setImageResource(R.mipmap.io_002)
} else if (data.path.contains(".xlsx") or data.path.contains(".xls")) {
iv.setImageResource(R.mipmap.as_85230)
} else if (data.path.contains(".pdf")) {
iv.setImageResource(R.mipmap.io_0012)
} else if (data.path.contains(".ppt") or data.path.contains(".pptx")) {
iv.setImageResource(R.mipmap.io_002223)
} else if (data.path.contains(".apk")) {
iv.setImageResource(R.mipmap.fe_98856)
} else if (data.path.contains(".zip")) {
iv.setImageResource(R.mipmap.qwett_98959)
} else if (data.path.contains("log")) {
iv.setImageResource(R.mipmap.rqwr_875)
} else {
iv.setImageResource(R.mipmap.tt_695)
}
tvName.text = data.name
tvSize.text = data.size
ivSelector.isSelected = data.select
flSelector.setOnClickListener {
data.select = !data.select
notifyItemChanged(position, "单条刷新")
}
if (data == mediaList.last()) {
selectAction?.invoke(mediaList.all { it.select })
}
}
} else {// 单条刷新
holder.binding.apply {
ivSelector.isSelected = data.select
}
super.onBindViewHolder(holder, position, payloads)
selectAction?.invoke(mediaList.all { it.select })
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(data: List<MediaDataC>) {
mediaList.clear()
mediaList.addAll(data)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun removeData(file: List<MediaDataC>) {
mediaList.removeAll(file.toSet())
file.forEachIndexed { index, mediaDataC ->
Log.e("removeData", "index=$index $mediaDataC")
}
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun addData(data: List<MediaDataC>) {
val index = mediaList.size
mediaList.addAll(data)
notifyItemRangeChanged(index, data.size)
Log.e("FileSelectorAdapter", mediaList.size.toString())
}
@SuppressLint("NotifyDataSetChanged")
fun setToggleSelect(): Boolean {
val flag = mediaList.all { it.select }
mediaList.forEach { it.select = !flag }
notifyDataSetChanged()
return !flag
}
fun getSelectSize(): Int {
return mediaList.count { it.select }
}
fun getSelectFile(): List<MediaDataC> {
return mediaList.filter { it.select }
}
}
\ No newline at end of file
package com.zxhy.hfilemanagermaster.files package com.zxhy.hfilemanagermaster.files
import android.Manifest import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.Display
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
...@@ -12,12 +11,10 @@ import androidx.navigation.fragment.findNavController ...@@ -12,12 +11,10 @@ import androidx.navigation.fragment.findNavController
import com.example.hfilemanagermaster.R import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.FragmentFilesBinding import com.example.hfilemanagermaster.databinding.FragmentFilesBinding
import com.zxhy.hfilemanagermaster.OverviewActivity import com.zxhy.hfilemanagermaster.OverviewActivity
import com.zxhy.hfilemanagermaster.knife.getRecentPhoto import com.zxhy.hfilemanagermaster.image.ImageShowActivity
import com.zxhy.hfilemanagermaster.knife.testPhoto import com.zxhy.hfilemanagermaster.knife.recentPhoto
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.security.Permission
import java.security.Permissions
/** /**
* A simple [Fragment] subclass. * A simple [Fragment] subclass.
...@@ -26,7 +23,7 @@ import java.security.Permissions ...@@ -26,7 +23,7 @@ import java.security.Permissions
*/ */
class FilesFragment : Fragment() { class FilesFragment : Fragment() {
private lateinit var binding: FragmentFilesBinding private lateinit var binding: FragmentFilesBinding
private lateinit var imageAdapter: ImageAdapter private lateinit var imageAdapter: ImageSelectAdapter
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -46,7 +43,16 @@ class FilesFragment : Fragment() { ...@@ -46,7 +43,16 @@ class FilesFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
imageAdapter = ImageAdapter() imageAdapter = ImageSelectAdapter {
if (it.exists()) {
startActivity(Intent(requireContext(), ImageShowActivity::class.java).apply {
val bundle = Bundle().apply {
putString("Path", it.absolutePath)
}
putExtras(bundle)
})
}
}
binding.ivImage.setOnClickListener { binding.ivImage.setOnClickListener {
findNavController().navigate(R.id.imageActivity) findNavController().navigate(R.id.imageActivity)
...@@ -54,8 +60,37 @@ class FilesFragment : Fragment() { ...@@ -54,8 +60,37 @@ class FilesFragment : Fragment() {
binding.ivVideo.setOnClickListener { binding.ivVideo.setOnClickListener {
findNavController().navigate(R.id.videoActivity) findNavController().navigate(R.id.videoActivity)
} }
binding.ivAudio.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "Audio")
}
findNavController().navigate(R.id.fileBrowseActivity, bundle)
}
binding.ivApk.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "Apk")
}
findNavController().navigate(R.id.fileBrowseActivity, bundle)
}
binding.ivZip.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "Zip")
}
findNavController().navigate(R.id.fileBrowseActivity, bundle)
}
binding.ivLog.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "Log File")
}
findNavController().navigate(R.id.fileBrowseActivity, bundle)
}
}
override fun onResume() {
super.onResume()
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
val list = requireContext().testPhoto() val list = requireContext().recentPhoto()
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
binding.rv.adapter = imageAdapter binding.rv.adapter = imageAdapter
imageAdapter.setData(list) imageAdapter.setData(list)
......
...@@ -2,15 +2,17 @@ package com.zxhy.hfilemanagermaster.files ...@@ -2,15 +2,17 @@ package com.zxhy.hfilemanagermaster.files
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.net.Uri import android.net.Uri
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.example.hfilemanagermaster.R import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ItemImageBinding import com.example.hfilemanagermaster.databinding.ItemImageBinding
import com.zxhy.hfilemanagermaster.knife.getFilePathByUri
import com.zxhy.hfilemanagermaster.knife.inflate import com.zxhy.hfilemanagermaster.knife.inflate
import java.io.File
class ImageAdapter : RecyclerView.Adapter<ImageAdapter.ImageViewHolder>() { class ImageSelectAdapter(private val action: (file: File) -> Unit) :
RecyclerView.Adapter<ImageSelectAdapter.ImageViewHolder>() {
private val imageList = arrayListOf<Uri>() private val imageList = arrayListOf<Uri>()
...@@ -28,13 +30,16 @@ class ImageAdapter : RecyclerView.Adapter<ImageAdapter.ImageViewHolder>() { ...@@ -28,13 +30,16 @@ class ImageAdapter : RecyclerView.Adapter<ImageAdapter.ImageViewHolder>() {
} }
override fun onBindViewHolder(holder: ImageViewHolder, position: Int) { override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
// val context = holder.binding.root.context val context = holder.binding.root.context
val data = imageList[position] val data = imageList[position]
holder.binding.iv.setImageURI(data) holder.binding.iv.setImageURI(data)
holder.binding.root.setOnClickListener {
val path = getFilePathByUri(context, data)?:""
action.invoke(File(path))
}
} }
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
fun setData(data: List<Uri>) { fun setData(data: List<Uri>) {
imageList.clear() imageList.clear()
......
package com.zxhy.hfilemanagermaster.image package com.zxhy.hfilemanagermaster.image
import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat 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 androidx.recyclerview.widget.GridLayoutManager
import com.example.hfilemanagermaster.R import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ActivityImageBinding import com.example.hfilemanagermaster.databinding.ActivityImageBinding
import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.dialog.showLoadingDialog
import com.zxhy.hfilemanagermaster.dialog.showOperationDialog
import com.zxhy.hfilemanagermaster.knife.deleteDirectory
import com.zxhy.hfilemanagermaster.knife.imageFile
import com.zxhy.hfilemanagermaster.knife.toast
import com.zxhy.hfilemanagermaster.permission.alert
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
class ImageActivity : AppCompatActivity() { class ImageActivity : AppCompatActivity() {
private lateinit var binding: ActivityImageBinding private lateinit var binding: ActivityImageBinding
private lateinit var imageAdapter: ImageSelectAdapter2
private lateinit var loadDialog: Dialog
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
binding = ActivityImageBinding.inflate(layoutInflater) binding = ActivityImageBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
imageAdapter = ImageSelectAdapter2()
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
...@@ -25,5 +46,87 @@ class ImageActivity : AppCompatActivity() { ...@@ -25,5 +46,87 @@ class ImageActivity : AppCompatActivity() {
binding.ivArrow.setOnClickListener { binding.ivArrow.setOnClickListener {
finish() finish()
} }
imageAdapter = ImageSelectAdapter2 {
binding.ivAll.isSelected = it
}
binding.ivAll.setOnClickListener {
it.isSelected = imageAdapter.setToggleSelect()
}
binding.rv.layoutManager = GridLayoutManager(this, 3)
binding.rv.adapter = imageAdapter
binding.tvDelete.setOnClickListener {
val list = imageAdapter.getSelectFile()
if (list.isEmpty()) return@setOnClickListener
this.alert(
"Currently selected ${list.size} items, are you sure to delete them",
"Delete Confirm"
) {
positiveButton("confirm") { dialog ->
deleteFiles(list)
dialog.dismiss()
}
negativeButton("cancel") { dialog ->
dialog.dismiss()
}
//禁止取消
isCancel(false)
}
}
loadDialog = showLoadingDialog()
loadImageData()
}
private fun loadImageData() {
imageFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
imageAdapter.addData(list)
}
},
finishAction = {
loadDialog.dismiss()
runOnUiThread { isEmptyUi() }
})
}
private fun deleteFiles(files: List<MediaDataC>) = Thread {
try {
files.forEach {
val file =File(it.path)
if (file.exists()) {
if (file.isFile) file.delete() else deleteDirectory(file)
}
}
lifecycleScope.launch(Dispatchers.Main) {
val dialog = showOperationDialog(R.mipmap.dads_889562, "delete success!") {}
delay(200)
dialog.dismiss()
imageAdapter.removeData(files)
}
} catch (e: Exception) {
e.printStackTrace()
runOnUiThread {
toast("delete failed")
}
}
}.start()
private fun isEmptyUi() {
val count = imageAdapter.itemCount
if (count == 0) {
binding.rv.visibility = View.GONE
binding.tvDelete.visibility = View.GONE
binding.ivEmpty.visibility = View.VISIBLE
} else {
binding.rv.visibility = View.VISIBLE
binding.tvDelete.visibility = View.VISIBLE
binding.ivEmpty.visibility = View.GONE
}
} }
} }
\ No newline at end of file
package com.zxhy.hfilemanagermaster.image
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.hfilemanagermaster.databinding.ItemImageBinding
class ImageSelectAdapter: RecyclerView.Adapter<ImageSelectAdapter.ImageSelectHolder>() {
class ImageSelectHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemImageBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageSelectHolder {
TODO("Not yet implemented")
}
override fun getItemCount(): Int {
TODO("Not yet implemented")
}
override fun onBindViewHolder(holder: ImageSelectHolder, position: Int) {
TODO("Not yet implemented")
}
}
\ No newline at end of file
package com.zxhy.hfilemanagermaster.image
import android.annotation.SuppressLint
import android.util.Log
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ItemImageSelectBinding
import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.glide.loadIntoImageView
import com.zxhy.hfilemanagermaster.knife.inflate
import java.io.File
class ImageSelectAdapter2(
private val selectAction: ((flag: Boolean) -> Unit)? = null
) : RecyclerView.Adapter<ImageSelectAdapter2.ImageSelectViewHolder>() {
private val mediaList = arrayListOf<MediaDataC>()
inner class ImageSelectViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemImageSelectBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageSelectViewHolder {
val root = R.layout.item_image_select.inflate(parent)
return ImageSelectViewHolder(root)
}
override fun getItemCount(): Int {
return mediaList.size
}
override fun onBindViewHolder(holder: ImageSelectViewHolder, position: Int) {
val context = holder.binding.root.context
val data = mediaList[position]
holder.binding.apply {
loadIntoImageView(context, File(data.path), ivImage)
ivSelector.isSelected = data.select
ivSelector.setOnClickListener {
data.select = !data.select
notifyItemChanged(position, "单条刷新")
}
if (data == mediaList.last()) {
selectAction?.invoke(mediaList.all { it.select })
}
}
}
override fun onBindViewHolder(
holder: ImageSelectViewHolder,
position: Int,
payloads: MutableList<Any>
) {
val context = holder.binding.root.context
val data = mediaList[position]
//判断是做局部刷新还是单条刷新
if (payloads.isEmpty()) {//局部刷新
holder.binding.apply {
loadIntoImageView(context, File(data.path), ivImage)
ivSelector.isSelected = data.select
ivSelector.setOnClickListener {
data.select = !data.select
notifyItemChanged(position, "单条刷新")
}
if (data == mediaList.last()) {
selectAction?.invoke(mediaList.all { it.select })
}
}
} else {// 单条刷新
holder.binding.apply {
ivSelector.isSelected = data.select
}
super.onBindViewHolder(holder, position, payloads)
selectAction?.invoke(mediaList.all { it.select })
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(data: List<MediaDataC>) {
mediaList.clear()
mediaList.addAll(data)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun setToggleSelect(): Boolean {
val flag = mediaList.all { it.select }
mediaList.forEach { it.select = !flag }
notifyDataSetChanged()
return !flag
}
@SuppressLint("NotifyDataSetChanged")
fun addData(data: List<MediaDataC>) {
val index = mediaList.size
mediaList.addAll(data)
notifyItemRangeChanged(index, data.size)
Log.e("FileSelectorAdapter", mediaList.size.toString())
}
fun getSelectSize(): Int {
return mediaList.count { it.select }
}
fun getSelectFile(): List<MediaDataC> {
return mediaList.filter { it.select }
}
@SuppressLint("NotifyDataSetChanged")
fun removeData(file: List<MediaDataC>) {
mediaList.removeAll(file.toSet())
file.forEachIndexed { index, mediaDataC ->
Log.e("removeData", "index=$index $mediaDataC")
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhy.hfilemanagermaster.image
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ActivityImageShowBinding
import com.zxhy.hfilemanagermaster.glide.loadIntoImageView
import java.io.File
class ImageShowActivity : AppCompatActivity() {
private lateinit var binding: ActivityImageShowBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityImageShowBinding.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
}
window.statusBarColor = ContextCompat.getColor(this, R.color.color_FF000000)
binding.clTop.setBackgroundColor(ContextCompat.getColor(this, R.color.color_FF000000))
binding.ivArrow.setOnClickListener {
finish()
}
val path = intent.extras?.getString("Path") ?: ""
val file = File(path)
if (file.exists()) {
loadIntoImageView(this, file, binding.iv)
binding.tvDelete.setOnClickListener {
file.delete()
finish()
}
}
binding.ivArrow.setOnClickListener {
finish()
}
}
}
\ No newline at end of file
...@@ -8,8 +8,8 @@ import androidx.recyclerview.widget.RecyclerView ...@@ -8,8 +8,8 @@ import androidx.recyclerview.widget.RecyclerView
import com.example.hfilemanagermaster.R import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ItemFileSelectBinding import com.example.hfilemanagermaster.databinding.ItemFileSelectBinding
import com.zxhy.hfilemanagermaster.data.MediaDataC import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.data.file2MediaDataC
import com.zxhy.hfilemanagermaster.glide.loadIntoImageView import com.zxhy.hfilemanagermaster.glide.loadIntoImageView
import com.zxhy.hfilemanagermaster.knife.file2MediaDataC
import com.zxhy.hfilemanagermaster.knife.inflate import com.zxhy.hfilemanagermaster.knife.inflate
import java.io.File import java.io.File
...@@ -18,6 +18,7 @@ class FileAdapter( ...@@ -18,6 +18,7 @@ class FileAdapter(
) : RecyclerView.Adapter<FileAdapter.FileSelectViewHolder>() { ) : RecyclerView.Adapter<FileAdapter.FileSelectViewHolder>() {
private val mediaList = arrayListOf<MediaDataC>() private val mediaList = arrayListOf<MediaDataC>()
private var isSelect = false private var isSelect = false
// private var currentDir: File? = null
class FileSelectViewHolder(view: View) : RecyclerView.ViewHolder(view) { class FileSelectViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemFileSelectBinding.bind(view) val binding = ItemFileSelectBinding.bind(view)
...@@ -190,4 +191,20 @@ class FileAdapter( ...@@ -190,4 +191,20 @@ class FileAdapter(
isSelect = false isSelect = false
notifyDataSetChanged() notifyDataSetChanged()
} }
fun getSelectFile(): List<MediaDataC> {
return mediaList.filter { it.select }
}
fun getCurrentDir(): File? {
val dir = File(mediaList[0].path).parentFile
return dir
}
fun notifyCurrentDir(context: Context) {
val dir = File(mediaList[0].path).parentFile
val data = dir?.listFiles()?.map { it.file2MediaDataC(context) } ?: listOf()
setData(data)
}
} }
\ No newline at end of file
...@@ -3,11 +3,9 @@ package com.zxhy.hfilemanagermaster.knife ...@@ -3,11 +3,9 @@ package com.zxhy.hfilemanagermaster.knife
import android.content.Context import android.content.Context
import android.os.Build import android.os.Build
import android.os.Environment import android.os.Environment
import android.text.format.Formatter
import com.zxhy.hfilemanagermaster.data.MediaDataC import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.data.file2MediaDataC
import java.io.File import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
fun Context.getPublicMedia(): ArrayList<MediaDataC> { fun Context.getPublicMedia(): ArrayList<MediaDataC> {
val downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) val downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
...@@ -67,18 +65,3 @@ fun Context.getPublicMedia(): ArrayList<MediaDataC> { ...@@ -67,18 +65,3 @@ fun Context.getPublicMedia(): ArrayList<MediaDataC> {
return list return list
} }
fun File.file2MediaDataC(context: Context): MediaDataC {
return try {
val sizeS = Formatter.formatFileSize(context, length())
val timeE = SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH).format(lastModified())
MediaDataC(
name = name,
size = sizeS,
time = timeE,
path = absolutePath
)
} catch (e: Exception) {
MediaDataC()
}
}
\ No newline at end of file
...@@ -20,7 +20,7 @@ import java.util.Locale ...@@ -20,7 +20,7 @@ import java.util.Locale
/** /**
* MediaStore访问最新媒体 * MediaStore访问最新媒体
*/ */
fun Context.testPhoto(): ArrayList<Uri> { fun Context.recentPhoto(): ArrayList<Uri> {
val list = arrayListOf<Uri>() val list = arrayListOf<Uri>()
var cursor: Cursor? = null var cursor: Cursor? = null
// 查询照片的Uri和字段 // 查询照片的Uri和字段
...@@ -70,10 +70,13 @@ fun Context.largePhoto(): ArrayList<MediaDataC> { ...@@ -70,10 +70,13 @@ fun Context.largePhoto(): ArrayList<MediaDataC> {
// 查询照片的Uri和字段 // 查询照片的Uri和字段
val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME) val projection = arrayOf(MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME)
//DESC 降列
//ASC 升序
val sortOrder = MediaStore.Images.ImageColumns._ID + " DESC"
try { try {
// 执行查询 // 执行查询
val contentResolver: ContentResolver = contentResolver val contentResolver: ContentResolver = contentResolver
cursor = contentResolver.query(uri, projection, null, null, null) cursor = contentResolver.query(uri, projection, null, null, sortOrder)
// 遍历结果 // 遍历结果
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
...@@ -85,8 +88,10 @@ fun Context.largePhoto(): ArrayList<MediaDataC> { ...@@ -85,8 +88,10 @@ fun Context.largePhoto(): ArrayList<MediaDataC> {
// 根据ID构建照片的Uri // 根据ID构建照片的Uri
val photoUri = ContentUris.withAppendedId(uri, id) val photoUri = ContentUris.withAppendedId(uri, id)
//地址
val filePath = getFilePathByUri(this, photoUri) ?: ""
// println(photoUri) // println(photoUri)
list.add(MediaDataC(uri = photoUri)) list.add(MediaDataC(uri = photoUri, path = filePath))
// 在此处进行照片的操作,例如显示、复制、删除等 // 在此处进行照片的操作,例如显示、复制、删除等
// ... // ...
if (list.size == 10) { if (list.size == 10) {
......
package com.zxhy.hfilemanagermaster.knife
import android.app.Activity
import android.content.Context
import android.widget.Toast
import androidx.fragment.app.Fragment
fun Activity.toast(content: String) {
Toast.makeText(this, content, Toast.LENGTH_SHORT).show()
}
fun Context.toast(content: String) {
Toast.makeText(this, content, Toast.LENGTH_SHORT).show()
}
fun Fragment.toast(content: String) {
Toast.makeText(requireContext(), content, Toast.LENGTH_SHORT).show()
}
\ No newline at end of file
...@@ -104,4 +104,8 @@ class LagerFileSelectorAdapter( ...@@ -104,4 +104,8 @@ class LagerFileSelectorAdapter(
return mediaList.count { it.select } return mediaList.count { it.select }
} }
fun getSelectData(): List<MediaDataC> {
return mediaList.filter { it.select }
}
} }
\ No newline at end of file
...@@ -11,11 +11,17 @@ import androidx.recyclerview.widget.GridLayoutManager ...@@ -11,11 +11,17 @@ import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.example.hfilemanagermaster.R import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ActivityLargeFileBinding import com.example.hfilemanagermaster.databinding.ActivityLargeFileBinding
import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.dialog.showOperationDialog
import com.zxhy.hfilemanagermaster.knife.deleteDirectory
import com.zxhy.hfilemanagermaster.knife.largePhoto import com.zxhy.hfilemanagermaster.knife.largePhoto
import com.zxhy.hfilemanagermaster.knife.largeVideo import com.zxhy.hfilemanagermaster.knife.largeVideo
import com.zxhy.hfilemanagermaster.knife.toast
import com.zxhy.hfilemanagermaster.permission.alert import com.zxhy.hfilemanagermaster.permission.alert
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File
class LargeFileActivity : AppCompatActivity() { class LargeFileActivity : AppCompatActivity() {
private lateinit var binding: ActivityLargeFileBinding private lateinit var binding: ActivityLargeFileBinding
...@@ -40,19 +46,21 @@ class LargeFileActivity : AppCompatActivity() { ...@@ -40,19 +46,21 @@ class LargeFileActivity : AppCompatActivity() {
} }
binding.tvDelete.setOnClickListener { binding.tvDelete.setOnClickListener {
val list = when (currentMode) {
val num = when (currentMode) { 0 -> mediaSelectAdapter.getSelectData()
0 -> mediaSelectAdapter.getSelectSize() 1 -> imageSelectorAdapter.getSelectData()
1 -> imageSelectorAdapter.getSelectSize() 2 -> videoSelectorAdapter.getSelectData()
2 -> videoSelectorAdapter.getSelectSize() else -> listOf()
else -> 0
} }
val num = list.size
if (num == 0) return@setOnClickListener if (num == 0) return@setOnClickListener
this.alert("当前选中${num}项,是否确认删除", "删除确认") { this.alert("Currently selected $num items, are you sure to delete them") {
positiveButton("确定") { dialog -> positiveButton("confirm") { dialog ->
val files = list.map { File(it.path) }
deleteFiles(files)
dialog.dismiss() dialog.dismiss()
} }
negativeButton("取消") { dialog -> negativeButton("cancel") { dialog ->
dialog.dismiss() dialog.dismiss()
} }
//禁止取消 //禁止取消
...@@ -152,4 +160,31 @@ class LargeFileActivity : AppCompatActivity() { ...@@ -152,4 +160,31 @@ class LargeFileActivity : AppCompatActivity() {
} }
} }
} }
private fun deleteFiles(files: List<File>) = Thread {
try {
files.forEach {
if (it.exists()) {
if (it.isFile) it.delete() else deleteDirectory(it)
}
}
runOnUiThread {
lifecycleScope.launch(Dispatchers.Main) {
val dialog = showOperationDialog(R.mipmap.dads_889562, "delete success!") {}
delay(200)
dialog.dismiss()
}
}
when (currentMode) {
0 -> loadLargeFileData()
1 -> loadLargeImageData()
2 -> loadLargeVideoData()
}
} catch (e: Exception) {
e.printStackTrace()
runOnUiThread {
toast("delete failed")
}
}
}.start()
} }
\ No newline at end of file
...@@ -96,4 +96,8 @@ class LargeImageSelectorAdapter( ...@@ -96,4 +96,8 @@ class LargeImageSelectorAdapter(
return mediaList.count { it.select } return mediaList.count { it.select }
} }
fun getSelectData(): List<MediaDataC> {
return mediaList.filter { it.select }
}
} }
\ No newline at end of file
...@@ -17,7 +17,7 @@ class LargeVideoSelectorAdapter( ...@@ -17,7 +17,7 @@ class LargeVideoSelectorAdapter(
private val mediaList = arrayListOf<MediaDataC>() private val mediaList = arrayListOf<MediaDataC>()
class VideoSelectorViewHolder(view: View) : RecyclerView.ViewHolder(view) { inner class VideoSelectorViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemVideoSelectBinding.bind(view) val binding = ItemVideoSelectBinding.bind(view)
} }
...@@ -91,4 +91,8 @@ class LargeVideoSelectorAdapter( ...@@ -91,4 +91,8 @@ class LargeVideoSelectorAdapter(
fun getSelectSize(): Int { fun getSelectSize(): Int {
return mediaList.count { it.select } return mediaList.count { it.select }
} }
fun getSelectData(): List<MediaDataC> {
return mediaList.filter { it.select }
}
} }
\ No newline at end of file
...@@ -63,10 +63,31 @@ class ManagerFragment : Fragment() { ...@@ -63,10 +63,31 @@ class ManagerFragment : Fragment() {
findNavController().navigate(R.id.filesFragment) findNavController().navigate(R.id.filesFragment)
} }
} }
binding.ivWord.setOnClickListener { } binding.ivWord.setOnClickListener {
binding.ivExcel.setOnClickListener { } val bundle = Bundle().apply {
binding.ivPdf.setOnClickListener { } putString("tittle", "Word")
binding.ivPpt.setOnClickListener { } }
findNavController().navigate(R.id.fileBrowseActivity, bundle)
}
binding.ivExcel.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "Excel")
}
findNavController().navigate(R.id.fileBrowseActivity, bundle)
}
binding.ivPdf.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "PDF")
}
findNavController().navigate(R.id.fileBrowseActivity, bundle)
}
binding.ivPpt.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "PPT")
}
findNavController().navigate(R.id.fileBrowseActivity, bundle)
}
binding.cardView1.setOnClickListener { binding.cardView1.setOnClickListener {
requireContext().requestStoreFollow( requireContext().requestStoreFollow(
(requireActivity() as OverviewActivity).permissionLauncher, (requireActivity() as OverviewActivity).permissionLauncher,
......
package com.zxhy.hfilemanagermaster.video package com.zxhy.hfilemanagermaster.video
import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.view.View
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat 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 androidx.recyclerview.widget.GridLayoutManager
import com.example.hfilemanagermaster.R import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ActivityVideoBinding import com.example.hfilemanagermaster.databinding.ActivityVideoBinding
import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.dialog.showLoadingDialog
import com.zxhy.hfilemanagermaster.dialog.showOperationDialog
import com.zxhy.hfilemanagermaster.knife.deleteDirectory
import com.zxhy.hfilemanagermaster.knife.imageFile
import com.zxhy.hfilemanagermaster.knife.largeVideo
import com.zxhy.hfilemanagermaster.knife.toast
import com.zxhy.hfilemanagermaster.knife.videoFile
import com.zxhy.hfilemanagermaster.permission.alert
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
class VideoActivity : AppCompatActivity() { class VideoActivity : AppCompatActivity() {
private lateinit var binding: ActivityVideoBinding private lateinit var binding: ActivityVideoBinding
private lateinit var videoAdapter: VideoSelectAdapter
private lateinit var loadDialog: Dialog
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
...@@ -26,5 +45,87 @@ class VideoActivity : AppCompatActivity() { ...@@ -26,5 +45,87 @@ class VideoActivity : AppCompatActivity() {
binding.ivArrow.setOnClickListener { binding.ivArrow.setOnClickListener {
finish() finish()
} }
videoAdapter = VideoSelectAdapter {
binding.ivAll.isSelected = it
}
binding.ivAll.setOnClickListener {
it.isSelected = videoAdapter.setToggleSelect()
}
binding.rv.layoutManager = GridLayoutManager(this, 3)
binding.rv.adapter = videoAdapter
loadDialog = showLoadingDialog()
loadVideoData()
binding.tvDelete.setOnClickListener {
val list = videoAdapter.getSelectFile()
if (list.isEmpty()) return@setOnClickListener
this.alert(
"Currently selected ${list.size} items, are you sure to delete them",
"Delete Confirm"
) {
positiveButton("confirm") { dialog ->
deleteFiles(list)
dialog.dismiss()
}
negativeButton("cancel") { dialog ->
dialog.dismiss()
}
//禁止取消
isCancel(false)
}
}
}
private fun deleteFiles(files: List<MediaDataC>) = Thread {
try {
files.forEach {
val file = File(it.path)
if (file.exists()) {
if (file.isFile) file.delete() else deleteDirectory(file)
}
}
lifecycleScope.launch(Dispatchers.Main) {
val dialog = showOperationDialog(R.mipmap.dads_889562, "delete success!") {}
delay(200)
dialog.dismiss()
videoAdapter.removeData(files)
}
} catch (e: Exception) {
e.printStackTrace()
runOnUiThread {
toast("delete failed")
}
}
}.start()
private fun loadVideoData() {
videoFile(this,
onDoAction = { list ->
runOnUiThread {
loadDialog.dismiss()
videoAdapter.addData(list)
}
},
finishAction = {
loadDialog.dismiss()
runOnUiThread { isEmptyUi() }
})
}
private fun isEmptyUi() {
val count = videoAdapter.itemCount
if (count == 0) {
binding.rv.visibility = View.GONE
binding.tvDelete.visibility = View.GONE
binding.ivEmpty.visibility = View.VISIBLE
} else {
binding.rv.visibility = View.VISIBLE
binding.tvDelete.visibility = View.VISIBLE
binding.ivEmpty.visibility = View.GONE
}
} }
} }
\ No newline at end of file
package com.zxhy.hfilemanagermaster.video
import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.hfilemanagermaster.R
import com.example.hfilemanagermaster.databinding.ItemVideoSelectBinding
import com.zxhy.hfilemanagermaster.data.MediaDataC
import com.zxhy.hfilemanagermaster.data.file2MediaDataC
import com.zxhy.hfilemanagermaster.glide.loadIntoImageView
import com.zxhy.hfilemanagermaster.knife.inflate
import java.io.File
class VideoSelectAdapter(
private val selectAction: ((flag: Boolean) -> Unit)? = null
) : RecyclerView.Adapter<VideoSelectAdapter.VideoSelectorViewHolder>() {
private val mediaList = arrayListOf<MediaDataC>()
inner class VideoSelectorViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemVideoSelectBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideoSelectorViewHolder {
val root = R.layout.item_video_select.inflate(parent)
return VideoSelectorViewHolder(root)
}
override fun getItemCount(): Int {
return mediaList.size
}
override fun onBindViewHolder(holder: VideoSelectorViewHolder, position: Int) {
val context = holder.binding.root.context
val data = mediaList[position]
holder.binding.apply {
loadIntoImageView(context, File(data.path), ivImage)
ivSelector.isSelected = data.select
}
}
override fun onBindViewHolder(
holder: VideoSelectorViewHolder,
position: Int,
payloads: MutableList<Any>
) {
val context = holder.binding.root.context
val data = mediaList[position]
//判断是做局部刷新还是单条刷新
if (payloads.isEmpty()) {//局部刷新
holder.binding.apply {
loadIntoImageView(context, File(data.path), ivImage)
ivSelector.isSelected = data.select
ivSelector.setOnClickListener {
data.select = !data.select
notifyItemChanged(position, "单条刷新")
}
if (data == mediaList.last()) {
selectAction?.invoke(mediaList.all { it.select })
}
}
} else {// 单条刷新
holder.binding.apply {
ivSelector.isSelected = data.select
}
super.onBindViewHolder(holder, position, payloads)
selectAction?.invoke(mediaList.all { it.select })
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(data: List<MediaDataC>) {
mediaList.clear()
mediaList.addAll(data)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun setToggleSelect(): Boolean {
val flag = mediaList.all { it.select }
mediaList.forEach { it.select = !flag }
notifyDataSetChanged()
return !flag
}
fun getSelectSize(): Int {
return mediaList.count { it.select }
}
fun getSelectFile(): List<MediaDataC> {
return mediaList.filter { it.select }
}
fun notifyCurrentDir(context: Context) {
val dir = File(mediaList[0].path).parentFile
val data = dir?.listFiles()?.map { it.file2MediaDataC(context) } ?: listOf()
setData(data)
}
@SuppressLint("NotifyDataSetChanged")
fun removeData(file: List<MediaDataC>) {
mediaList.removeAll(file.toSet())
file.forEachIndexed { index, mediaDataC ->
Log.e("removeData", "index=$index $mediaDataC")
}
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun addData(data: List<MediaDataC>) {
val index = mediaList.size
mediaList.addAll(data)
notifyItemRangeChanged(index, data.size)
Log.e("FileSelectorAdapter", mediaList.size.toString())
}
}
\ 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/qw_00856" android:state_selected="true" />
<item android:drawable="@mipmap/qw_00856" android:state_focused="true" />
<item android:drawable="@mipmap/qw_00856" android:state_checked="true" />
<item android:drawable="@mipmap/qw_00856" android:state_pressed="true" />
<item android:drawable="@mipmap/zsd_0979" android:state_selected="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="#ffe6e6e6" />
<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_focused="true" />
<item android:color="#333333" android:state_pressed="true" />
<item android:color="#999999" android:state_focused="false" />
<item android:color="#999999" android:state_pressed="false" />
</selector>
\ No newline at end of file
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:src="@mipmap/dd_78652" android:src="@drawable/bg_media_selector"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tv_all" app:layout_constraintRight_toLeftOf="@id/tv_all"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
...@@ -64,18 +64,69 @@ ...@@ -64,18 +64,69 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_lock"
android:layout_width="match_parent"
android:layout_height="0dp"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_top">
<ImageView
android:id="@+id/iv_lock"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_marginTop="82dp"
android:src="@mipmap/ewq_989752"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_tip"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="66dp"
android:layout_marginTop="20dp"
android:text="There are no permissions We need to get permission to read all files."
android:textColor="#999999"
android:textSize="17sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv_lock"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_set"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginHorizontal="55dp"
android:layout_marginTop="20dp"
android:background="@drawable/bg_rectangle_333333"
android:gravity="center"
android:text="Set"
android:textColor="#FFFFFF"
android:textSize="17sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_tip"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv" android:id="@+id/rv"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginHorizontal="20dp" android:layout_marginHorizontal="20dp"
android:layout_marginVertical="16dp" android:layout_marginVertical="16dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="@id/tv_delete" app:layout_constraintBottom_toTopOf="@id/tv_delete"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_top" /> app:layout_constraintTop_toBottomOf="@id/cl_top" />
<TextView <TextView
android:id="@+id/tv_delete" android:id="@+id/tv_delete"
android:layout_width="0dp" android:layout_width="0dp"
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context="com.zxhy.hfilemanagermaster.filebrowse.FileBrowseActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="37dp"
android:background="@color/color_C2F300"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_arrow"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginLeft="8dp"
android:src="@mipmap/rfg_9878985"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="RtlHardcoded" />
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Image"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/iv_arrow"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="16dp"
android:text="All"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText,RtlHardcoded" />
<ImageView
android:id="@+id/iv_all"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginRight="5dp"
android:src="@mipmap/dd_78652"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tv_all"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="RtlHardcoded" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginHorizontal="20dp"
android:layout_marginVertical="16dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="@id/tv_delete"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_top" />
<TextView
android:id="@+id/tv_delete"
android:layout_width="0dp"
android:layout_height="51dp"
android:layout_marginHorizontal="50dp"
android:layout_marginBottom="45dp"
android:background="@mipmap/lopp_89956"
android:gravity="center"
android:text="Delete"
android:textColor="#FFFFFF"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_empty"
android:layout_width="250dp"
android:layout_height="182dp"
android:layout_marginTop="180dp"
android:src="@mipmap/eqwe_8798521"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_top"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -56,11 +56,11 @@ ...@@ -56,11 +56,11 @@
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:src="@mipmap/dd_78652" android:src="@drawable/bg_media_selector"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tv_all" app:layout_constraintRight_toLeftOf="@id/tv_all"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:ignore="RtlHardcoded" /> tools:ignore="ContentDescription,RtlHardcoded" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
...@@ -93,4 +93,16 @@ ...@@ -93,4 +93,16 @@
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_empty"
android:layout_width="250dp"
android:layout_height="182dp"
android:layout_marginTop="180dp"
android:src="@mipmap/eqwe_8798521"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_top"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="#000000"
tools:context="com.zxhy.hfilemanagermaster.image.ImageShowActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="37dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_arrow"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginLeft="8dp"
android:src="@mipmap/rfg_98789823"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription,RtlHardcoded" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Image"
android:textSize="17sp"
android:textStyle="bold"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/iv_arrow"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:id="@+id/iv"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="24dp"
app:layout_constraintBottom_toTopOf="@id/tv_delete"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_top"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_delete"
android:layout_width="0dp"
android:layout_height="51dp"
android:layout_marginHorizontal="50dp"
android:layout_marginTop="24dp"
android:layout_marginBottom="45dp"
android:background="@mipmap/ds_0230"
android:gravity="center"
android:text="Delete"
android:textColor="#000000"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -55,9 +55,9 @@ ...@@ -55,9 +55,9 @@
android:layout_marginRight="14dp" android:layout_marginRight="14dp"
android:text="All" android:text="All"
android:textSize="17sp" android:textSize="17sp"
app:layout_constraintRight_toLeftOf="@id/iv_write"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/iv_write"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText,RtlHardcoded" /> tools:ignore="HardcodedText,RtlHardcoded" />
...@@ -149,11 +149,165 @@ ...@@ -149,11 +149,165 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv" android:id="@+id/rv"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="0dp"
android:layout_marginBottom="12dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="@id/cl_operation"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/item_file_select" /> tools:listitem="@layout/item_file_select" />
<ImageView
android:id="@+id/iv_placeholder"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginRight="50dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/cl_operation"
tools:ignore="ContentDescription,MissingConstraints,RtlHardcoded" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_operation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="50dp"
android:layout_marginBottom="24dp"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/rv">
<ImageView
android:id="@+id/iv_move"
android:layout_width="36dp"
android:layout_height="36dp"
android:src="@mipmap/er_89875"
app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/iv_copy"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="Move"
android:textColor="#333333"
android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="@id/iv_move"
app:layout_constraintRight_toRightOf="@id/iv_move"
app:layout_constraintTop_toBottomOf="@id/iv_move"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_copy"
android:layout_width="36dp"
android:layout_height="36dp"
android:src="@mipmap/qw_8796"
app:layout_constraintLeft_toRightOf="@id/iv_move"
app:layout_constraintRight_toLeftOf="@id/iv_share"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="Copy"
android:textColor="#333333"
android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="@id/iv_copy"
app:layout_constraintRight_toRightOf="@id/iv_copy"
app:layout_constraintTop_toBottomOf="@id/iv_copy"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_share"
android:layout_width="36dp"
android:layout_height="36dp"
android:src="@mipmap/we_898975"
app:layout_constraintLeft_toRightOf="@id/iv_copy"
app:layout_constraintRight_toLeftOf="@id/iv_more"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="Share"
android:textColor="#333333"
android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="@id/iv_share"
app:layout_constraintRight_toRightOf="@id/iv_share"
app:layout_constraintTop_toBottomOf="@id/iv_share"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_more"
android:layout_width="36dp"
android:layout_height="36dp"
android:src="@mipmap/er_01052"
app:layout_constraintLeft_toRightOf="@id/iv_share"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="More"
android:textColor="#333333"
android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="@id/iv_more"
app:layout_constraintRight_toRightOf="@id/iv_more"
app:layout_constraintTop_toBottomOf="@id/iv_more"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_confirm"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="57dp"
android:visibility="invisible"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/cl_operation">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="122dp"
android:layout_height="40dp"
android:background="@drawable/bg_rectangle_border"
android:gravity="center"
android:text="Cancel"
android:textColor="#999999"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_define"
android:layout_width="122dp"
android:layout_height="40dp"
android:background="@drawable/bg_rectangle_333333"
android:gravity="center"
android:text="Motion"
android:textColor="#ffffff"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -55,11 +55,11 @@ ...@@ -55,11 +55,11 @@
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:src="@mipmap/dd_78652" android:src="@drawable/bg_media_selector"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tv_all" app:layout_constraintRight_toLeftOf="@id/tv_all"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:ignore="RtlHardcoded" /> tools:ignore="ContentDescription,RtlHardcoded" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
...@@ -92,4 +92,16 @@ ...@@ -92,4 +92,16 @@
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_empty"
android:layout_width="250dp"
android:layout_height="182dp"
android:layout_marginTop="180dp"
android:src="@mipmap/eqwe_8798521"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_top"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="@android:color/transparent">
<androidx.cardview.widget.CardView
android:layout_width="250dp"
android:layout_height="172dp"
android:layout_margin="5dp"
app:cardBackgroundColor="#FF1A1A1A"
app:cardCornerRadius="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="New Folder"
android:textColor="#ffffff"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_cancel"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_margin="5dp"
android:src="@drawable/icon_delete"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_placeholder"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginTop="24dp"
android:background="#FF343434"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_tittle"
tools:ignore="ContentDescription" />
<EditText
android:id="@+id/et_name"
android:layout_width="200dp"
android:layout_height="32dp"
android:background="@null"
android:gravity="center"
android:hint="Please enter a new name"
android:singleLine="true"
android:textColor="#CCFFFFFF"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@id/iv_placeholder"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_placeholder"
tools:ignore="Autofill,HardcodedText,LabelFor,TextFields" />
<TextView
android:id="@+id/tv_sure"
android:layout_width="210dp"
android:layout_height="40dp"
android:layout_marginBottom="16dp"
android:background="@mipmap/ds_0230"
android:gravity="center"
android:text="Sure"
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="match_parent">
<androidx.cardview.widget.CardView
android:layout_width="250dp"
android:layout_height="180dp"
app:cardBackgroundColor="#323232"
app:cardCornerRadius="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_loading"
android:layout_width="54dp"
android:layout_height="54dp"
android:layout_gravity="center"
android:layout_marginTop="48dp"
android:src="@drawable/loading"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:textColor="#ffffff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="loading..."
android:textSize="15sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_loading"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<androidx.cardview.widget.CardView
android:layout_margin="5dp"
android:layout_width="142dp"
android:layout_height="112dp"
app:cardCornerRadius="12dp"
app:cardElevation="5dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent">
<ImageView
android:id="@+id/iv"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp"
android:src="@mipmap/dads_889562"
app:layout_constraintBottom_toTopOf="@id/tv"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginTop="8dp"
android:layout_marginBottom="12dp"
android:text="Delete successful!"
android:textColor="#333333"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -153,13 +153,13 @@ ...@@ -153,13 +153,13 @@
app:layout_constraintLeft_toRightOf="@id/iv_zip" app:layout_constraintLeft_toRightOf="@id/iv_zip"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_zip" app:layout_constraintTop_toTopOf="@id/iv_zip"
tools:ignore="RtlHardcoded" /> tools:ignore="ContentDescription,RtlHardcoded" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:text="Audio" android:text="Log File"
android:textColor="#333333" android:textColor="#333333"
android:textSize="12sp" android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="@id/iv_log" app:layout_constraintLeft_toLeftOf="@id/iv_log"
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<androidx.cardview.widget.CardView
android:layout_width="106dp"
android:layout_height="122dp"
app:cardCornerRadius="4dp"
app:cardElevation="5dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_rename"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:background="@null"
android:clickable="true"
android:focusable="true"
android:text="Rename"
android:textColor="@drawable/textcolor_selector"
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@id/tv_delete"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText,RtlHardcoded" />
<ImageView
android:id="@+id/iv_rename"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginRight="3dp"
android:clickable="true"
android:focusable="true"
android:src="@drawable/bg_circle_selector_press_c2f300"
app:layout_constraintBottom_toBottomOf="@id/tv_rename"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_rename"
tools:ignore="ContentDescription,RtlHardcoded" />
<TextView
android:id="@+id/tv_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:text="Delete"
android:textColor="@drawable/textcolor_selector"
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@id/tv_Details"
app:layout_constraintLeft_toLeftOf="@id/tv_rename"
app:layout_constraintTop_toBottomOf="@id/tv_rename"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_delete"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginRight="3dp"
android:clickable="true"
android:focusable="true"
android:src="@drawable/bg_circle_selector_press_c2f300"
app:layout_constraintBottom_toBottomOf="@id/tv_delete"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_delete"
tools:ignore="ContentDescription,RtlHardcoded" />
<TextView
android:id="@+id/tv_Details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:text="Details"
android:textColor="@drawable/textcolor_selector"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="@id/tv_rename"
app:layout_constraintTop_toBottomOf="@id/tv_delete"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_details"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginRight="3dp"
android:clickable="true"
android:focusable="true"
android:src="@drawable/bg_circle_selector_press_c2f300"
app:layout_constraintBottom_toBottomOf="@id/tv_Details"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_Details"
tools:ignore="ContentDescription,RtlHardcoded" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -37,6 +37,9 @@ ...@@ -37,6 +37,9 @@
<action <action
android:id="@+id/action_filesFragment_to_videoActivity" android:id="@+id/action_filesFragment_to_videoActivity"
app:destination="@id/videoActivity" /> app:destination="@id/videoActivity" />
<action
android:id="@+id/action_filesFragment_to_fileBrowseActivity"
app:destination="@id/fileBrowseActivity" />
</fragment> </fragment>
<activity <activity
android:id="@+id/largeFileActivity" android:id="@+id/largeFileActivity"
...@@ -68,4 +71,9 @@ ...@@ -68,4 +71,9 @@
android:name="com.zxhy.hfilemanagermaster.internalstorage.InternalStorageActivity" android:name="com.zxhy.hfilemanagermaster.internalstorage.InternalStorageActivity"
android:label="activity_internal_storage" android:label="activity_internal_storage"
tools:layout="@layout/activity_internal_storage" /> tools:layout="@layout/activity_internal_storage" />
<activity
android:id="@+id/fileBrowseActivity"
android:name="com.zxhy.hfilemanagermaster.filebrowse.FileBrowseActivity"
android:label="activity_file_browse"
tools:layout="@layout/activity_file_browse" />
</navigation> </navigation>
\ No newline at end of file
...@@ -7,4 +7,5 @@ ...@@ -7,4 +7,5 @@
<color name="color_DCFE86">#DCFE86</color> <color name="color_DCFE86">#DCFE86</color>
<color name="color_333333">#333333</color> <color name="color_333333">#333333</color>
<color name="color_999999">#999999</color> <color name="color_999999">#999999</color>
<color name="color_FF000000">#FF000000</color>
</resources> </resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dp_142">142dp</dimen>
<dimen name="dp_150">150dp</dimen>
<dimen name="dp_112">112dp</dimen>
<dimen name="dp_120">120dp</dimen>
<dimen name="dp_122">122dp</dimen>
<dimen name="dp_125">125dp</dimen>
<dimen name="dp_140">140dp</dimen>
<dimen name="dp_180">180dp</dimen>
<dimen name="dp_12">12dp</dimen>
<dimen name="dp_24">24dp</dimen>
<dimen name="dp_255">255dp</dimen>
<dimen name="dp_177">177dp</dimen>
</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