Skip to content

Commit 2771f55

Browse files
authored
fix(storage,android): fix an issue that could happen when app would get detached from the engine (#18255)
1 parent 829fd94 commit 2771f55

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageTask.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,13 @@ internal class FlutterFirebaseStorageTask private constructor(
9595
@JvmStatic
9696
fun cancelInProgressTasks() {
9797
synchronized(inProgressTasks) {
98+
val tasks = ArrayList<FlutterFirebaseStorageTask>(inProgressTasks.size())
9899
for (i in 0 until inProgressTasks.size()) {
99100
val task: FlutterFirebaseStorageTask? = inProgressTasks.valueAt(i)
100-
task?.destroy()
101+
task?.let { tasks.add(it) }
101102
}
102103
inProgressTasks.clear()
104+
tasks.forEach { it.destroy() }
103105
}
104106
}
105107

tests/integration_test/firebase_storage/task_e2e.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import 'dart:async';
66
import 'dart:convert';
77
import 'dart:io';
88

9+
import 'package:firebase_core/firebase_core.dart';
10+
import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart';
911
import 'package:firebase_storage/firebase_storage.dart';
1012
import 'package:flutter/foundation.dart';
1113
import 'package:flutter_test/flutter_test.dart';
14+
import 'package:tests/firebase_options.dart';
1215

1316
import './test_utils.dart';
1417

@@ -346,6 +349,38 @@ void setupTaskTests() {
346349
// Windows `task.cancel()` is returning "false", same code on example app works as intended
347350
skip: defaultTargetPlatform == TargetPlatform.windows,
348351
);
352+
353+
test(
354+
'cancels multiple in-progress Android tasks during core reinitialization',
355+
() async {
356+
final tasks = <UploadTask>[
357+
for (var i = 0; i < 3; i++)
358+
storage
359+
.ref('flutter-tests/regression-18240-$i.txt')
360+
.putString('A' * 20000000),
361+
];
362+
final completions = tasks
363+
.map(
364+
(task) => task.then<void>(
365+
(_) {},
366+
onError: (_) {},
367+
),
368+
)
369+
.toList();
370+
371+
try {
372+
MethodChannelFirebase.isCoreInitialized = false;
373+
await Firebase.initializeApp(
374+
options: DefaultFirebaseOptions.currentPlatform,
375+
).timeout(const Duration(seconds: 30));
376+
} finally {
377+
MethodChannelFirebase.isCoreInitialized = true;
378+
completions.forEach(unawaited);
379+
}
380+
},
381+
retry: 2,
382+
skip: kIsWeb || defaultTargetPlatform != TargetPlatform.android,
383+
);
349384
},
350385
);
351386

0 commit comments

Comments
 (0)