Commit bf2a6d39 authored by wanglei's avatar wanglei

Initial commit

parent 90804b8b
......@@ -48,6 +48,8 @@ dependencies {
implementation(libs.androidx.navigation.fragment.ktx)
implementation(libs.androidx.navigation.ui.ktx)
implementation(libs.coil)
implementation(libs.coil.video)
implementation(libs.coil.gif)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
......
......@@ -19,10 +19,14 @@
android:theme="@style/Theme.SolarMasterAce"
tools:targetApi="31">
<activity
android:name=".filebrowser.FileBrowserActivity"
android:name=".internalstorage.InternalStorageActivity"
android:exported="false" />
<activity
android:name=".dupfile.DupImageActivity"
android:name=".filedetails.FileDetailActivity"
android:exported="false"
android:launchMode="singleTop" />
<activity
android:name=".filebrowser.FileBrowserActivity"
android:exported="false" />
<activity
android:name=".MainActivity"
......
......@@ -5,4 +5,11 @@ import com.zxhy.solarmasterace.data.FileBean
interface AdapterCommonDataFunction {
abstract fun setData(data: List<FileBean>)
abstract fun addData(data: List<FileBean>)
abstract fun addDataFinish(data: List<FileBean>)
abstract fun clearData()
abstract fun removeData(data: List<FileBean>)
abstract fun getSelectData(): List<FileBean>
abstract fun toggleSelect(select: Boolean)
}
\ No newline at end of file
package com.zxhy.solarmasterace.adapter
import android.annotation.SuppressLint
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.zxhy.solarmasterace.data.FileBean
abstract class CommonAdapter<T : ViewHolder?>() : RecyclerView.Adapter<T>(),
AdapterCommonDataFunction {
protected val fileList = arrayListOf<FileBean>()
private var firstRefresh = true
@SuppressLint("NotifyDataSetChanged")
override fun setData(data: List<FileBean>) {
fileList.clear()
fileList.addAll(data)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
override fun addData(data: List<FileBean>) {
fileList.addAll(data)
if (firstRefresh) {
notifyDataSetChanged()
firstRefresh = false
}
}
@SuppressLint("NotifyDataSetChanged")
override fun addDataFinish(data: List<FileBean>) {
fileList.addAll(data)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
override fun clearData() {
if (fileList.size == 0) return
fileList.clear()
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
override fun removeData(data: List<FileBean>) {
data.forEach {
val index = fileList.indexOf(it)
if (index != -1) {
fileList.removeAt(index)
notifyItemRemoved(index)
}
}
}
override fun getSelectData(): List<FileBean> {
return fileList.filter { it.isSelect }
}
override fun getItemCount(): Int {
return fileList.size
}
@SuppressLint("NotifyDataSetChanged")
override fun toggleSelect(select: Boolean) {
fileList.mapIndexed { index, fileBean ->
if (fileBean.isSelect != select) {
fileBean.isSelect = select
notifyItemChanged(index, "单条刷新")
}
}
}
}
\ No newline at end of file
......@@ -2,8 +2,28 @@ package com.zxhy.solarmasterace.adapter
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import com.zxhy.solarmasterace.databinding.ItemCardDupImageBinding
import com.zxhy.solarmasterace.databinding.ItemCardImage85Binding
import com.zxhy.solarmasterace.databinding.ItemCardImageSelector100Binding
import com.zxhy.solarmasterace.databinding.ItemCardImageSelector85Binding
import com.zxhy.solarmasterace.databinding.ItemCardLargeFileBinding
class ItemImage85ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
class ItemCardImage85ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemCardImage85Binding.bind(view)
}
\ No newline at end of file
}
class ItemCardImageSelect85ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemCardImageSelector85Binding.bind(view)
}
class ItemCardImageSelect100ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemCardImageSelector100Binding.bind(view)
}
class ItemCardDupImageViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemCardDupImageBinding.bind(view)
}
class ItemCardLargeFileViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemCardLargeFileBinding.bind(view)
}
package com.zxhy.solarmasterace.data
data class DupFileBean(
val md5: String = "",
var dupData: List<FileBean> = listOf(),
var isSelect: Boolean = false
)
package com.zxhy.solarmasterace.data
import android.content.Context
import android.net.Uri
import android.text.format.Formatter
import android.widget.ImageView
import coil.load
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.quicktools.ColiVideoEx
import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
data class FileBean(
val id: Long = 0L,
val name: String = "",
val path: String = "",
val uri: Uri = Uri.EMPTY,
......@@ -38,7 +46,7 @@ data class FileBean(
}
fun isAudio(): Boolean {
return name.contains(".mp3") or name.contains(".avi")
return name.contains(".mp3") or name.contains(".wave") or name.contains(".ogg")
}
fun isApk(): Boolean {
......@@ -78,4 +86,96 @@ data class FileBean(
fun isDocument(): Boolean {
return isWord() or isExcel() or isPPt() or isPdf() or isTxt()
}
fun sizeFormat(context: Context): String? {
return Formatter.formatFileSize(context, size)
}
fun bindIconImage(image: ImageView) {
if (isImage()) {
image.load(file())
} else if (isVideo()) {
image.load(file(), ColiVideoEx.videoLoader(image.context))
} else if (isAudio()) {
image.setImageResource(R.mipmap.fasd_87985)
} else if (isApk()) {
image.setImageResource(R.mipmap.faad_8795)
} else if (isZip()) {
image.setImageResource(R.mipmap.fas_87895)
} else if (isLogFile()) {
image.setImageResource(R.mipmap.fzzx_65987)
} else if (isWord()) {
image.setImageResource(R.mipmap.wrf_58997)
} else if (isExcel()) {
image.setImageResource(R.mipmap.ex_289897)
} else if (isPPt()) {
image.setImageResource(R.mipmap.fas_87895)
} else if (isPdf()) {
image.setImageResource(R.mipmap.zc_8979855556)
} else if (isTxt()) {
image.setImageResource(R.mipmap.fdg_87985)
} else {
image.setImageResource(R.mipmap.ff_0985)
}
}
}
fun File.isImage(): Boolean {
return name.contains(".jpg") or name.contains(".png") or name.contains(".gif")
}
fun File.isVideo(): Boolean {
return name.contains(".mp4") or name.contains(".avi")
}
fun File.isAudio(): Boolean {
return name.contains(".mp3") or name.contains(".wave") or name.contains(".ogg")
}
fun File.isApk(): Boolean {
return name.contains(".apk")
}
fun File.isZip(): Boolean {
return name.contains(".zip") or name.contains(".rar")
}
fun File.isLogFile(): Boolean {
return name.contains("log") or name.contains("Log")
}
fun File.isWord(): Boolean {
return name.contains(".doc") or name.contains(".docx")
}
fun File.isExcel(): Boolean {
return name.contains(".xls") or name.contains(".xlsx")
}
fun File.isPPt(): Boolean {
return name.contains(".ppt") or name.contains(".pptx")
}
fun File.isPdf(): Boolean {
return name.contains(".pdf")
}
fun File.isTxt(): Boolean {
return name.contains(".txt")
}
fun File.isDocument(): Boolean {
return isWord() or isExcel() or isPPt() or isPdf() or isTxt()
}
fun File.toFileBean(): FileBean {
val timeE = SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH).format(lastModified())
return FileBean(
name = name,
path = absolutePath,
size = length(),
time = timeE
)
}
package com.zxhy.solarmasterace.filebrowser
import android.view.ViewGroup
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.adapter.CommonAdapter
import com.zxhy.solarmasterace.adapter.ItemCardLargeFileViewHolder
import com.zxhy.solarmasterace.quicktools.inflate
class CardFileAdapter(
private val selectClick: (flag: Boolean) -> Unit
) : CommonAdapter<ItemCardLargeFileViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemCardLargeFileViewHolder {
return ItemCardLargeFileViewHolder(R.layout.item_card_large_file.inflate(parent))
}
override fun onBindViewHolder(holder: ItemCardLargeFileViewHolder, position: Int) {
}
override fun onBindViewHolder(
holder: ItemCardLargeFileViewHolder,
position: Int,
payloads: MutableList<Any>
) {
val data = fileList[position]
val context = holder.binding.root.context
if (payloads.isEmpty()) {
holder.binding.apply {
data.bindIconImage(ivIcon)
tvName.text = data.name
tvSize.text = data.sizeFormat(context)
ivSelector.isSelected = data.isSelect
ivSelector.setOnClickListener {
data.isSelect = !data.isSelect
notifyItemChanged(position, "单条刷新")
val flag = fileList.all { it.isSelect }
selectClick.invoke(flag)
}
}
} else {
holder.binding.apply {
ivSelector.isSelected = data.isSelect
}
super.onBindViewHolder(holder, position, payloads)
}
}
}
\ No newline at end of file
package com.zxhy.solarmasterace.filebrowser
import android.annotation.SuppressLint
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.adapter.CommonAdapter
import com.zxhy.solarmasterace.adapter.ItemCardDupImageViewHolder
import com.zxhy.solarmasterace.adapter.ItemCardImageSelect85ViewHolder
import com.zxhy.solarmasterace.data.DupFileBean
import com.zxhy.solarmasterace.quicktools.inflate
import java.io.File
class DupImageAdapter(
private val selectClick: (flag: Boolean) -> Unit
) : RecyclerView.Adapter<ItemCardDupImageViewHolder>() {
private val dupFileList = arrayListOf<DupFileBean>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemCardDupImageViewHolder {
return ItemCardDupImageViewHolder(R.layout.item_card_dup_image.inflate(parent))
}
override fun getItemCount(): Int {
return dupFileList.size
}
override fun onBindViewHolder(holder: ItemCardDupImageViewHolder, position: Int) {
// val data = dupFileList[position]
// holder.binding.apply {
// val adapter = ImageAdapter()
// rv.adapter = adapter
// adapter.setData(data.dupData)
// iv.isSelected = data.isSelect
// iv.setOnClickListener {
// data.isSelect = !data.isSelect
// notifyItemChanged(position, "单条刷新")
// }
// }
}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(
holder: ItemCardDupImageViewHolder,
position: Int,
payloads: MutableList<Any>
) {
val data = dupFileList[position]
if (payloads.isEmpty()) {
holder.binding.apply {
tvTip.text = "${data.dupData.size} items"
val adapter = ImageAdapter {
ivSelector.isSelected = it
data.isSelect = it
val flag = dupFileList.all { dupFileBean -> dupFileBean.isSelect }
selectClick.invoke(flag)
}
rv.adapter = adapter
adapter.setData(data.dupData)
ivSelector.isSelected = data.isSelect
ivSelector.setOnClickListener {
data.isSelect = !it.isSelected
notifyItemChanged(position, "单条刷新")
val flag = dupFileList.all { dupFileBean -> dupFileBean.isSelect }
selectClick.invoke(flag)
adapter.toggleSelect(data.isSelect)
}
}
} else {
holder.binding.apply {
ivSelector.isSelected = data.isSelect
}
super.onBindViewHolder(holder, position, payloads)
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(data: List<DupFileBean>) {
dupFileList.clear()
dupFileList.addAll(data)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun toggleSelect(select: Boolean) {
dupFileList.map {
it.isSelect = select
it.dupData.map { fileBean -> fileBean.isSelect = select }
}
notifyDataSetChanged()
}
fun getSelectFile(): ArrayList<File> {
val fileList = arrayListOf<File>()
dupFileList.map {
it.dupData.map { fileBean ->
if (it.isSelect) {
fileList.add(File(fileBean.path))
}
}
}
return fileList
}
private inner class ImageAdapter(
val selectClick: (flag: Boolean) -> Unit
) : CommonAdapter<ItemCardImageSelect85ViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ItemCardImageSelect85ViewHolder {
return ItemCardImageSelect85ViewHolder(
R.layout.item_card_image_selector_85.inflate(parent)
)
}
override fun onBindViewHolder(holder: ItemCardImageSelect85ViewHolder, position: Int) {}
override fun onBindViewHolder(
holder: ItemCardImageSelect85ViewHolder,
position: Int,
payloads: MutableList<Any>
) {
val data = fileList[position]
if (payloads.isEmpty()) {
holder.binding.apply {
iv.load(data.path)
ivSelector.isSelected = data.isSelect
ivSelector.setOnClickListener {
data.isSelect = !data.isSelect
notifyItemChanged(position, "单条刷新")
val flag = fileList.all { it.isSelect }
selectClick.invoke(flag)
}
}
} else {
holder.binding.apply {
ivSelector.isSelected = data.isSelect
}
}
super.onBindViewHolder(holder, position, payloads)
}
}
}
\ No newline at end of file
package com.zxhy.solarmasterace.filebrowser
import android.view.View
import android.view.ViewGroup
import coil.load
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.adapter.CommonAdapter
import com.zxhy.solarmasterace.adapter.ItemCardImageSelect100ViewHolder
import com.zxhy.solarmasterace.quicktools.ColiVideoEx
import com.zxhy.solarmasterace.quicktools.inflate
class FileGridAdapter(
private val selectClick: (flag: Boolean) -> Unit
) : CommonAdapter<ItemCardImageSelect100ViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ItemCardImageSelect100ViewHolder {
return ItemCardImageSelect100ViewHolder(R.layout.item_card_image_selector_100.inflate(parent))
}
override fun onBindViewHolder(holder: ItemCardImageSelect100ViewHolder, position: Int) {
}
override fun onBindViewHolder(
holder: ItemCardImageSelect100ViewHolder,
position: Int,
payloads: MutableList<Any>
) {
val data = fileList[position]
val context = holder.binding.root.context
if (payloads.isEmpty()) {
holder.binding.apply {
if (data.isImage()) {
iv.load(data.file())
ivCamera.visibility = View.GONE
} else if (data.isVideo()) {
iv.load(data.file(), ColiVideoEx.videoLoader(context))
ivCamera.visibility = View.VISIBLE
}
ivSelector.isSelected = data.isSelect
ivSelector.setOnClickListener {
data.isSelect = !data.isSelect
notifyItemChanged(position, "单条刷新")
val flag = fileList.all { it.isSelect }
selectClick.invoke(flag)
}
}
} else {
holder.binding.apply {
ivSelector.isSelected = data.isSelect
}
super.onBindViewHolder(holder, position, payloads)
}
}
}
\ No newline at end of file
package com.zxhy.solarmasterace.filedetails
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.databinding.ActivityFileDetailBinding
class FileDetailActivity : AppCompatActivity() {
private lateinit var binding: ActivityFileDetailBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityFileDetailBinding.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
}
}
}
\ No newline at end of file
package com.zxhy.solarmasterace.internalstorage
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.databinding.ActivityInternalStorageBinding
class InternalStorageActivity : AppCompatActivity() {
private lateinit var binding: ActivityInternalStorageBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityInternalStorageBinding.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
}
}
}
\ No newline at end of file
......@@ -8,12 +8,14 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.navigation.fragment.findNavController
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.databinding.FragmentManagerBinding
import com.zxhy.solarmasterace.quicktools.getMountInfoList
import java.math.BigDecimal
class ManagerFragment : Fragment() {
private lateinit var binding: FragmentManagerBinding
private lateinit var context: Context
......@@ -52,7 +54,7 @@ class ManagerFragment : Fragment() {
categoryMode()
}
fun categoryMode() {
private fun categoryMode() {
binding.apply {
val txtColo1 = ContextCompat.getColor(context, R.color.white)
val txtColo2 = ContextCompat.getColor(context, R.color.color_FF5C67E5)
......@@ -70,12 +72,38 @@ class ManagerFragment : Fragment() {
clFile.visibility = View.VISIBLE
clDocuments.visibility = View.GONE
llImage.setOnClickListener {
nav("Image")
}
llVideo.setOnClickListener {
nav("Video")
}
llAudio.setOnClickListener {
nav("Audio")
}
llApk.setOnClickListener {
nav("Apk")
}
llZip.setOnClickListener {
nav("Zip")
}
llLogFile.setOnClickListener {
nav("Log file")
}
}
}
fun documentsMode() {
private fun nav(tittle: String) {
val bundle = Bundle().apply {
putString("tittle", tittle)
}
findNavController().navigate(R.id.fileBrowserActivity, bundle)
}
private fun documentsMode() {
binding.apply {
val txtColo1 = ContextCompat.getColor(context, R.color.white)
val txtColo2 = ContextCompat.getColor(context, R.color.color_FF5C67E5)
......@@ -93,6 +121,25 @@ class ManagerFragment : Fragment() {
clFile.visibility = View.GONE
clDocuments.visibility = View.VISIBLE
llWord.setOnClickListener {
nav("Word")
}
llExcel.setOnClickListener {
nav("Excel")
}
llPpt.setOnClickListener {
nav("PPT")
}
llPdf.setOnClickListener {
nav("PDF")
}
llTxt.setOnClickListener {
nav("TXT")
}
llAllDoc.setOnClickListener {
nav("Documents")
}
}
}
......
package com.zxhy.solarmasterace.quicktools
import android.content.Context
import coil.ImageLoader
import coil.decode.VideoFrameDecoder
object ColiVideoEx {
fun videoLoader(context: Context): ImageLoader {
val imageLoader = ImageLoader.Builder(context)
.components {
add(VideoFrameDecoder.Factory())
}.build()
return imageLoader
}
}
\ No newline at end of file
This diff is collapsed.
package com.zxhy.solarmasterace.quicktools
import android.os.Environment
import android.util.Log
import java.io.File
import java.util.LinkedList
object FileHelper {
//key:directory path
//value:directory sublist
private val fileMap = HashMap<String, Array<File>?>()
//递归遍历
//只返回文件,不返回目录
//递归返回是所有递归执行完后返回的,所以该方法没意义了
fun recursiveTraverseFolder(
folder: File,
onDo: ((file: File) -> Unit)? = null
): ArrayList<File> {
val fileList = arrayListOf<File>()
folder.listFiles()?.forEach {
if (it.isDirectory) {
fileList.addAll(recursiveTraverseFolder(it) { file -> onDo?.invoke(file) })
} else {
fileList.add(it)
onDo?.invoke(it)
}
}
return fileList
}
//LinkedLis方式遍历
fun linkedLisTraverseFolder(folder: File, onDo: ((file: File) -> Unit)?) {
//添加第一层文件到链表
val linkList = LinkedList<File>()
val fileList = folder.listFiles()
fileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
}else{
onDo?.invoke(it)
}
}
//链表取文件
var tempFile: File
while (!linkList.isEmpty()) {
tempFile = linkList.removeFirst()
val tempFileList = tempFile.listFiles()
tempFileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
} else {
onDo?.invoke(it)
}
}
}
}
fun traverseFolderMap(folder: File) {
folder.listFiles()?.forEach {
if (it.isDirectory) {
fileMap[it.absolutePath] = it.listFiles()
traverseFolderMap(it)
}
}
}
private fun iniFileMap() {
val rootDir = Environment.getExternalStorageDirectory()
traverseFolderMap(rootDir)
}
}
\ No newline at end of file
package com.zxhy.solarmasterace.quicktools
import java.io.File
import java.nio.channels.FileChannel
import java.security.MessageDigest
//生成、查看文件的MD5、SHA1、SHA2、SHA3值
//https://blog.csdn.net/COCO56/article/details/106161207
//根据加密类型获取具体的值
fun File.digestMd5(): ByteArray {
val byteBuffer = inputStream().channel.map(FileChannel.MapMode.READ_ONLY, 0, length())
val digest = MessageDigest.getInstance("MD5")
digest.update(byteBuffer)
return digest.digest()
}
private const val HEXES = "0123456789ABCDEF"
/**
* ByteArray转Hex码
*/
fun ByteArray.byteArrayToHexString(): String {
val hex = StringBuilder(2 * this.size)
for (element in this) {
val high = element.toInt().and(0xFF).shr(4)
val low = element.toInt().and(0x0F)
hex.append(HEXES[high]).append(HEXES[low])
}
return hex.toString()
}
package com.zxhy.solarmasterace.tools
import android.annotation.SuppressLint
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.Adapter
import coil.load
import coil.transform.CircleCropTransformation
import coil.transform.RoundedCornersTransformation
import coil.transform.Transformation
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.adapter.AdapterCommonDataFunction
import com.zxhy.solarmasterace.adapter.ItemImage85ViewHolder
import com.zxhy.solarmasterace.data.FileBean
import com.zxhy.solarmasterace.adapter.CommonAdapter
import com.zxhy.solarmasterace.adapter.ItemCardImage85ViewHolder
import com.zxhy.solarmasterace.quicktools.inflate
class RecentImageAdapter() : Adapter<ItemImage85ViewHolder>(), AdapterCommonDataFunction {
class RecentImageAdapter() : CommonAdapter<ItemCardImage85ViewHolder>() {
private val fileList = arrayListOf<FileBean>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemImage85ViewHolder {
return ItemImage85ViewHolder(R.layout.item_card_image_85.inflate(parent))
}
override fun getItemCount(): Int {
return fileList.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemCardImage85ViewHolder {
return ItemCardImage85ViewHolder(R.layout.item_card_image_85.inflate(parent))
}
override fun onBindViewHolder(holder: ItemImage85ViewHolder, position: Int) {
override fun onBindViewHolder(holder: ItemCardImage85ViewHolder, position: Int) {
val data = fileList[position]
holder.binding.apply {
iv.load(data.uri) {
transformations(RoundedCornersTransformation())
transformations(RoundedCornersTransformation())
}
}
}
@SuppressLint("NotifyDataSetChanged")
override fun setData(data: List<FileBean>) {
fileList.clear()
fileList.addAll(data)
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhy.solarmasterace.tools
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.databinding.FragmentToolsBinding
import com.zxhy.solarmasterace.quicktools.recentImage
......@@ -40,6 +42,25 @@ class ToolsFragment : Fragment() {
context = requireContext()
imageAdapter = RecentImageAdapter()
binding.rv.adapter = imageAdapter
binding.cardDupImage.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "Duplicate picture")
}
findNavController().navigate(R.id.fileBrowserActivity, bundle)
}
binding.cardLargeImage.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "Scan large files")
}
findNavController().navigate(R.id.fileBrowserActivity, bundle)
}
binding.cardEmptyFile.setOnClickListener {
val bundle = Bundle().apply {
putString("tittle", "Scan empty file")
}
findNavController().navigate(R.id.fileBrowserActivity, bundle)
}
loadRecentImage()
}
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF5C67E5" />
<corners
android:bottomLeftRadius="25dp"
android:bottomRightRadius="25dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF5C67E5" />
<corners
android:bottomLeftRadius="25dp"
android:bottomRightRadius="25dp" />
<corners android:radius="25dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFE7E7E7" />
<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:drawable="@mipmap/rwr_89726" android:state_selected="true" />
<item android:drawable="@mipmap/sd_56987" 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">
<solid android:color="#FFF4F4F4" />
<corners android:radius="8dp" />
</shape>
\ No newline at end of file
......@@ -5,12 +5,14 @@
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFF4F4F4"
tools:context=".filebrowser.FileBrowserActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintBottom_toTopOf="@id/tv_tip1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
......@@ -52,7 +54,8 @@
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
app:layout_constraintTop_toTopOf="parent"
tools:ignore="UseCompoundDrawables">
<TextView
android:layout_width="wrap_content"
......@@ -65,6 +68,7 @@
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_all"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
......@@ -80,8 +84,9 @@
android:id="@+id/tv_tip1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="4dp"
android:layout_marginLeft="16dp"
android:text="3 items"
android:text="0 items"
android:textColor="#FF666666"
android:textSize="14sp"
app:layout_constraintBottom_toTopOf="@id/rv"
......@@ -97,30 +102,52 @@
android:text="Files larger than 10MB"
android:textColor="#FF666666"
android:textSize="14sp"
app:layout_constraintBottom_toTopOf="@id/rv"
app:layout_constraintBottom_toBottomOf="@id/tv_tip1"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_top"
app:layout_constraintTop_toTopOf="@id/tv_tip1"
tools:ignore="HardcodedText,RtlHardcoded" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="4dp"
android:overScrollMode="never"
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/tv_tip1" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_warp"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="30dp"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="4dp"
android:background="@drawable/bg_rv_card"
android:overScrollMode="never"
android:visibility="gone"
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" />
app:layout_constraintTop_toBottomOf="@id/tv_tip1" />
<TextView
android:id="@+id/tv_delete"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginHorizontal="56dp"
android:layout_marginBottom="54dp"
android:layout_marginTop="12dp"
android:layout_marginBottom="40dp"
android:gravity="center"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/rv" />
</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"
tools:context=".filedetails.FileDetailActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/cl_arrow"
android:layout_width="60dp"
android:layout_height="36dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:src="@mipmap/df_0011"
tools:ignore="ContentDescription" />
</FrameLayout>
<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_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:id="@+id/iv"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_marginTop="24dp"
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_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="Name:"
android:textColor="#ff666666"
android:textSize="15sp"
app:layout_constraintLeft_toLeftOf="@id/iv"
app:layout_constraintTop_toBottomOf="@id/iv"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Name:"
android:textColor="#ff666666"
android:textSize="15sp"
app:layout_constraintLeft_toLeftOf="@id/iv"
app:layout_constraintTop_toBottomOf="@id/tv_name"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_Position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Name:"
android:textColor="#ff666666"
android:textSize="15sp"
app:layout_constraintLeft_toLeftOf="@id/iv"
app:layout_constraintTop_toBottomOf="@id/tv_size"
tools:ignore="HardcodedText" />
</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"
tools:context=".internalstorage.InternalStorageActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/cl_arrow"
android:layout_width="60dp"
android:layout_height="36dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:src="@mipmap/df_0011"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Internal storage"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_all"
android:layout_width="wrap_content"
android:layout_height="36dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/iv_write"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="16dp"
android:src="@mipmap/dsad_6985"
tools:ignore="ContentDescription" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/cl_operation"
app:layout_constraintTop_toBottomOf="@id/cl_top">
</androidx.recyclerview.widget.RecyclerView>
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginEnd="-24dp"
android:layout_marginBottom="40dp"
android:src="@mipmap/ds_787845"
app:layout_constraintBottom_toTopOf="@id/cl_operation"
app:layout_constraintRight_toRightOf="@id/cl_operation"
tools:ignore="ContentDescription" />
<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"
app:layout_constraintBottom_toTopOf="@id/cl_confirm"
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="32dp"
android:layout_height="32dp"
android:src="@mipmap/sdlo_58789"
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="32dp"
android:layout_height="32dp"
android:src="@mipmap/dssd_3859789"
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="32dp"
android:layout_height="32dp"
android:src="@mipmap/slo_578956"
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="32dp"
android:layout_height="32dp"
android:src="@mipmap/ewt_39878"
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:layout_marginBottom="24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_operation">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="122dp"
android:layout_height="40dp"
android:background="@drawable/bg_ffe7e7e7_corners"
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_ff5c67e5_corners"
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>
\ No newline at end of file
......@@ -9,7 +9,7 @@
android:id="@+id/cl_top"
android:layout_width="0dp"
android:layout_height="350dp"
android:background="@drawable/bg_ff5c67e5_corners"
android:background="@drawable/bg_ff5c67e5_blf_corners"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
......@@ -83,13 +83,15 @@
<androidx.cardview.widget.CardView
android:id="@+id/card_category"
android:layout_width="171dp"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginStart="16dp"
android:layout_marginBottom="-25dp"
app:cardCornerRadius="8dp"
app:layout_constraintBottom_toBottomOf="@id/cl_top"
app:layout_constraintLeft_toLeftOf="parent">
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/card_documents">
<ImageView
android:id="@+id/iv_category"
......@@ -114,14 +116,17 @@
<androidx.cardview.widget.CardView
android:id="@+id/card_documents"
android:layout_width="171dp"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginLeft="4dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="-25dp"
app:cardBackgroundColor="#FFFFFFFF"
app:cardCornerRadius="8dp"
app:cardElevation="5dp"
app:layout_constraintBottom_toBottomOf="@id/cl_top"
app:layout_constraintLeft_toRightOf="@id/card_category"
app:layout_constraintRight_toRightOf="parent">
<ImageView
......@@ -522,7 +527,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="4dp"
android:text="Log file"
android:text="All"
android:textColor="#FF333333"
android:textSize="12sp"
tools:ignore="HardcodedText" />
......
<?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="wrap_content"
android:layout_margin="8dp">
<TextView
android:id="@+id/tv_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"
android:textColor="#FF666666"
android:textSize="14sp"
app:layout_constraintBottom_toTopOf="@id/card"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.cardview.widget.CardView
android:id="@+id/card"
android:layout_width="match_parent"
android:layout_height="109dp"
app:cardBackgroundColor="#FFFFFFFF"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_tip">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/iv_selector"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginRight="17dp"
android:src="@drawable/bg_circle_selector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/rv"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription,RtlHardcoded" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -12,7 +12,8 @@
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
android:scaleType="centerCrop"
tools:ignore="ImageContrastCheck" />
</androidx.cardview.widget.CardView>
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_margin="8dp"
app:cardCornerRadius="8dp"
tools:ignore="ContentDescription">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
tools:ignore="ImageContrastCheck" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="right"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:src="@drawable/bg_image_circle_selector"
tools:ignore="RtlHardcoded" />
<ImageView
android:id="@+id/iv_camera"
android:layout_width="28dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:src="@mipmap/ols_877895" />
</androidx.cardview.widget.CardView>
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="85dp"
android:layout_height="85dp"
android:layout_margin="8dp"
app:cardCornerRadius="8dp"
tools:ignore="ContentDescription">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
tools:ignore="ImageContrastCheck" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="right"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:src="@drawable/bg_image_circle_selector"
tools:ignore="RtlHardcoded" />
</androidx.cardview.widget.CardView>
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="64dp"
android:layout_margin="8dp"
app:cardCornerRadius="8dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription,InvalidId" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@id/iv_icon"
app:layout_constraintLeft_toRightOf="@id/iv_icon"
app:layout_constraintRight_toLeftOf="@id/iv_selector"
app:layout_constraintTop_toTopOf="@id/iv_icon">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:singleLine="true"
android:textColor="#FF333333"
android:textSize="15sp" />
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textColor="#FF999999"
android:textSize="13sp" />
</LinearLayout>
<ImageView
android:id="@+id/iv_selector"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginEnd="16dp"
android:src="@drawable/bg_circle_selector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
......@@ -22,5 +22,13 @@
<action
android:id="@+id/action_toolsFragment_to_managerFragment"
app:destination="@id/managerFragment" />
<action
android:id="@+id/action_toolsFragment_to_fileBrowserActivity"
app:destination="@id/fileBrowserActivity" />
</fragment>
<activity
android:id="@+id/fileBrowserActivity"
android:name="com.zxhy.solarmasterace.filebrowser.FileBrowserActivity"
android:label="activity_file_browser"
tools:layout="@layout/activity_file_browser" />
</navigation>
\ No newline at end of file
......@@ -25,6 +25,8 @@ androidx-constraintlayout = { group = "androidx.constraintlayout", name = "const
androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtx" }
androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtx" }
coil = { group = "io.coil-kt", name = "coil", version.ref = "coil" }
coil-video = { group = "io.coil-kt", name = "coil-video", version.ref = "coil" }
coil-gif = { group = "io.coil-kt", name = "coil-gif", version.ref = "coil" }
[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment