Commit 45731203 authored by wanglei's avatar wanglei

...

parent 520009b7
...@@ -6,10 +6,16 @@ import androidx.core.view.updatePadding ...@@ -6,10 +6,16 @@ import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
import androidx.recyclerview.widget.LinearLayoutManager
import com.base.browserwhite.bean.ConstObject
import com.base.browserwhite.databinding.ActivityMediaBrowserBinding import com.base.browserwhite.databinding.ActivityMediaBrowserBinding
import com.base.browserwhite.ui.activity.BaseActivity import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.ui.adapter.MediaAdapter import com.base.browserwhite.ui.adapter.MediaAdapter
import com.base.browserwhite.ui.fragment.FileFragment
import com.base.browserwhite.utils.BarUtils import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.MediaStoreUtils.getMediaAudio
import com.base.browserwhite.utils.MediaStoreUtils.getMediaAudioSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaFile
import com.base.browserwhite.utils.MediaStoreUtils.getMediaPhoto import com.base.browserwhite.utils.MediaStoreUtils.getMediaPhoto
import com.base.browserwhite.utils.MediaStoreUtils.getMediaVideo import com.base.browserwhite.utils.MediaStoreUtils.getMediaVideo
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -46,9 +52,11 @@ class MediaBrowserActivity : BaseActivity<ActivityMediaBrowserBinding>() { ...@@ -46,9 +52,11 @@ class MediaBrowserActivity : BaseActivity<ActivityMediaBrowserBinding>() {
} }
} }
"Document" -> { "Document", "APK", "Music", "Zip" -> {
adapter = MediaAdapter(0) adapter = MediaAdapter(2, moreAction = { view, bean ->
FileFragment.moreAction(this, view, bean, adapter)
})
binding.rv.layoutManager = LinearLayoutManager(this)
} }
} }
...@@ -71,6 +79,31 @@ class MediaBrowserActivity : BaseActivity<ActivityMediaBrowserBinding>() { ...@@ -71,6 +79,31 @@ class MediaBrowserActivity : BaseActivity<ActivityMediaBrowserBinding>() {
val mediaList = when (tittle) { val mediaList = when (tittle) {
"Picture" -> getMediaPhoto() "Picture" -> getMediaPhoto()
"Video" -> getMediaVideo() "Video" -> getMediaVideo()
"Document" -> getMediaFile(
arrayOf(
ConstObject.MIME_TYPE_PDF,
ConstObject.MIME_TYPE_DOC,
ConstObject.MIME_TYPE_DOCX,
ConstObject.MIME_TYPE_XLS,
ConstObject.MIME_TYPE_XLSX,
ConstObject.MIME_TYPE_PPT,
ConstObject.MIME_TYPE_PPTX,
)
)
"APK" -> getMediaFile(
arrayOf(
ConstObject.MIME_TYPE_APK
)
)
"Music" -> getMediaAudio()
"Zip"-> getMediaFile(
arrayOf(
ConstObject.MIME_TYPE_ZIP
)
)
else -> arrayListOf() else -> arrayListOf()
} }
......
...@@ -14,7 +14,9 @@ import com.base.browserwhite.bean.ConstObject.MIME_TYPE_PPT ...@@ -14,7 +14,9 @@ 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_PPTX
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_XLS import com.base.browserwhite.bean.ConstObject.MIME_TYPE_XLS
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_XLSX import com.base.browserwhite.bean.ConstObject.MIME_TYPE_XLSX
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_ZIP
import com.base.browserwhite.bean.MediaBean import com.base.browserwhite.bean.MediaBean
import com.base.browserwhite.databinding.ItemMediaListBinding
import com.base.browserwhite.databinding.ItemMediaPictureVideoBinding import com.base.browserwhite.databinding.ItemMediaPictureVideoBinding
import com.base.browserwhite.databinding.ItemMediaRecentBinding import com.base.browserwhite.databinding.ItemMediaRecentBinding
import com.base.browserwhite.utils.KotlinExt.toFormatSize import com.base.browserwhite.utils.KotlinExt.toFormatSize
...@@ -40,6 +42,9 @@ class MediaAdapter( ...@@ -40,6 +42,9 @@ class MediaAdapter(
if (uiType == 1) { if (uiType == 1) {
return MediaViewHolder(R.layout.item_media_picture_video.inflate(parent)) return MediaViewHolder(R.layout.item_media_picture_video.inflate(parent))
} }
if (uiType == 2) {
return MediaViewHolder(R.layout.item_media_list.inflate(parent))
}
return MediaViewHolder(R.layout.item_media_recent.inflate(parent)) return MediaViewHolder(R.layout.item_media_recent.inflate(parent))
} }
...@@ -67,7 +72,7 @@ class MediaAdapter( ...@@ -67,7 +72,7 @@ class MediaAdapter(
} }
bean.mimeType.contains("audio") -> { bean.mimeType.contains("audio") -> {
binding.iv.setImageResource(R.mipmap.z_music)
} }
bean.mimeType == MIME_TYPE_PDF -> { bean.mimeType == MIME_TYPE_PDF -> {
...@@ -89,6 +94,10 @@ class MediaAdapter( ...@@ -89,6 +94,10 @@ class MediaAdapter(
bean.mimeType == MIME_TYPE_APK -> { bean.mimeType == MIME_TYPE_APK -> {
binding.iv.setImageResource(R.mipmap.h_apk) binding.iv.setImageResource(R.mipmap.h_apk)
} }
bean.mimeType == MIME_TYPE_ZIP -> {
binding.iv.setImageResource(R.mipmap.z_zip)
}
} }
val file = File(bean.path) val file = File(bean.path)
...@@ -110,6 +119,56 @@ class MediaAdapter( ...@@ -110,6 +119,56 @@ class MediaAdapter(
if (bean.mimeType.contains("video")) { if (bean.mimeType.contains("video")) {
binding.ivShipin.visibility = View.VISIBLE binding.ivShipin.visibility = View.VISIBLE
} }
} else if (uiType == 2) {
val binding = ItemMediaListBinding.bind(holder.itemView)
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") -> {
binding.iv.setImageResource(R.mipmap.z_music)
}
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)
}
bean.mimeType == MIME_TYPE_ZIP -> {
binding.iv.setImageResource(R.mipmap.z_zip)
}
}
val file = File(bean.path)
binding.tvName.text = file.name
binding.tvSize.text = file.length().toFormatSize()
binding.flMore.setOnClickListener {
moreAction?.invoke(it, bean)
}
binding.root.setOnClickListener {
clickAction?.invoke(bean)
}
} }
} }
......
...@@ -2,6 +2,7 @@ package com.base.browserwhite.ui.fragment ...@@ -2,6 +2,7 @@ package com.base.browserwhite.ui.fragment
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.usage.StorageStatsManager import android.app.usage.StorageStatsManager
import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Environment import android.os.Environment
...@@ -11,6 +12,7 @@ import android.view.View ...@@ -11,6 +12,7 @@ import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.bean.MediaBean
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.activity.mediabrowser.MediaBrowserActivity import com.base.browserwhite.ui.activity.mediabrowser.MediaBrowserActivity
...@@ -52,30 +54,7 @@ class FileFragment : BaseFragment<FragmentFileBinding>() { ...@@ -52,30 +54,7 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
}, },
moreAction = { view, bean -> moreAction = { view, bean ->
requireContext().showMediaMoreDialog(view, moreAction(requireContext(), view, bean, adapter)
deleteAction = {
requireContext().showDeleteTipDialog {
runCatching { File(bean.path).delete() }
adapter.removeData(bean)
}
},
shareAction = {
LogEx.logDebug(TAG, "uri=${bean.uri}")
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
type = bean.mimeType
putExtra(Intent.EXTRA_STREAM, bean.uri)
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
// 可以添加更多额外信息,如主题、文本等
}
val chooserIntent = Intent.createChooser(shareIntent, "Share File")
if (shareIntent.resolveActivity(requireContext().packageManager) != null) {
startActivity(chooserIntent)
} else {
Toast.makeText(requireContext(), "no app can share the file", Toast.LENGTH_SHORT).show()
}
})
}) })
binding.rvRecent.adapter = adapter binding.rvRecent.adapter = adapter
...@@ -84,6 +63,35 @@ class FileFragment : BaseFragment<FragmentFileBinding>() { ...@@ -84,6 +63,35 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
} }
} }
companion object {
@SuppressLint("QueryPermissionsNeeded")
fun moreAction(context: Context, archView: View, bean: MediaBean, adapter: MediaAdapter) {
context.showMediaMoreDialog(archView,
deleteAction = {
context.showDeleteTipDialog {
runCatching { File(bean.path).delete() }
adapter.removeData(bean)
}
},
shareAction = {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
type = bean.mimeType
putExtra(Intent.EXTRA_STREAM, bean.uri)
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
// 可以添加更多额外信息,如主题、文本等
}
val chooserIntent = Intent.createChooser(shareIntent, "Share File")
if (shareIntent.resolveActivity(context.packageManager) != null) {
context.startActivity(chooserIntent)
} else {
Toast.makeText(context, "no app can share the file", Toast.LENGTH_SHORT).show()
}
})
}
}
override fun setListener() { override fun setListener() {
super.setListener() super.setListener()
...@@ -110,6 +118,21 @@ class FileFragment : BaseFragment<FragmentFileBinding>() { ...@@ -110,6 +118,21 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
putExtra("tittle", "Document") putExtra("tittle", "Document")
}) })
} }
binding.llApk.setOnClickListener {
requireActivity().startActivity(Intent(requireContext(), MediaBrowserActivity::class.java).apply {
putExtra("tittle", "APK")
})
}
binding.llMusic.setOnClickListener {
requireActivity().startActivity(Intent(requireContext(), MediaBrowserActivity::class.java).apply {
putExtra("tittle", "Music")
})
}
binding.llZip.setOnClickListener {
requireActivity().startActivity(Intent(requireContext(), MediaBrowserActivity::class.java).apply {
putExtra("tittle", "Zip")
})
}
} }
......
...@@ -5,6 +5,7 @@ import android.database.Cursor ...@@ -5,6 +5,7 @@ import android.database.Cursor
import android.net.Uri import android.net.Uri
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_APK
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_AUDIO
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_DOC 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_DOCX
import com.base.browserwhite.bean.ConstObject.MIME_TYPE_IMAGE import com.base.browserwhite.bean.ConstObject.MIME_TYPE_IMAGE
...@@ -38,7 +39,7 @@ object MediaStoreUtils { ...@@ -38,7 +39,7 @@ object MediaStoreUtils {
val mimeTypeSelectionArgs = selectionArgs ?: arrayOf( val mimeTypeSelectionArgs = selectionArgs ?: arrayOf(
MIME_TYPE_IMAGE, MIME_TYPE_IMAGE,
MIME_TYPE_VIDEO, MIME_TYPE_VIDEO,
// MIME_TYPE_AUDIO, MIME_TYPE_AUDIO,
MIME_TYPE_PDF, MIME_TYPE_PDF,
MIME_TYPE_DOC, MIME_TYPE_DOC,
MIME_TYPE_DOCX, MIME_TYPE_DOCX,
...@@ -188,6 +189,39 @@ object MediaStoreUtils { ...@@ -188,6 +189,39 @@ object MediaStoreUtils {
return list return list
} }
fun Context.getMediaAudio(): List<MediaBean> {
val list = arrayListOf<MediaBean>()
val contentResolver = this.contentResolver
// 定义查询的Uri和列
val baseUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.MIME_TYPE)
// 执行查询
var cursor: Cursor? = null
try {
cursor = contentResolver.query(baseUri, projection, null, null, null)
if (cursor != null) {
while (cursor.moveToNext()) {
val id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID))
val uri = Uri.withAppendedPath(baseUri, id.toString())
val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))
val mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE))
list.add(MediaBean(path = path, uri = uri, mimeType = mimeType))
}
}
} catch (e: Exception) {
} finally {
cursor?.close()
}
return list
}
fun Context.getMediaVideoSize(): Int { fun Context.getMediaVideoSize(): Int {
var count = 0 var count = 0
......
...@@ -401,6 +401,7 @@ ...@@ -401,6 +401,7 @@
<LinearLayout <LinearLayout
android:id="@+id/ll_apk"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
...@@ -437,6 +438,7 @@ ...@@ -437,6 +438,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/ll_music"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
...@@ -473,6 +475,7 @@ ...@@ -473,6 +475,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/ll_zip"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
......
<?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"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:id="@+id/card"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginVertical="4dp"
android:layout_marginStart="8dp"
app:cardElevation="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_shipin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/h_shipin"
android:visibility="gone"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
<LinearLayout
android:id="@+id/ll"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="5dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/fl_more"
app:layout_constraintStart_toEndOf="@id/card"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:text="Screenshot 20240805 103…"
android:textColor="#010101"
android:textSize="17sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="358KB"
android:textColor="#6B6B6D"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<FrameLayout
android:id="@+id/fl_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="?android:attr/selectableItemBackground"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/geduo"
tools:ignore="ContentDescription" />
</FrameLayout>
<View
android:layout_width="0dp"
android:layout_height="1px"
android:background="#E5E6EB"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/ll" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ 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