Skip to content

Commit 9b6ed0f

Browse files
committed
feat: [Packages backup] New backup structure
Change-Id: Ic94efa71715c52bd3a3fbe3b06a440a0561fc2a2
1 parent 2b6cb18 commit 9b6ed0f

File tree

15 files changed

+182
-80
lines changed

15 files changed

+182
-80
lines changed

source/core/data/src/main/kotlin/com/xayah/core/data/repository/PackageRepository.kt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class PackageRepository @Inject constructor(
6767
fun getPackages(opType: OpType) = packageDao.queryFlow(opType).distinctUntilChanged()
6868
val activatedCount = packageDao.countActivatedFlow().distinctUntilChanged()
6969
private val localBackupSaveDir get() = context.localBackupSaveDir()
70-
private val archivesPackagesDir get() = pathUtil.getLocalBackupArchivesPackagesDir()
70+
private val archivesPackagesDir get() = pathUtil.getLocalBackupAppsDir()
7171

7272
fun getArchiveDst(dstDir: String, dataType: DataType, ct: CompressionType) = "${dstDir}/${dataType.type}.${ct.suffix}"
7373

@@ -119,7 +119,7 @@ class PackageRepository @Inject constructor(
119119

120120
suspend fun updateCloudPackageArchivesSize(packageName: String, opType: OpType, userId: Int, client: CloudClient, entity: CloudEntity) {
121121
val remote = entity.remote
122-
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteArchivesPackagesDir(remote)
122+
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteAppsDir(remote)
123123
queryPackages(packageName, opType, userId, entity.name, entity.remote).onEach {
124124
runCatching { it.displayStats.apkBytes = calculateCloudArchiveSize(client, it, DataType.PACKAGE_APK, remoteArchivesPackagesDir) }.onFailure(rootService.onFailure)
125125
runCatching { it.displayStats.userBytes = calculateCloudArchiveSize(client, it, DataType.PACKAGE_USER, remoteArchivesPackagesDir) }.onFailure(rootService.onFailure)
@@ -558,7 +558,7 @@ class PackageRepository @Inject constructor(
558558
private suspend fun refreshFromCloud(packageName: String, cloud: String) {
559559
val refresh: suspend (CloudClient, CloudEntity) -> Unit = { client: CloudClient, entity: CloudEntity ->
560560
val remote = entity.remote
561-
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteArchivesPackagesDir(remote)
561+
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteAppsDir(remote)
562562
val src = if (packageName.isEmpty()) remoteArchivesPackagesDir else "$remoteArchivesPackagesDir/$packageName"
563563
if (client.exists(src)) {
564564
val paths = client.walkFileTree(src)
@@ -618,24 +618,24 @@ class PackageRepository @Inject constructor(
618618
fun getDataSrc(srcDir: String, packageName: String) = "$srcDir/$packageName"
619619

620620
suspend fun deleteLocalArchive(p: PackageEntity) = run {
621-
if (rootService.deleteRecursively("${archivesPackagesDir}/${p.archivesPreserveRelativeDir}")) packageDao.delete(p)
621+
if (rootService.deleteRecursively("${archivesPackagesDir}/${p.archivesRelativeDir}")) packageDao.delete(p)
622622
}
623623

624624
suspend fun deleteRemoteArchive(cloud: String, p: PackageEntity) = runCatching {
625625
cloudRepository.withClient(cloud) { client, entity ->
626626
val remote = entity.remote
627-
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteArchivesPackagesDir(remote)
628-
val src = "${remoteArchivesPackagesDir}/${p.archivesPreserveRelativeDir}"
627+
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteAppsDir(remote)
628+
val src = "${remoteArchivesPackagesDir}/${p.archivesRelativeDir}"
629629
client.deleteRecursively(src)
630630
}
631631
}.onSuccess { packageDao.delete(p) }
632632

633633
private suspend fun calculateLocalArchiveSize(p: PackageEntity, dataType: DataType) = rootService.calculateSize(
634-
getArchiveDst("${archivesPackagesDir}/${p.archivesPreserveRelativeDir}", dataType, p.indexInfo.compressionType)
634+
getArchiveDst("${archivesPackagesDir}/${p.archivesRelativeDir}", dataType, p.indexInfo.compressionType)
635635
)
636636

637637
private fun calculateCloudArchiveSize(client: CloudClient, p: PackageEntity, dataType: DataType, archivesPackagesDir: String) = run {
638-
val src = getArchiveDst("${archivesPackagesDir}/${p.archivesPreserveRelativeDir}", dataType, p.indexInfo.compressionType)
638+
val src = getArchiveDst("${archivesPackagesDir}/${p.archivesRelativeDir}", dataType, p.indexInfo.compressionType)
639639
if (client.exists(src)) client.size(src)
640640
else 0
641641
}
@@ -656,15 +656,15 @@ class PackageRepository @Inject constructor(
656656
suspend fun preserve(p: PackageEntity) {
657657
val preserveId = DateUtil.getTimestamp()
658658
val isSuccess = if (p.indexInfo.cloud.isEmpty()) {
659-
val src = "${archivesPackagesDir}/${p.archivesPreserveRelativeDir}"
659+
val src = "${archivesPackagesDir}/${p.archivesRelativeDir}"
660660
val dst = "${archivesPackagesDir}/${p.archivesRelativeDir}/${preserveId}"
661661
rootService.renameTo(src, dst)
662662
} else {
663663
runCatching {
664664
cloudRepository.withClient(p.indexInfo.cloud) { client, entity ->
665665
val remote = entity.remote
666-
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteArchivesPackagesDir(remote)
667-
val src = "${remoteArchivesPackagesDir}/${p.archivesPreserveRelativeDir}"
666+
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteAppsDir(remote)
667+
val src = "${remoteArchivesPackagesDir}/${p.archivesRelativeDir}"
668668
val dst = "${remoteArchivesPackagesDir}/${p.archivesRelativeDir}/${preserveId}"
669669
client.renameTo(src, dst)
670670
}
@@ -676,14 +676,14 @@ class PackageRepository @Inject constructor(
676676

677677
suspend fun delete(p: PackageEntity) {
678678
val isSuccess = if (p.indexInfo.cloud.isEmpty()) {
679-
val src = "${archivesPackagesDir}/${p.archivesPreserveRelativeDir}"
679+
val src = "${archivesPackagesDir}/${p.archivesRelativeDir}"
680680
rootService.deleteRecursively(src)
681681
} else {
682682
runCatching {
683683
cloudRepository.withClient(p.indexInfo.cloud) { client, entity ->
684684
val remote = entity.remote
685-
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteArchivesPackagesDir(remote)
686-
val src = "${remoteArchivesPackagesDir}/${p.archivesPreserveRelativeDir}"
685+
val remoteArchivesPackagesDir = pathUtil.getCloudRemoteAppsDir(remote)
686+
val src = "${remoteArchivesPackagesDir}/${p.archivesRelativeDir}"
687687
client.deleteRecursively(src)
688688
}
689689
}.onFailure(rootService.onFailure).isSuccess

source/core/model/src/main/kotlin/com/xayah/core/model/database/PackageEntity.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,6 @@ data class PackageEntity(
104104
val preserveId: Long
105105
get() = indexInfo.preserveId
106106

107-
private val ctName: String
108-
get() = indexInfo.compressionType.type
109-
110107
val apkSelected: Boolean
111108
get() = dataStates.apkState == DataState.Selected
112109

@@ -141,10 +138,7 @@ data class PackageEntity(
141138
get() = (packageInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0
142139

143140
val archivesRelativeDir: String
144-
get() = "${packageName}/${userId}/${ctName}"
145-
146-
val archivesPreserveRelativeDir: String
147-
get() = "${archivesRelativeDir}/${preserveId}"
141+
get() = "${packageName}/user_${userId}"
148142
}
149143

150144
data class PackageEntityWithCount(

source/core/rootservice/src/main/kotlin/com/xayah/core/rootservice/service/RemoteRootService.kt

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.xayah.core.rootservice.parcelables.PathParcelable
1919
import com.xayah.core.rootservice.parcelables.StatFsParcelable
2020
import com.xayah.core.rootservice.util.ExceptionUtil.tryOnScope
2121
import com.xayah.core.rootservice.util.withMainContext
22+
import com.xayah.core.util.GsonUtil
2223
import com.xayah.core.util.LogUtil
2324
import com.xayah.core.util.PathUtil
2425
import com.xayah.core.util.model.ShellResult
@@ -42,6 +43,7 @@ class RemoteRootService(private val context: Context) {
4243
component = ComponentName(context.packageName, RemoteRootService::class.java.name)
4344
}
4445
}
46+
private val gsonUtil by lazy { GsonUtil() }
4547

4648
// TODO: Will this cause memory leak? It needs to test.
4749
var onFailure: (Throwable) -> Unit = {}
@@ -155,15 +157,15 @@ class RemoteRootService(private val context: Context) {
155157

156158
suspend fun renameTo(src: String, dst: String): Boolean = runCatching { getService().renameTo(src, dst) }.onFailure(onFailure).getOrElse { false }
157159

158-
suspend fun writeText(text: String, path: String, context: Context): Boolean = runCatching {
159-
var state = true
160+
suspend fun writeText(text: String, dst: String): Boolean = runCatching {
161+
var isSuccess = true
160162
val tmpFilePath = "${context.cacheDir.path}/tmp"
161163
val tmpFile = File(tmpFilePath)
162164
tmpFile.writeText(text)
163-
if (getService().mkdirs(path).not()) state = false
164-
if (getService().copyTo(tmpFilePath, path, true).not()) state = false
165+
if (getService().mkdirs(PathUtil.getParentPath(dst)).not()) isSuccess = false
166+
if (getService().copyTo(tmpFilePath, dst, true).not()) isSuccess = false
165167
tmpFile.deleteRecursively()
166-
state
168+
isSuccess
167169
}.onFailure(onFailure).getOrElse { false }
168170

169171
suspend fun writeBytes(bytes: ByteArray, dst: String): Boolean = runCatching {
@@ -284,6 +286,23 @@ class RemoteRootService(private val context: Context) {
284286
suspend fun calculateMD5(src: String): String? =
285287
runCatching { getService().calculateMD5(src) }.onFailure(onFailure).getOrNull()
286288

289+
suspend fun writeJson(data: Any, dst: String): ShellResult = runCatching {
290+
var isSuccess: Boolean
291+
val out = mutableListOf<String>()
292+
293+
writeText(text = gsonUtil.toJson(data), dst = dst).also {
294+
isSuccess = it
295+
if (isSuccess) {
296+
out.add("Succeed to write configs: $dst")
297+
} else {
298+
out.add("Failed to write configs: $dst")
299+
}
300+
}
301+
setAllPermissions(src = dst)
302+
303+
ShellResult(code = if (isSuccess) 0 else -1, input = listOf(), out = out)
304+
}.onFailure(onFailure).getOrElse { ShellResult(code = -1, input = listOf(), out = listOf()) }
305+
287306
@OptIn(ExperimentalSerializationApi::class)
288307
suspend inline fun <reified T> writeProtoBuf(data: T, dst: String): ShellResult = runCatching {
289308
var isSuccess: Boolean

source/core/service/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,7 @@ dependencies {
2121

2222
// Gson
2323
implementation(libs.gson)
24+
25+
// Preferences DataStore
26+
implementation(libs.androidx.datastore.preferences)
2427
}

source/core/service/src/main/kotlin/com/xayah/core/service/packages/backup/BackupService.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.xayah.core.data.repository.TaskRepository
1010
import com.xayah.core.database.dao.PackageDao
1111
import com.xayah.core.database.dao.TaskDao
1212
import com.xayah.core.datastore.readSelectionType
13+
import com.xayah.core.datastore.saveLastBackupTime
1314
import com.xayah.core.model.DataType
1415
import com.xayah.core.model.OpType
1516
import com.xayah.core.model.OperationState
@@ -265,6 +266,7 @@ internal abstract class BackupService : Service() {
265266
taskDao.upsert(it)
266267
}
267268
val time = DateUtil.getShortRelativeTimeSpanString(context = context, time1 = startTimestamp, time2 = endTimestamp)
269+
context.saveLastBackupTime(endTimestamp)
268270
NotificationUtil.notify(
269271
context,
270272
notificationBuilder,

source/core/service/src/main/kotlin/com/xayah/core/service/packages/backup/CloudBackupImpl.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ internal class CloudBackupImpl @Inject constructor() : BackupService() {
7070
)
7171
}
7272

73-
private val tmpArchivesPackagesDir by lazy { pathUtil.getCloudTmpArchivesPackagesDir() }
73+
private val tmpArchivesPackagesDir by lazy { pathUtil.getCloudTmpAppsDir() }
7474
private val tmpConfigsDir by lazy { pathUtil.getCloudTmpConfigsDir() }
7575
private val tmpDir by lazy { pathUtil.getCloudTmpDir() }
7676

@@ -85,7 +85,7 @@ internal class CloudBackupImpl @Inject constructor() : BackupService() {
8585
cloudEntity = pair.second
8686
client = pair.first
8787
remote = cloudEntity.remote
88-
remoteArchivesPackagesDir = pathUtil.getCloudRemoteArchivesPackagesDir(remote)
88+
remoteArchivesPackagesDir = pathUtil.getCloudRemoteAppsDir(remote)
8989
remoteConfigsDir = pathUtil.getCloudRemoteConfigsDir(remote)
9090
taskEntity.also {
9191
it.cloud = cloudEntity.name
@@ -105,10 +105,10 @@ internal class CloudBackupImpl @Inject constructor() : BackupService() {
105105

106106
override suspend fun backupPackage(t: TaskDetailPackageEntity) {
107107
val p = t.packageEntity
108-
val tmpDstDir = "${tmpArchivesPackagesDir}/${p.archivesPreserveRelativeDir}"
108+
val tmpDstDir = "${tmpArchivesPackagesDir}/${p.archivesRelativeDir}"
109109
rootService.mkdirs(tmpDstDir)
110110

111-
val remoteDstDir = "${remoteArchivesPackagesDir}/${p.archivesPreserveRelativeDir}"
111+
val remoteDstDir = "${remoteArchivesPackagesDir}/${p.archivesRelativeDir}"
112112
client.mkdirRecursively(remoteDstDir)
113113

114114
var restoreEntity = packageRepository.getPackage(p.packageName, OpType.RESTORE, p.userId, p.preserveId, p.indexInfo.compressionType, cloudEntity.name, remote)

source/core/service/src/main/kotlin/com/xayah/core/service/packages/backup/LocalBackupImpl.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ internal class LocalBackupImpl @Inject constructor() : BackupService() {
6666
}
6767

6868
private val localBackupSaveDir by lazy { context.localBackupSaveDir() }
69-
private val archivesPackagesDir by lazy { pathUtil.getLocalBackupArchivesPackagesDir() }
69+
private val appsDir by lazy { pathUtil.getLocalBackupAppsDir() }
7070
private val configsDir by lazy { pathUtil.getLocalBackupConfigsDir() }
7171

7272
override suspend fun createTargetDirs() {
73-
log { "Trying to create: $archivesPackagesDir." }
73+
log { "Trying to create: $appsDir." }
7474
log { "Trying to create: $configsDir." }
75-
rootService.mkdirs(archivesPackagesDir)
75+
rootService.mkdirs(appsDir)
7676
rootService.mkdirs(configsDir)
7777
}
7878

@@ -83,7 +83,7 @@ internal class LocalBackupImpl @Inject constructor() : BackupService() {
8383
}
8484

8585
val p = t.packageEntity
86-
val dstDir = "${archivesPackagesDir}/${p.archivesPreserveRelativeDir}"
86+
val dstDir = "${appsDir}/${p.archivesRelativeDir}"
8787
rootService.mkdirs(dstDir)
8888

8989
var restoreEntity = packageDao.query(p.packageName, OpType.RESTORE, p.userId, p.preserveId, p.indexInfo.compressionType, "", localBackupSaveDir)
@@ -106,7 +106,7 @@ internal class LocalBackupImpl @Inject constructor() : BackupService() {
106106
dataStates = restoreEntity?.dataStates?.copy() ?: p.dataStates.copy(),
107107
extraInfo = p.extraInfo.copy(existed = true, activated = false)
108108
)
109-
rootService.writeProtoBuf(data = restoreEntity, dst = PathUtil.getPackageRestoreConfigDst(dstDir = dstDir))
109+
rootService.writeJson(data = restoreEntity, dst = PathUtil.getPackageRestoreConfigDst(dstDir = dstDir))
110110
packageDao.upsert(restoreEntity)
111111
packageDao.upsert(p)
112112
t.apply {

source/core/service/src/main/kotlin/com/xayah/core/service/packages/restore/CloudRestoreImpl.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ internal class CloudRestoreImpl @Inject constructor() : RestoreService() {
6161
)
6262
}
6363

64-
private val tmpArchivesPackagesDir by lazy { pathUtil.getCloudTmpArchivesPackagesDir() }
64+
private val tmpArchivesPackagesDir by lazy { pathUtil.getCloudTmpAppsDir() }
6565
private val tmpDir by lazy { pathUtil.getCloudTmpDir() }
6666

6767
private lateinit var cloudEntity: CloudEntity
@@ -75,7 +75,7 @@ internal class CloudRestoreImpl @Inject constructor() : RestoreService() {
7575
cloudEntity = pair.second
7676
client = pair.first
7777
remote = cloudEntity.remote
78-
remoteArchivesPackagesDir = pathUtil.getCloudRemoteArchivesPackagesDir(remote)
78+
remoteArchivesPackagesDir = pathUtil.getCloudRemoteAppsDir(remote)
7979
remoteConfigsDir = pathUtil.getCloudRemoteConfigsDir(remote)
8080
taskEntity.also {
8181
it.cloud = cloudEntity.name
@@ -84,8 +84,8 @@ internal class CloudRestoreImpl @Inject constructor() : RestoreService() {
8484
}
8585

8686
override suspend fun restorePackage(p: PackageEntity) {
87-
val tmpDstDir = "${tmpArchivesPackagesDir}/${p.archivesPreserveRelativeDir}"
88-
val remoteSrcDir = "${remoteArchivesPackagesDir}/${p.archivesPreserveRelativeDir}"
87+
val tmpDstDir = "${tmpArchivesPackagesDir}/${p.archivesRelativeDir}"
88+
val remoteSrcDir = "${remoteArchivesPackagesDir}/${p.archivesRelativeDir}"
8989

9090
val t = TaskDetailPackageEntity(
9191
id = 0,

source/core/service/src/main/kotlin/com/xayah/core/service/packages/restore/LocalRestoreImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ internal class LocalRestoreImpl @Inject constructor() : RestoreService() {
5757

5858
override suspend fun createTargetDirs() {}
5959

60-
private val archivesPackagesDir by lazy { pathUtil.getLocalBackupArchivesPackagesDir() }
60+
private val archivesPackagesDir by lazy { pathUtil.getLocalBackupAppsDir() }
6161

6262
override suspend fun restorePackage(p: PackageEntity) {
63-
val srcDir = "${archivesPackagesDir}/${p.archivesPreserveRelativeDir}"
63+
val srcDir = "${archivesPackagesDir}/${p.archivesRelativeDir}"
6464

6565
val t = TaskDetailPackageEntity(
6666
id = 0,

source/core/ui/src/main/kotlin/com/xayah/core/ui/component/Chip.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ fun AssistChip(
127127
color: ColorSchemeKeyTokens = ColorSchemeKeyTokens.Primary,
128128
containerColor: ColorSchemeKeyTokens = ColorSchemeKeyTokens.Transparent,
129129
border: BorderStroke? = AssistChipDefaults.assistChipBorder(enabled),
130-
onClick: () -> Unit,
130+
onClick: () -> Unit = {},
131131
) {
132132
AssistChip(
133133
enabled = enabled,

source/core/util/src/main/kotlin/com/xayah/core/util/GsonUtil.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.xayah.core.util
22

3-
import com.google.gson.Gson
3+
import com.google.gson.GsonBuilder
44
import java.lang.reflect.Type
55
import javax.inject.Inject
66
import javax.inject.Singleton
77

8+
89
@Singleton
910
class GsonUtil @Inject constructor() {
10-
private val gson = Gson()
11+
private val gson = GsonBuilder().setPrettyPrinting().create()
1112

1213
fun toJson(src: Any): String = gson.toJson(src)
1314

source/core/util/src/main/kotlin/com/xayah/core/util/PathUtil.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ const val ApksRelativeDir = "apks"
2020
const val MountsRelativeDir = "mounts"
2121
const val ArchivesRelativeDir = "archives"
2222
const val PackagesRelativeDir = "packages"
23+
const val AppsRelativeDir = "apps"
2324
const val MediumRelativeDir = "medium"
2425
const val ConfigsRelativeDir = "configs"
25-
const val ConfigsPackageRestoreName = "package_restore_config.pb"
26+
const val ConfigsPackageRestoreName = "package_restore_config.json"
2627
const val ConfigsMediaRestoreName = "media_restore_config.pb"
2728
const val BinArchiveName = "bin.zip"
2829
const val CloudTmpTestFileName = "DataBackupCloudTmpTest"
@@ -59,7 +60,9 @@ class PathUtil @Inject constructor(
5960
fun getPackageIconRelativePath(packageName: String): String = "${packageName}.png"
6061
fun getConfigsRelativeDir(): String = ConfigsRelativeDir
6162
fun getArchivesRelativeDir(): String = ArchivesRelativeDir
62-
fun getArchivesPackagesRelativeDir(): String = "$ArchivesRelativeDir/$PackagesRelativeDir"
63+
64+
fun getAppsRelativeDir(): String = AppsRelativeDir
65+
6366
fun getArchivesMediumRelativeDir(): String = "$ArchivesRelativeDir/$MediumRelativeDir"
6467

6568
fun getMediaRestoreConfigDst(dstDir: String): String = "${dstDir}/$ConfigsMediaRestoreName"
@@ -83,12 +86,13 @@ class PathUtil @Inject constructor(
8386
fun getCloudRemoteConfigsDir(remote: String): String = getConfigsDir(parent = remote)
8487
fun getArchivesDir(parent: String): String = "${parent}/${getArchivesRelativeDir()}"
8588
fun getLocalBackupArchivesDir(): String = getArchivesDir(parent = context.localBackupSaveDir())
86-
fun getArchivesPackagesDir(parent: String): String = "${parent}/${getArchivesPackagesRelativeDir()}"
87-
fun getLocalBackupArchivesPackagesDir(): String = getArchivesPackagesDir(parent = context.localBackupSaveDir())
88-
fun getLocalRestoreArchivesPackagesDir(): String = getArchivesPackagesDir(parent = context.localRestoreSaveDir())
89-
fun getCloudTmpArchivesPackagesDir(): String = getArchivesPackagesDir(parent = context.cloudTmpAbsoluteDir())
89+
90+
fun getAppsDir(parent: String): String = "${parent}/${getAppsRelativeDir()}"
91+
fun getLocalBackupAppsDir(): String = getAppsDir(parent = context.localBackupSaveDir())
92+
fun getCloudTmpAppsDir(): String = getAppsDir(parent = context.cloudTmpAbsoluteDir())
93+
fun getCloudRemoteAppsDir(remote: String): String = getAppsDir(parent = remote)
94+
9095
fun getCloudTmpArchivesMediumDir(): String = getArchivesMediumDir(parent = context.cloudTmpAbsoluteDir())
91-
fun getCloudRemoteArchivesPackagesDir(remote: String): String = getArchivesPackagesDir(parent = remote)
9296
fun getCloudRemoteArchivesMediumDir(remote: String): String = getArchivesMediumDir(parent = remote)
9397
fun getArchivesMediumDir(parent: String): String = "${parent}/${getArchivesMediumRelativeDir()}"
9498
fun getLocalBackupArchivesMediumDir(): String = getArchivesMediumDir(parent = context.localBackupSaveDir())

0 commit comments

Comments
 (0)