use all files permission on newer devices

This commit is contained in:
qimiko committed 2024-02-02 00:04:07 -07:00
1 parent 9f58e76f97
commit e806ec223a
1 file changed
+39 -11
@@ -9,7 +9,9 @@ import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Environment
import android.provider.DocumentsContract import android.provider.DocumentsContract
import android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
@@ -17,6 +19,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import com.geode.launcher.BuildConfig
import com.geode.launcher.R import com.geode.launcher.R
import com.geode.launcher.activityresult.GeodeOpenFileActivityResult import com.geode.launcher.activityresult.GeodeOpenFileActivityResult
import com.geode.launcher.activityresult.GeodeOpenFilesActivityResult import com.geode.launcher.activityresult.GeodeOpenFilesActivityResult
@@ -34,6 +37,7 @@ object GeodeUtils {
private lateinit var saveFileResultLauncher: ActivityResultLauncher<GeodeSaveFileActivityResult.SaveFileParams> private lateinit var saveFileResultLauncher: ActivityResultLauncher<GeodeSaveFileActivityResult.SaveFileParams>
private lateinit var requestPermissionLauncher: ActivityResultLauncher<String> private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>
private lateinit var internalRequestPermissionsLauncher: ActivityResultLauncher<Array<String>> private lateinit var internalRequestPermissionsLauncher: ActivityResultLauncher<Array<String>>
private lateinit var internalRequestAllFilesLauncher: ActivityResultLauncher<Intent>
private var afterRequestPermissions: (() -> Unit)? = null private var afterRequestPermissions: (() -> Unit)? = null
private var afterRequestPermissionsFailure: (() -> Unit)? = null private var afterRequestPermissionsFailure: (() -> Unit)? = null
@@ -93,12 +97,26 @@ object GeodeUtils {
if (isGranted) { if (isGranted) {
afterRequestPermissions?.invoke() afterRequestPermissions?.invoke()
} else { } else {
Toast.makeText(activity, activity.getString(R.string.missing_permissions), Toast.LENGTH_SHORT) Toast.makeText(activity, R.string.missing_permissions, Toast.LENGTH_SHORT)
.show() .show()
afterRequestPermissionsFailure?.invoke() afterRequestPermissionsFailure?.invoke()
} }
} }
// only necessary on newer android versions
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S_V2) {
internalRequestAllFilesLauncher = activity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { _ ->
if (Environment.isExternalStorageManager()) {
afterRequestPermissions?.invoke()
} else {
Toast.makeText(activity, R.string.missing_permissions, Toast.LENGTH_SHORT)
.show()
afterRequestPermissionsFailure?.invoke()
}
}
}
} }
@JvmStatic @JvmStatic
@@ -153,9 +171,12 @@ object GeodeUtils {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
intent.addCategory(Intent.CATEGORY_OPENABLE) intent.addCategory(Intent.CATEGORY_OPENABLE)
DocumentFile.fromFile(File(path)).also {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, it.uri) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val documentFile = DocumentFile.fromFile(File(path))
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, documentFile.uri)
} }
intent.setType("*/*") intent.setType("*/*")
if (intent.resolveActivity(packageManager) != null) { if (intent.resolveActivity(packageManager) != null) {
@@ -173,18 +194,24 @@ object GeodeUtils {
private external fun failedCallback() private external fun failedCallback()
private fun checkForFilePermissions(onSuccess: () -> Unit, onFailure: () -> Unit) { private fun checkForFilePermissions(onSuccess: () -> Unit, onFailure: () -> Unit) {
val permissions = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S_V2) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S_V2) {
listOf( if (Environment.isExternalStorageManager()) {
Manifest.permission.READ_MEDIA_AUDIO, onSuccess()
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_MEDIA_VIDEO
)
} else { } else {
listOf( val intent = Intent(
ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
Uri.fromParts("package", BuildConfig.APPLICATION_ID, null)
)
internalRequestAllFilesLauncher.launch(intent)
afterRequestPermissions = onSuccess
afterRequestPermissionsFailure = onFailure
}
} else {
val permissions = listOf(
Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE Manifest.permission.WRITE_EXTERNAL_STORAGE
) )
}
val context = activity.get()!! val context = activity.get()!!
@@ -200,6 +227,7 @@ object GeodeUtils {
onSuccess() onSuccess()
} }
} }
}
@JvmStatic @JvmStatic
fun selectFile(path: String): Boolean { fun selectFile(path: String): Boolean {