mirror of
https://github.com/openfoodfacts/smooth-app.git
synced 2025-08-06 18:25:11 +08:00

New file: * `background_task_language_refresh.dart`: Background task about downloading products to translate. Impacted files: * `background_task_manager.dart`: minor refactoring * `dao_product.dart`: new method `getTopProductsToTranslate` * `local_database.dart`: minor refactoring * `offline_tasks_page.dart`: minor refactoring * `operation_type.dart`: new operation type `languageRefresh` * `product_refresher.dart`: minor refactoring * `up_to_date_mixin.dart`: minor refactoring * `up_to_date_product_provider.dart`: minor refactoring * `user_preferences_language_selector.dart`: now calling new task `BackgroundTaskLanguageRefresh` when changing language
112 lines
4.0 KiB
Dart
112 lines
4.0 KiB
Dart
import 'dart:async';
|
|
import 'dart:io';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:hive_flutter/hive_flutter.dart';
|
|
import 'package:path/path.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'package:smooth_app/background/background_task_manager.dart';
|
|
import 'package:smooth_app/data_models/up_to_date_product_list_provider.dart';
|
|
import 'package:smooth_app/data_models/up_to_date_product_provider.dart';
|
|
import 'package:smooth_app/database/abstract_dao.dart';
|
|
import 'package:smooth_app/database/dao_hive_product.dart';
|
|
import 'package:smooth_app/database/dao_instant_string.dart';
|
|
import 'package:smooth_app/database/dao_int.dart';
|
|
import 'package:smooth_app/database/dao_product.dart';
|
|
import 'package:smooth_app/database/dao_product_last_access.dart';
|
|
import 'package:smooth_app/database/dao_product_list.dart';
|
|
import 'package:smooth_app/database/dao_string.dart';
|
|
import 'package:smooth_app/database/dao_string_list.dart';
|
|
import 'package:smooth_app/database/dao_string_list_map.dart';
|
|
import 'package:smooth_app/database/dao_transient_operation.dart';
|
|
import 'package:smooth_app/database/dao_work_barcode.dart';
|
|
import 'package:sqflite/sqflite.dart';
|
|
|
|
class LocalDatabase extends ChangeNotifier {
|
|
LocalDatabase._(final Database database) : _database = database {
|
|
_upToDateProductProvider = UpToDateProductProvider(this);
|
|
_upToDateProductListProvider = UpToDateProductListProvider(this);
|
|
}
|
|
|
|
final Database _database;
|
|
late final UpToDateProductProvider _upToDateProductProvider;
|
|
late final UpToDateProductListProvider _upToDateProductListProvider;
|
|
|
|
Database get database => _database;
|
|
|
|
UpToDateProductProvider get upToDate => _upToDateProductProvider;
|
|
UpToDateProductListProvider get upToDateProductList =>
|
|
_upToDateProductListProvider;
|
|
|
|
@override
|
|
void notifyListeners() {
|
|
BackgroundTaskManager.getInstance(this).run();
|
|
super.notifyListeners();
|
|
}
|
|
|
|
/// Returns all the pending background task ids.
|
|
///
|
|
/// Ugly solution to be able to mock hive data.
|
|
List<String> getAllTaskIds() =>
|
|
DaoStringList(this).getAll(DaoStringList.keyTasks);
|
|
|
|
static Future<LocalDatabase> getLocalDatabase() async {
|
|
// sql from there
|
|
final String databasesRootPath;
|
|
if (defaultTargetPlatform == TargetPlatform.iOS) {
|
|
// as suggested in https://pub.dev/documentation/sqflite/latest/sqflite/getDatabasesPath.html
|
|
final Directory directory = await getLibraryDirectory();
|
|
databasesRootPath = directory.path;
|
|
} else {
|
|
databasesRootPath = await getDatabasesPath();
|
|
}
|
|
final String databasePath = join(databasesRootPath, 'smoothie.db');
|
|
final Database database = await openDatabase(
|
|
databasePath,
|
|
version: 5,
|
|
singleInstance: true,
|
|
onUpgrade: _onUpgrade,
|
|
);
|
|
|
|
final LocalDatabase localDatabase = LocalDatabase._(database);
|
|
|
|
// only hive from there
|
|
await Hive.initFlutter();
|
|
final List<AbstractDao> daos = <AbstractDao>[
|
|
DaoHiveProduct(localDatabase),
|
|
DaoProductList(localDatabase),
|
|
DaoStringList(localDatabase),
|
|
DaoString(localDatabase),
|
|
DaoInstantString(localDatabase),
|
|
DaoInt(localDatabase),
|
|
DaoStringListMap(localDatabase),
|
|
DaoTransientOperation(localDatabase),
|
|
];
|
|
for (final AbstractDao dao in daos) {
|
|
dao.registerAdapter();
|
|
}
|
|
for (final AbstractDao dao in daos) {
|
|
await dao.init();
|
|
}
|
|
|
|
// Migrations here
|
|
// (no migration for the moment)
|
|
|
|
return localDatabase;
|
|
}
|
|
|
|
static int nowInMillis() => DateTime.now().millisecondsSinceEpoch;
|
|
|
|
/// we don't use onCreate and onUpgrade, we use only onUpgrade instead.
|
|
/// checked: from scratch, onUpgrade is called with oldVersion = 0.
|
|
static FutureOr<void> _onUpgrade(
|
|
final Database db,
|
|
final int oldVersion,
|
|
final int newVersion,
|
|
) async {
|
|
await DaoProduct.onUpgrade(db, oldVersion, newVersion);
|
|
await DaoWorkBarcode.onUpgrade(db, oldVersion, newVersion);
|
|
await DaoProductLastAccess.onUpgrade(db, oldVersion, newVersion);
|
|
}
|
|
}
|