Browse Source

排序扩展方法、获取文件管理权限Launcher

liuxiaolong 2 years ago
parent
commit
a0896b07ea

+ 15 - 1
lib_common/src/main/java/com/convenient/android/common/activitycontracts/BaseActivityResultLauncher.kt

@@ -4,6 +4,9 @@ import androidx.activity.result.ActivityResultCallback
 import androidx.activity.result.ActivityResultCaller
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContract
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlin.coroutines.resume
 
 /**
  * @classname BaseActivityResultLauncher
@@ -34,5 +37,16 @@ open class BaseActivityResultLauncher<I, O>(
     fun launch(input: I) {
         launcher.launch(input)
     }
+}
 
-}
+
+suspend fun <I, O> BaseActivityResultLauncher<I, O>.launchForResult(input : I) =
+    suspendCancellableCoroutine<O> { cancellableContinuation ->
+        launch(input){
+            if (it != null){
+                cancellableContinuation.resume(it)
+            }else{
+                cancellableContinuation.cancel()
+            }
+        }
+    }

+ 44 - 0
lib_common/src/main/java/com/convenient/android/common/activitycontracts/permission/ManageAppAllFilesAccessPermissionLauncher.kt

@@ -0,0 +1,44 @@
+package com.convenient.android.common.activitycontracts.permission
+
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Build
+import android.os.Environment
+import android.provider.Settings
+import androidx.activity.result.ActivityResultCaller
+import androidx.activity.result.contract.ActivityResultContract
+import com.convenient.android.common.activitycontracts.BaseActivityResultLauncher
+
+/**
+ * @classname:
+ * @author: LiuXiaoLong
+ * @date: 2022/8/4
+ * description:
+ */
+/**
+ * 获取APP管理所有文件权限启动器
+ */
+class ManageAppAllFilesAccessPermissionLauncher(cells: ActivityResultCaller) : BaseActivityResultLauncher<Unit, Boolean>(cells, ManageAppAllFilesAccessPermissionContracts()) {
+}
+
+
+/**
+ * 跳转到设置 APP 获取所有文件管理权限跳转协议
+ */
+class ManageAppAllFilesAccessPermissionContracts : ActivityResultContract<Unit, Boolean>() {
+
+    override fun createIntent(context: Context, input: Unit?): Intent {
+        return Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package:${context.packageName}"))
+    }
+
+    override fun parseResult(resultCode: Int, intent: Intent?): Boolean {
+        return if (resultCode == Activity.RESULT_OK && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            Environment.isExternalStorageManager()
+        } else {
+            false
+        }
+    }
+
+}

+ 18 - 0
lib_common/src/main/java/com/convenient/android/common/extension/ListExtensions.kt

@@ -0,0 +1,18 @@
+package com.convenient.android.common.extension
+
+import com.convenient.android.common.media.config.MediaSortOrder
+import com.convenient.android.common.media.config.SortUtils
+
+/**
+ * @classname:
+ * @auther: LiuXiaoLong
+ * @date: 2022/8/4
+ * description:
+ */
+
+/**
+ * 排序扩展方法
+ */
+fun <T, R : Comparable<R>> List<T>.sort(order: MediaSortOrder, selector: (T) -> R?) : List<T>{
+    return SortUtils.sort(order, data = this, selector = selector)
+}

+ 0 - 20
lib_common/src/main/java/com/convenient/android/common/media/Media.kt

@@ -1,20 +0,0 @@
-package com.convenient.android.common.media
-
-import com.convenient.android.common.media.scan.FileStore
-import com.convenient.android.common.media.scan.MediaStore
-
-/**
- * @classname:
- * @author: LiuXiaoLong
- * @date: 2022/8/3
- * description:
- */
-object Media {
-
-
-    fun queryByFiles() : FileStore = FileStore
-
-
-    fun queryByMediaStore() : MediaStore = MediaStore
-
-}

+ 0 - 2
lib_common/src/main/java/com/convenient/android/common/media/config/MediaQueryConfig.kt

@@ -8,8 +8,6 @@ import java.io.File
  * @date: 2022/8/2
  * description: 文件媒体查询的配置
  */
