diff --git a/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt b/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt index e00b13009..ff7cbb0c8 100644 --- a/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt @@ -27,6 +27,7 @@ import com.aurora.store.PermissionType import com.aurora.store.R import com.aurora.store.util.Log import com.aurora.store.util.PackageUtil +import com.aurora.store.util.PathUtil @SuppressLint("NewApi") class PermissionProvider : ActivityResultCallback { @@ -96,10 +97,13 @@ class PermissionProvider : ActivityResultCallback { else -> { val intent = knownPermissions()[permissionType] ?: return - if (permissionType == PermissionType.STORAGE_MANAGER - && !isGranted(PermissionType.INSTALL_UNKNOWN_APPS) - ) { - context.toast(R.string.toast_permission_installer_required) + if (permissionType == PermissionType.STORAGE_MANAGER) { + if (!isGranted(PermissionType.INSTALL_UNKNOWN_APPS)) { + context.toast(R.string.toast_permission_installer_required) + } else { + context.toast(R.string.toast_permission_esm_caution) + intentLauncher.launch(intent) + } } else { intentLauncher.launch(intent) } @@ -115,7 +119,7 @@ class PermissionProvider : ActivityResultCallback { fun isGranted(permissionType: PermissionType): Boolean { return when (permissionType) { PermissionType.EXTERNAL_STORAGE, - PermissionType.STORAGE_MANAGER -> context.isExternalStorageAccessible() + PermissionType.STORAGE_MANAGER -> context.isExternalStorageAccessible() && PathUtil.canReadWriteOBB() PermissionType.POST_NOTIFICATIONS -> context.checkManifestPermission(Manifest.permission.POST_NOTIFICATIONS) PermissionType.INSTALL_UNKNOWN_APPS -> PackageUtil.canRequestPackageInstalls(context) diff --git a/app/src/main/java/com/aurora/store/util/PathUtil.kt b/app/src/main/java/com/aurora/store/util/PathUtil.kt index 9650aa5df..c2228277c 100644 --- a/app/src/main/java/com/aurora/store/util/PathUtil.kt +++ b/app/src/main/java/com/aurora/store/util/PathUtil.kt @@ -69,7 +69,7 @@ object PathUtil { file: GPlayFile, sharedLibPackageName: String? = null ): File { - val downloadDir = if (!sharedLibPackageName.isNullOrBlank()) { + val downloadDir = if (!sharedLibPackageName.isNullOrBlank()) { getLibDownloadDir(context, packageName, versionCode, sharedLibPackageName) } else { File(getPackageDirectory(context, packageName), versionCode.toString()) @@ -109,5 +109,15 @@ object PathUtil { file.createNewFile() return file } + + fun canReadWriteOBB(): Boolean { + return canReadWriteDir( + Environment.getExternalStorageDirectory().toString() + "/Android/obb/" + ) + } + + private fun canReadWriteDir(dir: String): Boolean { + return File(dir).let { it.exists() && it.canRead() && it.canWrite() } + } } diff --git a/app/src/main/java/com/aurora/store/util/Preferences.kt b/app/src/main/java/com/aurora/store/util/Preferences.kt index a4dabc29a..f6ef87476 100644 --- a/app/src/main/java/com/aurora/store/util/Preferences.kt +++ b/app/src/main/java/com/aurora/store/util/Preferences.kt @@ -105,7 +105,11 @@ object Preferences { return getPrefs(context).getString(key, default).toString() } - fun getStringSet(context: Context, key: String, default: Set = emptySet()): Set { + fun getStringSet( + context: Context, + key: String, + default: Set = emptySet() + ): Set { return getPrefs(context).getStringSet(key, default) ?: emptySet() } diff --git a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt index c32818dd2..6d4210741 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt @@ -47,6 +47,7 @@ import com.aurora.extensions.share import com.aurora.extensions.show import com.aurora.extensions.toast import com.aurora.gplayapi.data.models.App +import com.aurora.gplayapi.data.models.File import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.StreamBundle import com.aurora.gplayapi.data.models.StreamCluster @@ -639,8 +640,13 @@ class AppDetailsFragment : BaseFragment() { } else if (app.versionCode == 0) { toast(R.string.toast_app_unavailable) } else { - btn.setText(R.string.download_metadata) - startDownload() + val hasOBB = app.fileList.any { it.type == File.FileType.OBB } + if (hasOBB && !PathUtil.canReadWriteOBB()) { + permissionProvider.request(PermissionType.STORAGE_MANAGER) + } else { + btn.setText(R.string.download_metadata) + startDownload() + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index af3b6a4c4..c36ec7db4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -310,6 +310,7 @@ Turn on developer settings from the device settings to open them. "Permission granted" "You need to grant Installer Permission first" + "You may have to re-grant the permission due to bug in Storage Access Framework" Device spoof applied. "App purchases not available on Anonymous accounts." "The version code you are requesting is unavailable."