diff --git a/app/src/main/java/app/gamenative/PrefManager.kt b/app/src/main/java/app/gamenative/PrefManager.kt index bd4bc3ab8..eb78ec986 100644 --- a/app/src/main/java/app/gamenative/PrefManager.kt +++ b/app/src/main/java/app/gamenative/PrefManager.kt @@ -826,6 +826,14 @@ object PrefManager { setPref(DOWNLOAD_SPEED, value) } + private val SD_CARD_CAP = booleanPreferencesKey("sd_card_cap") + var sdCardCap: Boolean + get() = getPref(SD_CARD_CAP, false) + set(value) { + Timber.d("Setting SD_CARD_CAP to $value") + setPref(SD_CARD_CAP, value) + } + private val USE_EXTERNAL_STORAGE = booleanPreferencesKey("use_external_storage") var useExternalStorage: Boolean get() = getPref(USE_EXTERNAL_STORAGE, false) diff --git a/app/src/main/java/app/gamenative/service/SteamService.kt b/app/src/main/java/app/gamenative/service/SteamService.kt index 0ab6a7a20..d0f243d37 100644 --- a/app/src/main/java/app/gamenative/service/SteamService.kt +++ b/app/src/main/java/app/gamenative/service/SteamService.kt @@ -1475,6 +1475,9 @@ class SteamService : Service(), IChallengeUrlChanged { // Some notes here: // Write should always be 1 in mobile device, as normally it does not use a SSD for storage // And to have maximum throughput, set downloadRatio = decompressRatio = 1.0 x CPU Cores + //Update: This does not seem to hold true for external storage, and especially SD cards + //Initial testing seems to indicate decompress should be one thread only, and download threads only slightly higher + var downloadRatio = 0.0 var decompressRatio = 0.0 @@ -1499,7 +1502,7 @@ class SteamService : Service(), IChallengeUrlChanged { val cpuCores = Runtime.getRuntime().availableProcessors() val maxDownloads = (cpuCores * downloadRatio).toInt().coerceAtLeast(1) - val maxDecompress = (cpuCores * decompressRatio).toInt().coerceAtLeast(1) + val maxDecompress = if (PrefManager.sdCardCap && PrefManager.useExternalStorage) 2 else (cpuCores * decompressRatio).toInt().coerceAtLeast(1) Timber.i("CPU Cores: $cpuCores") Timber.i("maxDownloads: $maxDownloads") diff --git a/app/src/main/java/app/gamenative/ui/screen/settings/SettingsGroupInterface.kt b/app/src/main/java/app/gamenative/ui/screen/settings/SettingsGroupInterface.kt index 8d04e6849..c9601d4fc 100644 --- a/app/src/main/java/app/gamenative/ui/screen/settings/SettingsGroupInterface.kt +++ b/app/src/main/java/app/gamenative/ui/screen/settings/SettingsGroupInterface.kt @@ -591,7 +591,9 @@ fun SettingsGroupInterface( sm.getStorageVolume(dir)?.getDescription(ctx) ?: dir.name } } + var useExternalStorage by rememberSaveable { mutableStateOf(PrefManager.useExternalStorage) } + var sdCardCap by rememberSaveable {mutableStateOf(PrefManager.sdCardCap)} SettingsSwitch( colors = settingsTileColorsAlt(), enabled = dirs.isNotEmpty(), @@ -606,11 +608,31 @@ fun SettingsGroupInterface( onCheckedChange = { useExternalStorage = it PrefManager.useExternalStorage = it + if (it && dirs.isNotEmpty()) { PrefManager.externalStoragePath = dirs[0].absolutePath + PrefManager.sdCardCap = it + sdCardCap = true + } else { + PrefManager.sdCardCap = false + sdCardCap = false } }, ) + + if (useExternalStorage) { + SettingsSwitch( + colors = settingsTileColorsAlt(), + title = { Text(text = stringResource(R.string.settings_interface_sd_card_cap_title)) }, + subtitle = { Text(text = stringResource(R.string.settings_interface_sd_card_cap_subtitle)) }, + state = sdCardCap, + onCheckedChange = { + sdCardCap = it + PrefManager.sdCardCap = it + } + ) + } + if (useExternalStorage) { // Currently selected item var selectedIndex by rememberSaveable { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73954b4ce..2c77c5b8c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -669,6 +669,8 @@ Icon style Download only over Wi-Fi Prevent downloads on cellular data + Optimize downloads for external storage + May improve performance and stability when downloading to SD cards Write to external storage No external storage detected Save games to external storage