mirror of
https://github.com/geode-sdk/android-launcher.git
synced 2026-10-21 16:32:39 +00:00
use all files permission on newer devices
This commit is contained in:
1 file changed
+49
-21
@@ -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,31 +194,38 @@ 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,
|
} else {
|
||||||
Manifest.permission.READ_MEDIA_VIDEO
|
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 {
|
} else {
|
||||||
listOf(
|
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()!!
|
||||||
|
|
||||||
val needsPermissions = permissions.filter {
|
val needsPermissions = permissions.filter {
|
||||||
ContextCompat.checkSelfPermission(context, it) != PackageManager.PERMISSION_GRANTED
|
ContextCompat.checkSelfPermission(context, it) != PackageManager.PERMISSION_GRANTED
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needsPermissions.isNotEmpty()) {
|
if (needsPermissions.isNotEmpty()) {
|
||||||
internalRequestPermissionsLauncher.launch(needsPermissions.toTypedArray())
|
internalRequestPermissionsLauncher.launch(needsPermissions.toTypedArray())
|
||||||
afterRequestPermissions = onSuccess
|
afterRequestPermissions = onSuccess
|
||||||
afterRequestPermissionsFailure = onFailure
|
afterRequestPermissionsFailure = onFailure
|
||||||
} else {
|
} else {
|
||||||
onSuccess()
|
onSuccess()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user