1- /*
2- * Copyright 2022, the Chromium project authors. Please see the AUTHORS file
3- * for details. All rights reserved. Use of this source code is governed by a
4- * BSD-style license that can be found in the LICENSE file.
5- */
6-
71package io.flutter.plugins.firebase.database
82
93import android.util.Log
@@ -17,67 +11,84 @@ import com.google.firebase.database.MutableData
1711import com.google.firebase.database.Transaction
1812import com.google.firebase.database.Transaction.Handler
1913import io.flutter.plugin.common.MethodChannel
20- import java.util.*
2114
2215class TransactionHandler @JvmOverloads constructor(
23- @NonNull private val channel : MethodChannel ,
24- private val transactionKey : Int
16+ @NonNull private val channel : MethodChannel ,
17+ private val transactionKey : Int
2518) : Handler {
26-
27- private val transactionCompletionSource = TaskCompletionSource <Map <String , Any ?>>()
2819
29- fun getTask (): Task <Map <String , Any ?>> {
30- return transactionCompletionSource.task
20+ private val transactionCompletionSource = TaskCompletionSource <Map <String , Any ?>>()
21+
22+ fun getTask (): Task <Map <String , Any ?>> {
23+ return transactionCompletionSource.task
24+ }
25+
26+ @NonNull
27+ override fun doTransaction (@NonNull currentData : MutableData ): Transaction .Result {
28+ val snapshotMap = mutableMapOf<String , Any ?>().apply {
29+ put(Constants .KEY , currentData.key ? : " " )
30+ put(Constants .VALUE , currentData.value)
3131 }
3232
33- @NonNull
34- override fun doTransaction (@NonNull currentData : MutableData ): Transaction . Result {
35- val snapshotMap = mutableMapOf< String , Any ?>( )
36- val transactionArgs = mutableMapOf< String , Any ?>()
33+ val transactionArgs = mutableMapOf< String , Any ?>(). apply {
34+ put( Constants . SNAPSHOT , snapshotMap)
35+ put( Constants . TRANSACTION_KEY , transactionKey )
36+ }
3737
38- snapshotMap[Constants .KEY ] = currentData.key ? : " "
39- snapshotMap[Constants .VALUE ] = currentData.value
38+ return try {
39+ val executor = TransactionExecutor (channel)
40+ val updatedData: Any? = executor.execute(transactionArgs)
4041
41- transactionArgs[Constants .SNAPSHOT ] = snapshotMap
42- transactionArgs[Constants .TRANSACTION_KEY ] = transactionKey
42+ @Suppress(" UNCHECKED_CAST" )
43+ val transactionHandlerResult: Map <String , Any ?> = when (updatedData) {
44+ is Map <* , * > -> updatedData as Map <String , Any ?>
45+ null -> emptyMap()
46+ else -> {
47+ Log .e(" firebase_database" , " Unexpected transaction result type: ${updatedData::class .java} " )
48+ emptyMap()
49+ }
50+ }
51+
52+ val aborted: Boolean = (transactionHandlerResult[" aborted" ] as ? Boolean ) ? : false
53+ val exception: Boolean = (transactionHandlerResult[" exception" ] as ? Boolean ) ? : false
4354
44- return try {
45- val executor = TransactionExecutor (channel)
46- val updatedData = executor.execute(transactionArgs)
47- @Suppress(" UNCHECKED_CAST" )
48- val transactionHandlerResult = updatedData as Map <String , Any ?>
49- val aborted = transactionHandlerResult[" aborted" ] as Boolean
50- val exception = transactionHandlerResult[" exception" ] as Boolean
51-
52- if (aborted || exception) {
53- Transaction .abort()
54- } else {
55- currentData.value = transactionHandlerResult[" value" ]
56- Transaction .success(currentData)
57- }
58- } catch (e: Exception ) {
59- Log .e(" firebase_database" , " An unexpected exception occurred for a transaction." , e)
60- Transaction .abort()
55+ if (aborted || exception) {
56+ Transaction .abort()
57+ } else {
58+ if (transactionHandlerResult.containsKey(" value" )) {
59+ currentData.value = transactionHandlerResult[" value" ]
6160 }
61+ Transaction .success(currentData)
62+ }
63+ } catch (e: Exception ) {
64+ Log .e(" firebase_database" , " An unexpected exception occurred for a transaction." , e)
65+ Transaction .abort()
6266 }
67+ }
6368
64- override fun onComplete (
65- @Nullable error : DatabaseError ? ,
66- committed : Boolean ,
67- @Nullable currentData : DataSnapshot ?
68- ) {
69- when {
70- error != null -> {
71- transactionCompletionSource.setException(
72- FlutterFirebaseDatabaseException .fromDatabaseError(error)
73- )
74- }
75- currentData != null -> {
76- val payload = FlutterDataSnapshotPayload (currentData)
77- val additionalParams = mutableMapOf<String , Any ?>()
78- additionalParams[Constants .COMMITTED ] = committed
79- transactionCompletionSource.setResult(payload.withAdditionalParams(additionalParams).toMap())
80- }
81- }
69+ override fun onComplete (
70+ @Nullable error : DatabaseError ? ,
71+ committed : Boolean ,
72+ @Nullable currentData : DataSnapshot ?
73+ ) {
74+ when {
75+ error != null -> {
76+ transactionCompletionSource.setException(
77+ FlutterFirebaseDatabaseException .fromDatabaseError(error)
78+ )
79+ }
80+ currentData != null -> {
81+ val payload = FlutterDataSnapshotPayload (currentData)
82+ val additionalParams: MutableMap <String , Any > = mutableMapOf (
83+ Constants .COMMITTED to committed
84+ )
85+ transactionCompletionSource.setResult(
86+ payload.withAdditionalParams(additionalParams).toMap()
87+ )
88+ }
89+ else -> {
90+ transactionCompletionSource.setResult(emptyMap())
91+ }
8292 }
93+ }
8394}
0 commit comments