1
1
package com.d4rk.cleaner.core.work
2
2
3
3
import android.app.Application
4
+ import androidx.work.Data
4
5
import androidx.work.OneTimeWorkRequestBuilder
5
6
import androidx.work.WorkManager
6
7
import androidx.work.workDataOf
@@ -46,7 +47,7 @@ class FileCleanWorkEnqueuer(
46
47
return Result .Error (IllegalArgumentException (" No paths provided" ))
47
48
}
48
49
49
- val chunks = paths.chunked( FileCleanupWorker . MAX_PATHS_PER_WORKER )
50
+ val chunks = chunkPaths(paths, action )
50
51
var continuation: androidx.work.WorkContinuation ? = null
51
52
val requestIds = mutableListOf<UUID >()
52
53
for (chunk in chunks) {
@@ -72,5 +73,34 @@ class FileCleanWorkEnqueuer(
72
73
Result .Error (t)
73
74
}
74
75
}
76
+
77
+ private fun chunkPaths (paths : Collection <String >, action : String ): List <List <String >> {
78
+ val result = mutableListOf<List <String >>()
79
+ val current = mutableListOf<String >()
80
+ for (path in paths) {
81
+ current + = path
82
+ val tooBig = runCatching {
83
+ Data .Builder ()
84
+ .putString(FileCleanupWorker .KEY_ACTION , action)
85
+ .putStringArray(FileCleanupWorker .KEY_PATHS , current.toTypedArray())
86
+ .build()
87
+ .toByteArray()
88
+ .size > Data .MAX_DATA_BYTES
89
+ }.getOrDefault(true )
90
+ val overLimit = current.size > FileCleanupWorker .MAX_PATHS_PER_WORKER
91
+ if (tooBig || overLimit) {
92
+ val last = current.removeAt(current.lastIndex)
93
+ if (current.isNotEmpty()) {
94
+ result + = current.toList()
95
+ }
96
+ current.clear()
97
+ current + = last
98
+ }
99
+ }
100
+ if (current.isNotEmpty()) {
101
+ result + = current.toList()
102
+ }
103
+ return result
104
+ }
75
105
}
76
106
0 commit comments