-
-
 class MediaQueryConfig {
 
     /**

+ 0 - 2
lib_common/src/main/java/com/convenient/android/common/media/config/SortUtils.kt

@@ -28,6 +28,4 @@ object SortUtils {
 
 
 
-
-
 }

+ 24 - 42
lib_common/src/main/java/com/convenient/android/common/utils/IntentUtil.kt

@@ -19,16 +19,6 @@ import java.io.File
 object IntentUtil {
 
 
-    fun addPicture(activity: Activity, intent: Intent, requestCode: Int) {
-        try {
-            activity.startActivityForResult(intent, requestCode)
-        } catch (e: Exception) {
-            e.printStackTrace()
-            ToastUtil.Companion.showToast(activity, R.string.activity_not_found)
-        }
-    }
-
-
     /**
      * @description 打开浏览器
      * @param context 上下文
@@ -68,13 +58,32 @@ object IntentUtil {
         }
     }
 
+    /**
+     * @param :[context, packageName]
+     * @return : void
+     * @methodName :readyToAppOrMarket created by luozhipeng on 5/12/17 13:28.
+     * @description :传入包名,如果应该已安装就打开应用 如果没有安装就进入应用市场
+     */
+    fun readyToAppOrMarket(context: Context, packageName: String) {
+        if (PackageUtil.isInstallSoftware(context, packageName)) {
+            var intent: Intent? = context.packageManager.getLaunchIntentForPackage(packageName)
+            if (intent != null) {
+                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED or Intent.FLAG_ACTIVITY_CLEAR_TOP
+                context.applicationContext.startActivity(intent)
+            }
+        } else {
+            openMarket(context, packageName, true)
+        }
+    }
+
 
 
     /**
-     * 邮件反馈
+     * 发送邮件
      * @param email 收件人邮箱
+     * @param content 邮件内容
      */
-    fun reportUs(context: Context, email: String, content : String) {
+    fun sendEmail(context: Context, email: String, content : String) {
         try {
             context.startActivity(Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:${email}")).apply {
                 putExtra(Intent.EXTRA_SUBJECT, content)
@@ -92,10 +101,8 @@ object IntentUtil {
      * @param title 主题
      * @param content 邮件正文
      * @param file 附件
-     * @param errorToastMsg 错误的提示
      */
-    fun reportUs(context: Context, addressee: String, title: String?, content: String?, file: File?, chooserTitle: String = "") {
-
+    fun sendEmailWithFile(context: Context, addressee: String, title: String?, content: String?, file: File?, chooserTitle: String = "") {
         try {
             val intent = Intent(Intent.ACTION_SEND).apply {
                 type = "plain/text"
@@ -120,7 +127,7 @@ object IntentUtil {
      * @param file 分享的文件
      *
      */
-    fun share(context: Context, title: String, type: String, file: File?) {
+    fun shareFile(context: Context, title: String, type: String, file: File?) {
         try {
             val intent = Intent(Intent.ACTION_SEND)
             intent.type = type
@@ -134,32 +141,7 @@ object IntentUtil {
         }
     }
 
-    /**
-     * @param :[context, packageName]
-     * @return : void
-     * @methodName :readyToAppOrMarket created by luozhipeng on 5/12/17 13:28.
-     * @description :传入包名,如果应该已安装就打开应用 如果没有安装就进入应用市场
-     */
-    fun readyToAppOrMarket(context: Context, packageName: String) {
-        if (PackageUtil.isInstallSoftware(context, packageName)) {
-            var intent: Intent? = context.packageManager.getLaunchIntentForPackage(packageName)
-            if (intent != null) {
-                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED or Intent.FLAG_ACTIVITY_CLEAR_TOP
-                context.applicationContext.startActivity(intent)
-            }
-        } else {
-            try {
-                val intent = Intent(Intent.ACTION_VIEW).apply {
-                    flags = Intent.FLAG_ACTIVITY_NEW_TASK
-                    data = Uri.parse("market://details?id=${packageName}")
-                }
-                context.applicationContext.startActivity(intent)
-            } catch (e: ActivityNotFoundException) {
-                e.printStackTrace()
-                ToastUtil.Companion.showToast(context, R.string.activity_not_found)
-            }
-        }
-    }
+
 
 
     /**