Commit d5231a14 authored by wanglei's avatar wanglei

...

parent f3c7066a
...@@ -49,6 +49,7 @@ dependencies { ...@@ -49,6 +49,7 @@ dependencies {
//第三方UI //第三方UI
implementation("com.airbnb.android:lottie:6.4.0") implementation("com.airbnb.android:lottie:6.4.0")
implementation("com.github.bumptech.glide:glide:4.16.0")
implementation("com.github.angcyo.DslTablayout:TabLayout:3.5.5") implementation("com.github.angcyo.DslTablayout:TabLayout:3.5.5")
//相机 //相机
......
package com.base.browserwhite.ui.adapter package com.base.browserwhite.ui.adapter
import android.annotation.SuppressLint
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 androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.browserwhite.R import com.base.browserwhite.R
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_APK
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_DOC
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_DOCX
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_PDF
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_PPT
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_PPTX
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_XLS
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_XLSX
import com.base.browserwhite.bean.MediaBean import com.base.browserwhite.bean.MediaBean
import com.base.browserwhite.databinding.ItemMediaRecentBinding import com.base.browserwhite.databinding.ItemMediaRecentBinding
import com.base.browserwhite.utils.KotlinExt.toFormatSize
import com.base.browserwhite.utils.XmlEx.inflate import com.base.browserwhite.utils.XmlEx.inflate
import com.bumptech.glide.Glide
import java.io.File
import java.util.ArrayList
class MediaAdapter : RecyclerView.Adapter<MediaAdapter.MediaViewHolder>() { class MediaAdapter : RecyclerView.Adapter<MediaAdapter.MediaViewHolder>() {
...@@ -25,5 +38,54 @@ class MediaAdapter : RecyclerView.Adapter<MediaAdapter.MediaViewHolder>() { ...@@ -25,5 +38,54 @@ class MediaAdapter : RecyclerView.Adapter<MediaAdapter.MediaViewHolder>() {
override fun onBindViewHolder(holder: MediaViewHolder, position: Int) { override fun onBindViewHolder(holder: MediaViewHolder, position: Int) {
val binding = ItemMediaRecentBinding.bind(holder.itemView) val binding = ItemMediaRecentBinding.bind(holder.itemView)
val context = holder.itemView.context
val bean = beanList[position]
binding.ivShipin.visibility = View.GONE
when {
bean.mimeType.contains("image") -> {
Glide.with(context).load(bean.path).into(binding.iv)
}
bean.mimeType.contains("video") -> {
Glide.with(context).load(bean.path).into(binding.iv)
binding.ivShipin.visibility = View.VISIBLE
}
bean.mimeType.contains("audio") -> {
}
bean.mimeType == MIME_TYPE_PDF -> {
binding.iv.setImageResource(R.mipmap.f_pdf)
}
bean.mimeType == MIME_TYPE_DOC || bean.mimeType == MIME_TYPE_DOCX -> {
binding.iv.setImageResource(R.mipmap.h_word)
}
bean.mimeType == MIME_TYPE_XLS || bean.mimeType == MIME_TYPE_XLSX -> {
binding.iv.setImageResource(R.mipmap.h_xls)
}
bean.mimeType == MIME_TYPE_PPT || bean.mimeType == MIME_TYPE_PPTX -> {
binding.iv.setImageResource(R.mipmap.h_ppt)
}
bean.mimeType == MIME_TYPE_APK -> {
binding.iv.setImageResource(R.mipmap.h_apk)
}
}
val file = File(bean.path)
binding.tvName.text = file.name
binding.tvSize.text = file.length().toFormatSize()
}
@SuppressLint("NotifyDataSetChanged")
fun setData(mediaList: List<MediaBean>) {
beanList.clear()
beanList.addAll(mediaList)
notifyDataSetChanged()
} }
} }
\ No newline at end of file
...@@ -6,32 +6,47 @@ import android.os.Build ...@@ -6,32 +6,47 @@ import android.os.Build
import android.os.Environment import android.os.Environment
import android.os.StatFs import android.os.StatFs
import android.os.storage.StorageManager import android.os.storage.StorageManager
import android.view.View
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.databinding.FragmentFileBinding import com.base.browserwhite.databinding.FragmentFileBinding
import com.base.browserwhite.ui.activity.MainActivity import com.base.browserwhite.ui.activity.MainActivity
import com.base.browserwhite.ui.adapter.MediaAdapter
import com.base.browserwhite.utils.KotlinExt.toFormatSize import com.base.browserwhite.utils.KotlinExt.toFormatSize
import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.MediaStoreUtils.getRecentMedia import com.base.browserwhite.utils.MediaStoreUtils.getRecentMedia
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.PermissionHelp.requestStorePermission import com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File import java.io.File
class FileFragment : BaseFragment<FragmentFileBinding>() { class FileFragment : BaseFragment<FragmentFileBinding>() {
private val TAG = "FileFragment"
private lateinit var adapter: MediaAdapter
override val binding: FragmentFileBinding by lazy { override val binding: FragmentFileBinding by lazy {
FragmentFileBinding.inflate(layoutInflater) FragmentFileBinding.inflate(layoutInflater)
} }
override fun setView() { override fun setView() {
showStorage() showStorage()
adapter = MediaAdapter()
binding.rvRecent.adapter = adapter
if (requireContext().checkStorePermission()) {
initData()
}
} }
override fun setListener() { override fun setListener() {
super.setListener() super.setListener()
if (!requireContext().checkStorePermission()) { binding.llPermission.setOnClickListener {
val launcher = (requireActivity() as MainActivity).launcher val launcher = (requireActivity() as MainActivity).launcher
requireContext().requestStorePermission(launcher) { requireContext().requestStorePermission(launcher) {
if (it) { if (it) {
...@@ -73,12 +88,21 @@ class FileFragment : BaseFragment<FragmentFileBinding>() { ...@@ -73,12 +88,21 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
super.onResume() super.onResume()
if (requireContext().checkStorePermission()) { if (requireContext().checkStorePermission()) {
initData() binding.llPermission.visibility = View.GONE
} else {
binding.llPermission.visibility = View.VISIBLE
} }
} }
private fun initData() = lifecycleScope.launch { private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val mediaList = requireContext().getRecentMedia() val mediaList = requireContext().getRecentMedia().filter {
val file = File(it.path)
System.currentTimeMillis() - file.lastModified() <= 15L * 24 * 60 * 60 * 1000
}
LogEx.logDebug(TAG, "size=${mediaList.size}")
launch(Dispatchers.Main) {
adapter.setData(mediaList)
}
} }
......
package com.base.browserwhite.utils package com.base.browserwhite.utils
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.database.Cursor import android.database.Cursor
import android.provider.MediaStore import android.provider.MediaStore
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_APK
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_DOC
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_DOCX
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_IMAGE
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_PDF
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_PPT
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_PPTX
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_VIDEO
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_XLS
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_XLSX
import com.base.browserwhite.bean.MediaBean import com.base.browserwhite.bean.MediaBean
...@@ -20,20 +29,32 @@ object MediaStoreUtils { ...@@ -20,20 +29,32 @@ object MediaStoreUtils {
// MediaStore.Files.FileColumns.TITLE, // MediaStore.Files.FileColumns.TITLE,
MediaStore.Files.FileColumns.MIME_TYPE, MediaStore.Files.FileColumns.MIME_TYPE,
// MediaStore.Files.FileColumns.SIZE, // MediaStore.Files.FileColumns.SIZE,
// MediaStore.Files.FileColumns.DATE_MODIFIED MediaStore.Files.FileColumns.DATE_ADDED
) )
// 构建查询条件,这里以查询图片和视频为例 val mimeTypeSelectionArgs = arrayOf(
val selection = ( MIME_TYPE_IMAGE,
"${MediaStore.Files.FileColumns.MIME_TYPE} = ?" + MIME_TYPE_VIDEO,
" or ${MediaStore.Files.FileColumns.MIME_TYPE} = ?" // MIME_TYPE_AUDIO,
) MIME_TYPE_PDF,
//构建查询条件参数 MIME_TYPE_DOC,
val selectionArgs = arrayOf( MIME_TYPE_DOCX,
"image/*", MIME_TYPE_XLS,
"video/*", MIME_TYPE_XLSX,
MIME_TYPE_PPT,
MIME_TYPE_PPTX,
MIME_TYPE_APK
) )
val mimeTypeSelection =
"${MediaStore.Files.FileColumns.MIME_TYPE} IN (" + mimeTypeSelectionArgs.joinToString(",") { "?" } + ")"
// val selection = "$timeSelection AND $mimeTypeSelection"
val selection = mimeTypeSelection
LogEx.logDebug(TAG, "selection=$selection")
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
// 进行查询,并设置排序方式,按照文件添加时间降序排序 // 进行查询,并设置排序方式,按照文件添加时间降序排序
...@@ -41,18 +62,16 @@ object MediaStoreUtils { ...@@ -41,18 +62,16 @@ object MediaStoreUtils {
MediaStore.Files.getContentUri("external"), MediaStore.Files.getContentUri("external"),
projection, projection,
selection, selection,
selectionArgs, mimeTypeSelectionArgs,
MediaStore.Files.FileColumns.DATE_ADDED + " DESC" MediaStore.Files.FileColumns.DATE_ADDED + " DESC"
) )
if (cursor != null) { if (cursor != null) {
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
runCatching {
// val id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID)) // val id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID))
val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA)) val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA))
// val title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.TITLE)) // val title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.TITLE))
val mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE)) val mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE))
// val size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE)) // val size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE))
// val dateModified = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_MODIFIED))
LogEx.logDebug(TAG, "path=$path mimeType=$mimeType") LogEx.logDebug(TAG, "path=$path mimeType=$mimeType")
list.add( list.add(
...@@ -60,10 +79,9 @@ object MediaStoreUtils { ...@@ -60,10 +79,9 @@ object MediaStoreUtils {
) )
} }
} }
}
} catch (e: Exception) { } catch (e: Exception) {
LogEx.logDebug(TAG, "Exception $e")
} finally { } finally {
cursor?.close() cursor?.close()
} }
......
...@@ -514,6 +514,44 @@ ...@@ -514,6 +514,44 @@
android:textStyle="bold" android:textStyle="bold"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<LinearLayout
android:background="@drawable/bg_storke_dee9f4"
android:id="@+id/ll_permission"
android:layout_width="match_parent"
android:layout_height="75dp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="18dp"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@mipmap/tishitu"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:text="Enable storage permissions"
android:textColor="#010101"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="10dp"
android:src="@mipmap/jiantou_f"
tools:ignore="ContentDescription" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_recent" android:id="@+id/rv_recent"
android:layout_width="match_parent" android:layout_width="match_parent"
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
...@@ -10,7 +11,8 @@ ...@@ -10,7 +11,8 @@
android:layout_width="45dp" android:layout_width="45dp"
android:layout_height="45dp" android:layout_height="45dp"
android:layout_marginVertical="4dp" android:layout_marginVertical="4dp"
android:layout_marginStart="8dp"> android:layout_marginStart="8dp"
app:cardElevation="0dp">
<ImageView <ImageView
android:id="@+id/iv" android:id="@+id/iv"
...@@ -18,6 +20,15 @@ ...@@ -18,6 +20,15 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<ImageView
android:visibility="gone"
android:id="@+id/iv_shipin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/h_shipin"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<LinearLayout <LinearLayout
...@@ -29,6 +40,7 @@ ...@@ -29,6 +40,7 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/tv_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
...@@ -39,6 +51,7 @@ ...@@ -39,6 +51,7 @@
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<TextView <TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
......
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