mark Android dir as restricted on API31+

This commit is contained in:
Thibault Deckers 2022-04-18 11:58:51 +09:00
parent c904c395a3
commit edd859ad47

View file

@ -103,7 +103,7 @@ object PermissionManager {
if (relativeDir != null) { if (relativeDir != null) {
val dirSegments = relativeDir.split(File.separator).takeWhile { it.isNotEmpty() } val dirSegments = relativeDir.split(File.separator).takeWhile { it.isNotEmpty() }
val primaryDir = dirSegments.firstOrNull() val primaryDir = dirSegments.firstOrNull()
if (primaryDir == Environment.DIRECTORY_DOWNLOADS && dirSegments.size > 1) { if (getRestrictedPrimaryDirectories().contains(primaryDir) && dirSegments.size > 1) {
// request secondary directory (if any) for restricted primary directory // request secondary directory (if any) for restricted primary directory
dirSet.add(dirSegments.take(2).joinToString(File.separator)) dirSet.add(dirSegments.take(2).joinToString(File.separator))
} else { } else {
@ -185,11 +185,25 @@ object PermissionManager {
return accessibleDirs return accessibleDirs
} }
private fun getRestrictedPrimaryDirectories(): List<String> {
val dirs = ArrayList<String>()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// cf https://developer.android.com/about/versions/11/privacy/storage#directory-access
dirs.add(Environment.DIRECTORY_DOWNLOADS)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// by observation, no documentation
dirs.add("Android")
}
}
return dirs
}
// cf https://developer.android.com/about/versions/11/privacy/storage#directory-access
fun getRestrictedDirectories(context: Context): List<Map<String, String>> { fun getRestrictedDirectories(context: Context): List<Map<String, String>> {
val dirs = ArrayList<Map<String, String>>() val dirs = ArrayList<Map<String, String>>()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// cf https://developer.android.com/about/versions/11/privacy/storage#directory-access
val volumePaths = StorageUtils.getVolumePaths(context) val volumePaths = StorageUtils.getVolumePaths(context)
dirs.addAll(volumePaths.map { dirs.addAll(volumePaths.map {
hashMapOf( hashMapOf(
@ -197,12 +211,14 @@ object PermissionManager {
"relativeDir" to "", "relativeDir" to "",
) )
}) })
dirs.addAll(volumePaths.map { for (relativeDir in getRestrictedPrimaryDirectories()) {
hashMapOf( dirs.addAll(volumePaths.map {
"volumePath" to it, hashMapOf(
"relativeDir" to Environment.DIRECTORY_DOWNLOADS, "volumePath" to it,
) "relativeDir" to relativeDir,
}) )
})
}
} else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT
|| Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT_WATCH || Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT_WATCH
) { ) {