Commit f87e78be authored by wanglei's avatar wanglei

...

parent 5c6f3887
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!--required设置为true,无相机设备google play上不会分发-->
<!-- required设置为true,无相机设备google play上不会分发 -->
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
......@@ -38,6 +34,12 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activity.mediabrowser.MediaBrowserActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.activity.webstore.WevStoreActivity"
android:exported="false"
......@@ -69,11 +71,9 @@
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<service
android:name=".service.StayNotificationService"
android:foregroundServiceType="dataSync" />
</application>
</manifest>
\ No newline at end of file
package com.base.browserwhite.ui.activity.mediabrowser
import android.graphics.Color
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
import com.base.browserwhite.databinding.ActivityMediaBrowserBinding
import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.ui.adapter.MediaAdapter
import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.MediaStoreUtils.getMediaPhoto
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class MediaBrowserActivity : BaseActivity<ActivityMediaBrowserBinding>() {
override val binding: ActivityMediaBrowserBinding by lazy {
ActivityMediaBrowserBinding.inflate(layoutInflater)
}
private lateinit var adapter: MediaAdapter
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
val tittle = intent.extras?.getString("tittle") ?: ""
binding.tvTitle.text = tittle
when (tittle) {
"Picture" -> {
adapter = MediaAdapter(1)
binding.rv.layoutManager = GridLayoutManager(this, 4).apply {
spanSizeLookup = object : SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
// 根据item的类型或数据来决定占据的列数
return 1
}
}
}
}
}
binding.rv.adapter = adapter
initData()
}
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback {
finishToMain()
}
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
}
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val mediaList = getMediaPhoto()
launch(Dispatchers.Main) {
adapter.setData(mediaList)
}
}
}
\ No newline at end of file
......@@ -15,19 +15,31 @@ 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.databinding.ItemMediaPictureBinding
import com.base.browserwhite.databinding.ItemMediaRecentBinding
import com.base.browserwhite.utils.KotlinExt.toFormatSize
import com.base.browserwhite.utils.XmlEx.inflate
import com.bumptech.glide.Glide
import java.io.File
class MediaAdapter(val moreAction: (view: View, bean: MediaBean) -> Unit) : RecyclerView.Adapter<MediaAdapter.MediaViewHolder>() {
class MediaAdapter(
val uiType: Int,
val clickAction: ((bean: MediaBean) -> Unit)? = null,
val moreAction: ((view: View, bean: MediaBean) -> Unit)? = null
) :
RecyclerView.Adapter<MediaAdapter.MediaViewHolder>() {
private val beanList = arrayListOf<MediaBean>()
inner class MediaViewHolder(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MediaViewHolder {
if (uiType == 0) {
return MediaViewHolder(R.layout.item_media_recent.inflate(parent))
}
if (uiType == 1) {
return MediaViewHolder(R.layout.item_media_picture.inflate(parent))
}
return MediaViewHolder(R.layout.item_media_recent.inflate(parent))
}
......@@ -36,10 +48,13 @@ class MediaAdapter(val moreAction: (view: View, bean: MediaBean) -> Unit) : Recy
}
override fun onBindViewHolder(holder: MediaViewHolder, position: Int) {
val binding = ItemMediaRecentBinding.bind(holder.itemView)
val context = holder.itemView.context
val bean = beanList[position]
if (uiType == 0) {
val binding = ItemMediaRecentBinding.bind(holder.itemView)
binding.ivShipin.visibility = View.GONE
when {
bean.mimeType.contains("image") -> {
......@@ -81,10 +96,21 @@ class MediaAdapter(val moreAction: (view: View, bean: MediaBean) -> Unit) : Recy
binding.tvSize.text = file.length().toFormatSize()
binding.flMore.setOnClickListener {
moreAction.invoke(it, bean)
moreAction?.invoke(it, bean)
}
binding.root.setOnClickListener {
clickAction?.invoke(bean)
}
} else if (uiType == 1) {
val binding = ItemMediaPictureBinding.bind(holder.itemView)
Glide.with(context).load(bean.path).centerCrop().into(binding.iv)
binding.root.setOnClickListener {
clickAction?.invoke(bean)
}
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(mediaList: List<MediaBean>) {
beanList.clear()
......
......@@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.databinding.FragmentFileBinding
import com.base.browserwhite.ui.activity.MainActivity
import com.base.browserwhite.ui.activity.mediabrowser.MediaBrowserActivity
import com.base.browserwhite.ui.adapter.MediaAdapter
import com.base.browserwhite.ui.views.DialogViews.showMediaMoreDialog
import com.base.browserwhite.utils.KotlinExt.toFormatSize
......@@ -23,7 +24,7 @@ import com.base.browserwhite.utils.MediaStoreUtils.getMediaDocumentSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaPhotoSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaVideoSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaZipSize
import com.base.browserwhite.utils.MediaStoreUtils.getRecentMedia
import com.base.browserwhite.utils.MediaStoreUtils.getMediaFile
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import kotlinx.coroutines.Dispatchers
......@@ -45,7 +46,11 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
override fun setView() {
showStorage()
adapter = MediaAdapter { view, bean ->
adapter = MediaAdapter(0,
clickAction = {
},
moreAction = { view, bean ->
requireContext().showMediaMoreDialog(view, deleteAction = {}, shareAction = {
LogEx.logDebug(TAG, "uri=${bean.uri}")
......@@ -64,7 +69,7 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
Toast.makeText(requireContext(), "no app can share the file", Toast.LENGTH_SHORT).show()
}
})
}
})
binding.rvRecent.adapter = adapter
if (requireContext().checkStorePermission()) {
......@@ -83,6 +88,12 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
}
}
}
binding.llPicture.setOnClickListener {
requireActivity().startActivity(Intent(requireContext(), MediaBrowserActivity::class.java).apply {
putExtra("tittle", "Picture")
})
}
}
......@@ -142,7 +153,7 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
}
val mediaList = requireContext().getRecentMedia().filter {
val mediaList = requireContext().getMediaFile().filter {
val file = File(it.path)
System.currentTimeMillis() - file.lastModified() <= 15L * 24 * 60 * 60 * 1000
}
......
package com.base.browserwhite.ui.fragment
import android.content.Intent
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
......@@ -21,10 +20,6 @@ import com.base.browserwhite.ui.activity.webstore.WevStoreActivity
import com.base.browserwhite.ui.adapter.WebsiteAdapter
import com.base.browserwhite.ui.views.DialogViews.showSearchEngineDialog
import com.base.browserwhite.ui.views.itemtouch.MyItemTouchHelperCallBack
import com.base.browserwhite.utils.MediaStoreUtils
import com.base.browserwhite.utils.MediaStoreUtils.getRecentMedia
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import kotlinx.coroutines.launch
class HomeFragment : BaseFragment<FragmentHomeBinding>() {
......
......@@ -21,7 +21,9 @@ import com.base.browserwhite.bean.MediaBean
object MediaStoreUtils {
private val TAG = "MediaStoreUtils"
fun Context.getRecentMedia(): ArrayList<MediaBean> {
//图片视频音频不用这个查
fun Context.getMediaFile(selectionArgs: Array<String>? = null): ArrayList<MediaBean> {
val list = arrayListOf<MediaBean>()
......@@ -31,10 +33,9 @@ object MediaStoreUtils {
// MediaStore.Files.FileColumns.TITLE,
MediaStore.Files.FileColumns.MIME_TYPE,
// MediaStore.Files.FileColumns.SIZE,
MediaStore.Files.FileColumns.DATE_ADDED
)
val mimeTypeSelectionArgs = arrayOf(
val mimeTypeSelectionArgs = selectionArgs ?: arrayOf(
MIME_TYPE_IMAGE,
MIME_TYPE_VIDEO,
// MIME_TYPE_AUDIO,
......@@ -48,9 +49,11 @@ object MediaStoreUtils {
MIME_TYPE_APK
)
val mimeTypeSelection =
val mimeTypeSelection = if (mimeTypeSelectionArgs.size == 1) {
"${MediaStore.Files.FileColumns.MIME_TYPE} = ?"
} else {
"${MediaStore.Files.FileColumns.MIME_TYPE} IN (" + mimeTypeSelectionArgs.joinToString(",") { "?" } + ")"
}
// val selection = "$timeSelection AND $mimeTypeSelection"
val selection = mimeTypeSelection
......@@ -64,7 +67,7 @@ object MediaStoreUtils {
MediaStore.Files.getContentUri("external"),
projection,
selection,
mimeTypeSelectionArgs,
selectionArgs ?: mimeTypeSelectionArgs,
MediaStore.Files.FileColumns.DATE_ADDED + " DESC"
)
if (cursor != null) {
......@@ -120,6 +123,38 @@ object MediaStoreUtils {
return count
}
fun Context.getMediaPhoto(): List<MediaBean> {
val list = arrayListOf<MediaBean>()
val contentResolver = this.contentResolver
// 定义查询的Uri和列
val baseUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Images.Media._ID, MediaStore.Files.FileColumns.DATA)
// 执行查询
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.Files.FileColumns._ID))
val uri = Uri.withAppendedPath(baseUri, id.toString())
val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA))
list.add(MediaBean(path = path, uri = uri))
}
}
} catch (e: Exception) {
} finally {
cursor?.close()
}
return list
}
fun Context.getMediaVideoSize(): Int {
var count = 0
runCatching {
......
<?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="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<FrameLayout
android:id="@+id/fl_fanhui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp"
tools:ignore="UselessParent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/h_fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="@color/black"
android:textSize="19sp"
android:textStyle="bold"
tools:text="Picture" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
\ No newline at end of file
......@@ -276,6 +276,7 @@
tools:ignore="DisableBaselineAlignment">
<LinearLayout
android:id="@+id/ll_picture"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
......
<?xml version="1.0" encoding="utf-8"?>
<ImageView 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/iv"
android:layout_width="match_parent"
android:layout_height="95dp"
android:layout_margin="3dp"
tools:ignore="ContentDescription" />
\ No newline at end of file
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>
\ No newline at end of file
<resources>
<dimen name="fab_margin">200dp</dimen>
</resources>
\ No newline at end of file
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>
\ No newline at end of file
......@@ -8,4 +8,5 @@
<dimen name="dp_15">15dp</dimen>
<dimen name="dp_150">150dp</dimen>
<dimen name="dp_30">30dp</dimen>
<dimen name="fab_margin">16dp</dimen>
</resources>
\ No newline at end of file
......@@ -12,6 +12,8 @@ constraintlayout = "2.1.4"
navigationFragmentKtx = "2.6.0"
navigationUiKtx = "2.6.0"
viewbinding = "8.5.1"
navigationFragmentKtxVersion = "2.6.0"
navigationUiKtxVersion = "2.6.0"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
......@@ -22,6 +24,8 @@ androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtxVersion" }
androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtxVersion" }
[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