Skip to content

Commit 9f7d6e7

Browse files
authored
fix(storage): Fix rare edge case of transfer status update crash (#3006)
1 parent 96a6dfa commit 9f7d6e7

File tree

1 file changed

+12
-15
lines changed

1 file changed

+12
-15
lines changed

aws-storage-s3/src/main/java/com/amplifyframework/storage/s3/transfer/TransferStatusUpdater.kt

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,10 @@ internal class TransferStatusUpdater(
3636
AWSS3StoragePlugin.AWS_S3_STORAGE_LOG_NAMESPACE.format(this::class.java.simpleName)
3737
)
3838
private val mainHandler = Handler(Looper.getMainLooper())
39-
private val transferStatusListenerMap: MutableMap<Int, MutableList<TransferListener>> by lazy {
40-
ConcurrentHashMap()
41-
}
42-
private val transferWorkInfoIdMap: MutableMap<String, Int> by lazy { ConcurrentHashMap() }
43-
private val multiPartTransferStatusListener: MutableMap<Int, MultiPartUploadTaskListener> by lazy {
39+
private val transferStatusListenerMap:
40+
ConcurrentHashMap<Int, ConcurrentHashMap.KeySetView<TransferListener, Boolean>> by lazy { ConcurrentHashMap() }
41+
private val transferWorkInfoIdMap: ConcurrentHashMap<String, Int> by lazy { ConcurrentHashMap() }
42+
private val multiPartTransferStatusListener: ConcurrentHashMap<Int, MultiPartUploadTaskListener> by lazy {
4443
ConcurrentHashMap()
4544
}
4645
val activeTransferMap = object : AbstractMutableMap<Int, TransferRecord>() {
@@ -135,9 +134,9 @@ internal class TransferStatusUpdater(
135134
transferDB.updateBytesTransferred(transferRecordId, bytesCurrent, bytesTotal)
136135
}
137136
if (notifyListener) {
138-
transferStatusListenerMap[transferRecordId]?.forEach {
137+
transferStatusListenerMap[transferRecordId]?.forEach { listener ->
139138
mainHandler.post {
140-
it.onProgressChanged(
139+
listener.onProgressChanged(
141140
transferRecordId,
142141
bytesCurrent,
143142
bytesTotal
@@ -149,8 +148,8 @@ internal class TransferStatusUpdater(
149148

150149
@Synchronized
151150
fun updateOnError(transferRecordId: Int, exception: Exception) {
152-
transferStatusListenerMap[transferRecordId]?.forEach {
153-
mainHandler.post { it.onError(transferRecordId, exception) }
151+
transferStatusListenerMap[transferRecordId]?.forEach { listener ->
152+
mainHandler.post { listener.onError(transferRecordId, exception) }
154153
}
155154
}
156155

@@ -162,13 +161,11 @@ internal class TransferStatusUpdater(
162161

163162
@Synchronized
164163
fun registerListener(transferRecordId: Int, transferListener: TransferListener) {
165-
transferStatusListenerMap[transferRecordId]?.let {
166-
val transferListener = transferListener
167-
if (!it.contains(transferListener)) {
168-
it.add(transferListener)
164+
transferStatusListenerMap[transferRecordId]?.add(transferListener) ?: run {
165+
val transferRecordMap = ConcurrentHashMap.newKeySet<TransferListener>().apply {
166+
add(transferListener)
169167
}
170-
} ?: run {
171-
transferStatusListenerMap[transferRecordId] = mutableListOf(transferListener)
168+
transferStatusListenerMap[transferRecordId] = transferRecordMap
172169
}
173170
}
174171

0 commit comments

Comments
 (0)