Commit c82e48a5 authored by wanglei's avatar wanglei

=========合并第一版功能=========

parent 89d3397c
package com.base.superfilemanager.activity
import android.view.View
import android.widget.LinearLayout
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.DividerItemDecoration
import com.base.superfilemanager.adapter.FileBrowseAdapter
import com.base.superfilemanager.bean.FileBean
import com.base.superfilemanager.bean.FileCategoryBean
import com.base.superfilemanager.bean.FileCategoryBean.Companion.APK
import com.base.superfilemanager.bean.FileCategoryBean.Companion.Audio
import com.base.superfilemanager.bean.FileCategoryBean.Companion.DOC
import com.base.superfilemanager.bean.FileCategoryBean.Companion.Image
import com.base.superfilemanager.bean.FileCategoryBean.Companion.PDF
import com.base.superfilemanager.bean.FileCategoryBean.Companion.PPT
import com.base.superfilemanager.bean.FileCategoryBean.Companion.TXT
import com.base.superfilemanager.bean.FileCategoryBean.Companion.Video
import com.base.superfilemanager.bean.FileCategoryBean.Companion.XLS
import com.base.superfilemanager.bean.FileCategoryBean.Companion.ZIP
import com.base.superfilemanager.databinding.ActivityFileCategoryBinding
import com.base.superfilemanager.helps.BaseActivity
import com.base.superfilemanager.helps.FileHelps
import com.base.superfilemanager.helps.file.FileEx.deleteDirectory
import com.base.superfilemanager.view.FileDeleteDialog.showFileDeleteDialog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import java.io.File
import java.lang.Exception
class FileCategoryActivity : BaseActivity<ActivityFileCategoryBinding>() {
private var type: String = ""
private lateinit var adapter: FileBrowseAdapter
override val binding: ActivityFileCategoryBinding by lazy {
ActivityFileCategoryBinding.inflate(layoutInflater)
}
override fun initView() {
type = intent.extras?.getString("type") ?: ""
binding.tvTittle.text = type
adapter = FileBrowseAdapter { size ->
binding.tvDelete.isSelected = size > 0
binding.tvDelete.isEnabled = size > 0
}
binding.rv.adapter = adapter
binding.rv.addItemDecoration(DividerItemDecoration(this, LinearLayout.VERTICAL))
binding.flBack.setOnClickListener {
finishToMain()
}
binding.tvDelete.setOnClickListener {
val deleteList = adapter.getSelect()
showFileDeleteDialog {
binding.clOther.visibility = View.VISIBLE
binding.progressbar.visibility = View.VISIBLE
lifecycleScope.launch(Dispatchers.Main) {
async {
try {
deleteList.forEach {
val deleteFile = File(it.path)
if (deleteFile.isFile) deleteFile.delete() else deleteDirectory(deleteFile)
}
} catch (e: Exception) {
}
binding.clOther.visibility = View.GONE
adapter.removeData(deleteList)
}.await()
}
}
}
}
override fun onStart() {
super.onStart()
checkPermission()
}
override fun onPermissionsResult(isGranted: Boolean) {
if (isGranted) {
initData()
} else {
finishToMain()
}
}
private fun initData() {
val showList = HashSet<FileBean>()
binding.clOther.visibility = View.VISIBLE
binding.progressbar.visibility = View.VISIBLE
FileHelps.getFileList(
onUpdate = {
val temp = arrayListOf<FileBean>()
temp.addAll(FileHelps.fileList)
if (temp.isNotEmpty()) {
when (type) {
FileCategoryBean.ALL -> showList.addAll(temp.filter { it.isDoc() })
XLS -> showList.addAll(temp.filter { it.isXls() })
DOC -> showList.addAll(temp.filter { it.isDocx() })
PDF -> showList.addAll(temp.filter { it.isPdf() })
ZIP -> showList.addAll(temp.filter { it.isZip() })
TXT -> showList.addAll(temp.filter { it.isTxt() })
PPT -> showList.addAll(temp.filter { it.isPpt() })
Video -> showList.addAll(temp.filter { it.isVideo() })
Audio -> showList.addAll(temp.filter { it.isAudio() })
APK -> showList.addAll(temp.filter { it.isApk() })
Image -> showList.addAll(temp.filter { it.isImage() })
}
if (showList.isNotEmpty()) {
binding.clOther.visibility = View.GONE
binding.progressbar.visibility = View.GONE
}
adapter.setData(showList.toList())
}
}, onEnd = {
if (showList.isEmpty()) {
binding.progressbar.visibility = View.GONE
binding.ivEmpty.visibility = View.VISIBLE
binding.tvDelete.visibility = View.GONE
}
})
}
}
\ No newline at end of file
package com.base.superfilemanager.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.superfilemanager.R
import com.base.superfilemanager.bean.FileBean
import com.base.superfilemanager.databinding.ItemFileListBinding
import com.base.superfilemanager.view.XmlEx.inflate
import com.bumptech.glide.Glide
class FileBrowseAdapter(private val select: (size: Int) -> Unit) : RecyclerView.Adapter<FileBrowseAdapter.FB>() {
private val fileList = arrayListOf<FileBean>()
inner class FB(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FB {
return FB(R.layout.item_file_list.inflate(parent))
}
override fun onBindViewHolder(holder: FB, position: Int) {
}
override fun getItemCount(): Int {
return fileList.size
}
override fun onBindViewHolder(holder: FB, position: Int, payloads: MutableList<Any>) {
val binding = ItemFileListBinding.bind(holder.itemView)
val context = holder.itemView.context
val data = fileList[position]
if (payloads.isEmpty()) {
data.loadImageIcon(context, binding.ivIcon)
binding.tvName.text = data.name
binding.tvPath.text = data.path
binding.ivSelector.isSelected = data.isSelect
binding.root.setOnClickListener {
data.isSelect = !data.isSelect
binding.ivSelector.isSelected = data.isSelect
notifyItemChanged(position, "局部刷洗")
select.invoke(fileList.filter { it.isSelect }.size)
}
} else {
binding.ivSelector.isSelected = data.isSelect
super.onBindViewHolder(holder, position, payloads)
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(data: List<FileBean>, clear: Boolean = false) {
if (clear) {
fileList.clear()
}
fileList.addAll(data)
notifyDataSetChanged()
}
fun FileBean.loadImageIcon(context: Context, ivIcon: ImageView) {
when {
isImage() or isVideo() -> Glide.with(context).load(path).into(ivIcon)
isAudio() -> ivIcon.setImageResource(R.drawable.audio)
isZip() -> ivIcon.setImageResource(R.drawable.zip)
isApk() -> ivIcon.setImageResource(R.drawable.apk)
isDocx() -> ivIcon.setImageResource(R.drawable.doc)
isPdf() -> ivIcon.setImageResource(R.drawable.pdf)
isXls() -> ivIcon.setImageResource(R.drawable.xls)
isTxt() -> ivIcon.setImageResource(R.drawable.txt)
isPpt() -> ivIcon.setImageResource(R.drawable.ppt)
}
}
fun getSelect(): List<FileBean> {
return fileList.filter { it.isSelect }
}
@SuppressLint("NotifyDataSetChanged")
fun removeData(deleteList: List<FileBean>) {
fileList.removeAll(deleteList.toSet())
notifyDataSetChanged()
}
}
package com.base.superfilemanager.adapter
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.superfilemanager.R
import com.base.superfilemanager.bean.FileCategoryBean
import com.base.superfilemanager.databinding.ItemFileCategoryDocBinding
import com.base.superfilemanager.databinding.ItemFileCategoryMediaBinding
import com.base.superfilemanager.databinding.ItemRecentMediaBinding
import com.base.superfilemanager.view.XmlEx.inflate
import com.bumptech.glide.Glide
class FileCategoryAdapter(val mode: String, val click: (key: String) -> Unit) : RecyclerView.Adapter<FileCategoryAdapter.DC>() {
private val list = arrayListOf<FileCategoryBean>()
class DC(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DC {
return when (mode) {
MODE_DOCUMENT -> DC(R.layout.item_file_category_doc.inflate(parent))
MODE_MEDIA -> DC(R.layout.item_file_category_media.inflate(parent))
MODE_RECENT -> DC(R.layout.item_recent_media.inflate(parent))
else -> DC(R.layout.item_file_category_doc.inflate(parent))
}
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: DC, position: Int) {
val context = holder.itemView.context
val data = list[position]
when (mode) {
MODE_DOCUMENT -> {
val binding = ItemFileCategoryDocBinding.bind(holder.itemView)
binding.iv.setImageResource(data.drawable)
binding.tv.text = data.tittle
binding.root.setOnClickListener {
click.invoke(data.key)
}
}
MODE_MEDIA -> {
val binding = ItemFileCategoryMediaBinding.bind(holder.itemView)
binding.iv.setImageResource(data.drawable)
binding.tv.text = data.tittle
binding.root.setOnClickListener {
click.invoke(data.key)
}
}
MODE_RECENT -> {
val binding = ItemRecentMediaBinding.bind(holder.itemView)
Glide.with(context).load(data.url).centerCrop().into(binding.iv)
binding.root.setOnClickListener {
click.invoke(data.key)
}
}
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(dataList: List<FileCategoryBean>) {
list.clear()
list.addAll(dataList)
notifyDataSetChanged()
}
companion object {
val MODE_DOCUMENT = "document"
val MODE_MEDIA = "media"
val MODE_RECENT = "recent"
}
}
...@@ -25,8 +25,13 @@ data class FileBean( ...@@ -25,8 +25,13 @@ data class FileBean(
fun isApk() = !isDir && type in listOf("apk") fun isApk() = !isDir && type in listOf("apk")
fun isDoc() = !isDir && type in listOf("pdf", "doc", "docx", "xls", "ppt", "txt") fun isDoc() = !isDir && type in listOf("pdf", "doc", "docx", "xls", "ppt", "txt")
fun isDocx() = !isDir && type in listOf("docx")
fun isPdf() = !isDir && type in listOf("pdf")
fun isXls() = !isDir && type in listOf("xls")
fun isTxt() = !isDir && type in listOf("txt")
fun isPpt() = !isDir && type in listOf("ppt")
fun isOther() = !isImage() && !isVideo() && !isAudio() && !isZip() && !isApk() fun isOther() = !isImage() && !isVideo() && !isAudio() && !isZip() && !isApk()
fun isJunk() = !isDir && type in listOf("tmp", "cache", "temp") fun isJunk() = !isDir && type in listOf("tmp", "cache", "temp")
fun isOtherTrash() = !isDir && type in listOf("log", "bak", "old", "chk", "gid", "dmp", "thumb", "crdownload", "part", "trash", "trashes") fun isOtherTrash() =
!isDir && type in listOf("log", "bak", "old", "chk", "gid", "dmp", "thumb", "crdownload", "part", "trash", "trashes")
} }
\ No newline at end of file
package com.base.superfilemanager.bean
data class FileCategoryBean(
val key: String="",
val drawable: Int=0,
val tittle: String="",
val url:String="",
val path:String=""
) {
companion object {
const val ALL = "ALL"
const val XLS = "XLS"
const val DOC = "DOC"
const val PDF = "PDF"
const val ZIP = "ZIP"
const val TXT = "TXT"
const val PPT = "PPT"
const val Video = "Video"
const val Audio = "Audio"
const val APK = "APK"
const val Image = "Image"
}
}
\ No newline at end of file
package com.base.superfilemanager.fragment
import android.content.Intent
import android.os.Build
import android.os.Environment
import android.view.View
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import com.base.superfilemanager.R
import com.base.superfilemanager.activity.FileCategoryActivity
import com.base.superfilemanager.activity.MainActivity
import com.base.superfilemanager.adapter.FileCategoryAdapter
import com.base.superfilemanager.bean.FileCategoryBean
import com.base.superfilemanager.databinding.FragmentFileCategoryBinding
import com.base.superfilemanager.helps.BaseFragment
import com.base.superfilemanager.helps.file.MediaStoreEx
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.PermissionUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
class FileCategoryFragment : BaseFragment<FragmentFileCategoryBinding>() {
override val binding: FragmentFileCategoryBinding by lazy {
FragmentFileCategoryBinding.inflate(layoutInflater)
}
private lateinit var docAdapter: FileCategoryAdapter
private lateinit var mediaAdapter: FileCategoryAdapter
private lateinit var recentAdapter: FileCategoryAdapter
private val docList = listOf(
FileCategoryBean(FileCategoryBean.ALL, R.drawable.all, FileCategoryBean.ALL),
FileCategoryBean(FileCategoryBean.XLS, R.drawable.xls, FileCategoryBean.XLS),
FileCategoryBean(FileCategoryBean.DOC, R.drawable.doc, FileCategoryBean.DOC),
FileCategoryBean(FileCategoryBean.ZIP, R.drawable.zip, FileCategoryBean.ZIP),
FileCategoryBean(FileCategoryBean.TXT, R.drawable.txt, FileCategoryBean.TXT),
FileCategoryBean(FileCategoryBean.PPT, R.drawable.ppt, FileCategoryBean.PPT),
FileCategoryBean(FileCategoryBean.PDF, R.drawable.pdf, FileCategoryBean.PDF),
)
private val mediaList = listOf(
FileCategoryBean(FileCategoryBean.Video, R.drawable.video, FileCategoryBean.Video),
FileCategoryBean(FileCategoryBean.Audio, R.drawable.audio, FileCategoryBean.Audio),
FileCategoryBean(FileCategoryBean.APK, R.drawable.apk, FileCategoryBean.APK),
FileCategoryBean(FileCategoryBean.Image, R.drawable.image, FileCategoryBean.Image),
)
override fun setView() {
docAdapter = FileCategoryAdapter(FileCategoryAdapter.MODE_DOCUMENT, ::itemClick)
binding.rvDocument.layoutManager = GridLayoutManager(requireContext(), 4).apply {
scrollToPositionWithOffset(0, 0)
}
binding.rvDocument.adapter = docAdapter
docAdapter.setData(docList)
mediaAdapter = FileCategoryAdapter(FileCategoryAdapter.MODE_MEDIA, ::itemClick)
binding.rvMedia.adapter = mediaAdapter
mediaAdapter.setData(mediaList)
binding.tvAuthorization.setOnClickListener {
(requireActivity() as MainActivity).checkPermission(true)
}
binding.llAll.setOnClickListener {
(requireActivity() as MainActivity).checkPermission(true)
}
recentAdapter = FileCategoryAdapter(FileCategoryAdapter.MODE_RECENT, ::itemClick)
binding.rvRecent.adapter = recentAdapter
}
override fun onStart() {
super.onStart()
if (checkStorage()) {
binding.llPermission.visibility = View.GONE
binding.tvAuthorization.visibility = View.GONE
binding.rvRecent.visibility = View.VISIBLE
loadRecentImageVideo()
}
}
private fun itemClick(key: String) {
requireContext().startActivity(Intent(requireContext(), FileCategoryActivity::class.java).apply {
putExtra("type", key)
})
}
private fun checkStorage(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Environment.isExternalStorageManager()
} else {
PermissionUtils.isGranted(PermissionConstants.STORAGE)
}
}
fun refreshRecent() {
if (isVisible) {
binding.llPermission.visibility = View.GONE
binding.rvRecent.visibility = View.VISIBLE
loadRecentImageVideo()
}
}
private fun loadRecentImageVideo() = lifecycleScope.launch(Dispatchers.Main) {
val imageList = arrayListOf<FileCategoryBean>()
async {
val list = MediaStoreEx.recentImage(requireContext()).map { FileCategoryBean(url = it.toString()) }
imageList.addAll(list)
}.await()
if (imageList.isEmpty()) {
binding.llEmpty.visibility = View.VISIBLE
} else {
recentAdapter.setData(imageList)
}
}
}
\ No newline at end of file
package com.base.superfilemanager.helps.file
import java.io.File
import java.util.Stack
object FileEx {
/**
*删除文件夹
*/
fun deleteDirectory(dir: File): Boolean {
val stackFiles = Stack<File>()
stackFiles.push(dir)
while (stackFiles.size > 0) {
val currentFile = stackFiles.peek()
val subFiles = currentFile.listFiles()
if (subFiles != null) {
for (i in subFiles.indices) {
if (subFiles[i].isFile) {
if (!subFiles[i].delete()) {
return false
}
} else {
stackFiles.push(subFiles[i])
}
}
}
if (currentFile === stackFiles.peek()) {
if (!currentFile.delete()) {
return false
}
stackFiles.pop()
}
}
return true
}
}
\ No newline at end of file
package com.base.superfilemanager.helps.file
import android.content.ContentUris
import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.provider.MediaStore
object MediaStoreEx {
fun recentImage(context: Context): ArrayList<Uri> {
val list = arrayListOf<Uri>()
var cursor: Cursor? = null
// 查询照片的Uri和字段
val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME)
//DESC 降列
//ASC 升序
val sortOrder = MediaStore.Images.ImageColumns._ID + " DESC"
try {
// 执行查询
cursor = context.contentResolver.query(uri, projection, null, null, sortOrder)
// 遍历结果
if (cursor != null && cursor.moveToFirst()) {
do {
val id =
cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID))
list.add(ContentUris.withAppendedId(uri, id))
if (list.size == 10) {
break
}
} while (cursor.moveToNext())
}
} catch (e: Exception) {
e.printStackTrace()
} finally {
cursor?.close()
}
return list
}
fun recentVideo(context: Context): ArrayList<Uri> {
val list = arrayListOf<Uri>()
var cursor: Cursor? = null
// 查询照片的Uri和字段
val uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Video.Media._ID, MediaStore.Video.Media.DISPLAY_NAME)
//DESC 降列
//ASC 升序
val sortOrder = MediaStore.Video.VideoColumns._ID + " DESC"
try {
// 执行查询
cursor = context.contentResolver.query(uri, projection, null, null, sortOrder)
// 遍历结果
if (cursor != null && cursor.moveToFirst()) {
do {
val id =
cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID))
list.add(ContentUris.withAppendedId(uri, id))
if (list.size == 10) {
break
}
} while (cursor.moveToNext())
}
} catch (e: Exception) {
e.printStackTrace()
} finally {
cursor?.close()
}
return list
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FDFDFD"
android:orientation="vertical"
tools:context=".activity.FileCategoryActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_action_bar"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@color/white"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingHorizontal="15dp"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:src="@drawable/fanhui"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_margin="5dp"
android:text=""
android:textColor="#FF333333"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/fl_back"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<com.noober.background.view.BLTextView
android:id="@+id/tv_delete"
android:layout_width="278dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:layout_marginBottom="30dp"
android:enabled="false"
android:gravity="center"
android:text="Delete"
android:textColor="@color/white"
android:textSize="15sp"
android:textStyle="bold"
app:bl_corners_radius="24dp"
app:bl_selected_solid_color="#2D4059"
app:bl_unSelected_solid_color="#999999"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_other"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
<!--suppress AndroidElementNotAllowed -->
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:indeterminateTint="#0066FD"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/empty"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="35dp"
android:text="Document tools"
android:textColor="@color/black"
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="172dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:elevation="5dp"
app:cardCornerRadius="12dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_document"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:overScrollMode="never" />
</androidx.cardview.widget.CardView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
android:text="Folder"
android:textColor="@color/black"
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_media"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="12dp"
android:layout_marginTop="6dp"
android:orientation="horizontal"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="Recent images"
android:textColor="@color/black"
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="UseCompoundDrawables">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:includeFontPadding="false"
android:text="ALL"
android:textColor="#999999"
android:textSize="15sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/jingru"
tools:ignore="ContentDescription" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="80dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_recent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="3dp"
android:orientation="horizontal"
android:overScrollMode="never"
android:visibility="gone"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<LinearLayout
android:id="@+id/ll_permission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables,UselessParent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/filestu"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No Permission"
android:textColor="#343434"
android:textSize="7sp"
tools:ignore="HardcodedText,SmallSp" />
</LinearLayout>
<com.noober.background.view.BLTextView
android:id="@+id/tv_authorization"
android:layout_width="209dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="50dp"
android:gravity="center"
android:text="Authorization"
android:textColor="@color/white"
android:textSize="10sp"
app:bl_corners_radius="12dp"
app:bl_solid_color="#2D4059"
tools:ignore="HardcodedText,SmallSp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal"
android:visibility="gone"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/recent_empty"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:text="There's no recent image yet"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_marginVertical="10dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="25dp"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/iv"
android:layout_width="42dp"
android:layout_height="40dp"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:textColor="#333333"
android:textSize="12sp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_marginVertical="10dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="23dp"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/iv"
android:layout_width="45dp"
android:layout_height="45dp"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:textColor="#333333"
android:textSize="12sp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="55dp"
android:layout_height="55dp"
android:layout_gravity="center_vertical"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="5dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true" />
<TextView
android:id="@+id/tv_path"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ImageView
android:id="@+id/iv_selector"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="6dp"
android:src="@drawable/bg_selected_2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_margin="13dp"
android:elevation="0dp"
app:cardCornerRadius="4dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
\ 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