Skip to content

Commit

Permalink
cohere: using flutter_archive to resolve memory issues on android and…
Browse files Browse the repository at this point in the history
… iOS
  • Loading branch information
Sivan22 committed Nov 12, 2024
1 parent c77e645 commit 9d6887d
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 66 deletions.
19 changes: 0 additions & 19 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,6 @@ allprojects {

rootProject.buildDir = '../build'
subprojects {
// fix for verifyReleaseResources
// ============
afterEvaluate { project ->
if (project.plugins.hasPlugin("com.android.application") ||
project.plugins.hasPlugin("com.android.library")) {
project.android {
compileSdkVersion 34
buildToolsVersion "34.0.0"
}
}
if (project.hasProperty("android")) {
project.android {
if (namespace == null) {
namespace project.group
}
}
}
}
// ============
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
Expand Down
87 changes: 57 additions & 30 deletions lib/screens/empty_library_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:flutter_settings_screens/flutter_settings_screens.dart';
import 'package:path_provider/path_provider.dart';
import 'package:http/http.dart' as http;
import 'package:archive/archive_io.dart';
import 'package:flutter_archive/flutter_archive.dart' as flutter_archive;
import 'package:file_picker/file_picker.dart';

class EmptyLibraryScreen extends StatefulWidget {
Expand Down Expand Up @@ -178,43 +179,69 @@ class _EmptyLibraryScreenState extends State<EmptyLibraryScreen> {
throw Exception('קובץ הספרייה הזמני ריק');
}

// Create extractor with memory-efficient settings
final extractor = ZipDecoder();
final inputStream = InputFileStream(_tempFile!.path);
final archive = extractor.decodeBuffer(inputStream);
final totalFiles = archive.files.length;
var extractedFiles = 0;

// Process files one at a time using streaming
for (final file in archive.files) {
if (!mounted || _isCancelling) break;

final filename = file.name;
final filePath = '$libraryPath/$filename';
Future<void> _extractWithArchive() async {
// Create extractor with memory-efficient settings
final extractor = ZipDecoder();
final inputStream = InputFileStream(_tempFile!.path);
final archive = extractor.decodeBuffer(inputStream);
final totalFiles = archive.files.length;
var extractedFiles = 0;

// Process files one at a time using streaming
for (final file in archive.files) {
if (!mounted || _isCancelling) break;

final filename = file.name;
final filePath = '$libraryPath/$filename';

setState(() {
_downloadProgress = extractedFiles / totalFiles;
_currentOperation = 'מחלץ: $filename';
});

try {
if (file.isFile) {
final outputFile = File(filePath);
await outputFile.parent.create(recursive: true);
final outputStream = OutputFileStream(outputFile.path);
file.writeContent(outputStream);
outputStream.close();
} else {
await Directory(filePath).create(recursive: true);
}
extractedFiles++;
} catch (e) {
debugPrint('Error extracting $filename: $e');
throw Exception('שגיאה בחילוץ הקובץ $filename: $e');
}
}

setState(() {
_downloadProgress = extractedFiles / totalFiles;
_currentOperation = 'מחלץ: $filename';
});
inputStream.close();
}

Future<void> _extractWithFlutterArchive() async {
try {
if (file.isFile) {
final outputFile = File(filePath);
await outputFile.parent.create(recursive: true);
final outputStream = OutputFileStream(outputFile.path);
file.writeContent(outputStream);
outputStream.close();
} else {
await Directory(filePath).create(recursive: true);
}
extractedFiles++;
await flutter_archive.ZipFile.extractToDirectory(
zipFile: _tempFile!,
destinationDir: Directory(libraryPath),
onExtracting: (zipEntry, progress) {
setState(() {
_downloadProgress = progress;
_currentOperation = 'מחלץ: ${zipEntry.name}';
});
return flutter_archive.ZipFileOperation.includeItem;
});
} catch (e) {
debugPrint('Error extracting $filename: $e');
throw Exception('שגיאה בחילוץ הקובץ $filename: $e');
print(e);
throw Exception('שגיאה בחילוץ הקובץ: $e');
}
}

inputStream.close();
if (Platform.isAndroid || Platform.isIOS || Platform.isMacOS) {
await _extractWithFlutterArchive();
} else {
await _extractWithArchive();
}
await _cleanupTempFile();

if (mounted && !_isCancelling) {
Expand Down
2 changes: 2 additions & 0 deletions macos/Flutter/GeneratedPluginRegistrant.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import FlutterMacOS
import Foundation

import flutter_archive
import isar_flutter_libs
import package_info_plus
import path_provider_foundation
Expand All @@ -15,6 +16,7 @@ import url_launcher_macos
import window_manager

func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FlutterArchivePlugin.register(with: registry.registrar(forPlugin: "FlutterArchivePlugin"))
IsarFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "IsarFlutterLibsPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
Expand Down
40 changes: 24 additions & 16 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_archive:
dependency: "direct main"
description:
name: flutter_archive
sha256: "5ca235f304c12bf468979235f400f79846d204169d715939e39197106f5fc970"
url: "https://pub.dev"
source: hosted
version: "6.0.3"
flutter_context_menu:
dependency: "direct main"
description:
Expand Down Expand Up @@ -561,18 +569,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
url: "https://pub.dev"
source: hosted
version: "10.0.5"
version: "10.0.4"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.3"
leak_tracker_testing:
dependency: transitive
description:
Expand Down Expand Up @@ -625,18 +633,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev"
source: hosted
version: "0.11.1"
version: "0.8.0"
meta:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
url: "https://pub.dev"
source: hosted
version: "1.15.0"
version: "1.12.0"
mime:
dependency: transitive
description:
Expand Down Expand Up @@ -1135,26 +1143,26 @@ packages:
dependency: "direct dev"
description:
name: test
sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e"
sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073"
url: "https://pub.dev"
source: hosted
version: "1.25.7"
version: "1.25.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.0"
test_core:
dependency: transitive
description:
name: test_core
sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696"
sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4"
url: "https://pub.dev"
source: hosted
version: "0.6.4"
version: "0.6.0"
timing:
dependency: transitive
description:
Expand Down Expand Up @@ -1263,10 +1271,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev"
source: hosted
version: "14.2.5"
version: "14.2.1"
watcher:
dependency: transitive
description:
Expand Down
3 changes: 2 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ dependencies:
kosher_dart: ^2.0.16
gematria: ^1.0.0
csv: ^6.0.0
archive: ^3.4.10
archive: ^3.6.1
filter_list: 1.0.3
package_info_plus: ^8.0.2
crypto: ^3.0.5
Expand All @@ -86,6 +86,7 @@ dependencies:
git:
url: https://github.com/Sivan22/otzaria_search_engine
ref: main
flutter_archive: ^6.0.3
dependency_overrides:
# it forces the version of the intl package to be 0.19.0 across all dependencies, even if some packages specify a different compatible version.
intl: ^0.19.0
Expand Down

0 comments on commit 9d6887d

Please sign in to comment.