diff --git a/lib/logic/collectibles_logic.dart b/lib/logic/collectibles_logic.dart index 976be536..6328f61a 100644 --- a/lib/logic/collectibles_logic.dart +++ b/lib/logic/collectibles_logic.dart @@ -2,15 +2,15 @@ import 'dart:convert'; import 'package:home_widget/home_widget.dart'; import 'package:wonders/common_libs.dart'; +import 'package:wonders/logic/common/platform_info.dart'; import 'package:wonders/logic/common/save_load_mixin.dart'; import 'package:wonders/logic/data/collectible_data.dart'; import 'package:http/http.dart' as http; +import 'package:wonders/logic/native_widget_service.dart'; class CollectiblesLogic with ThrottledSaveLoadMixin { @override String get fileName => 'collectibles.dat'; - static const _appGroupId = 'group.com.gskinner.flutter.wonders.widget'; - static const _appName = 'WonderousWidget'; /// Holds all collectibles that the views should care about final List all = collectiblesData; @@ -26,9 +26,9 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { int get exploredCount => _exploredCount; - void init() { - HomeWidget.setAppGroupId(_appGroupId); - } + late final _nativeWidget = GetIt.I(); + + void init() => _nativeWidget.init(); CollectibleData? fromId(String? id) => id == null ? null : all.firstWhereOrNull((o) => o.id == id); @@ -58,9 +58,12 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { if (state == CollectibleState.explored) _exploredCount++; }); final foundCount = discoveredCount + exploredCount; - HomeWidget.saveWidgetData('discoveredCount', foundCount).then((value) { - HomeWidget.updateWidget(iOSName: _appName); - }); + if (PlatformInfo.isIOS) { + _nativeWidget.save('discoveredCount', foundCount).then((value) { + _nativeWidget.markDirty(); + }); + } + debugPrint('setting discoveredCount for home widget $foundCount'); } @@ -100,14 +103,14 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { Future _updateHomeWidgetTextData({String title = '', String id = '', String imageUrl = ''}) async { // Save title - await HomeWidget.saveWidgetData('lastDiscoveredTitle', title); + await _nativeWidget.save('lastDiscoveredTitle', title); // Subtitle String subTitle = ''; if (id.isNotEmpty) { final artifactData = await artifactLogic.getArtifactByID(id); subTitle = artifactData?.date ?? ''; } - await HomeWidget.saveWidgetData('lastDiscoveredSubTitle', subTitle); + await _nativeWidget.save('lastDiscoveredSubTitle', subTitle); // Image, // Download, convert to base64 string and write to shared widget data String imageBase64 = ''; @@ -116,8 +119,8 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { imageBase64 = base64Encode(bytes); debugPrint('Saving base64 bytes: $imageBase64'); } - await HomeWidget.saveWidgetData('lastDiscoveredImageData', imageBase64); - await HomeWidget.updateWidget(iOSName: _appName); + await _nativeWidget.save('lastDiscoveredImageData', imageBase64); + await _nativeWidget.markDirty(); } @override diff --git a/lib/logic/native_widget_service.dart b/lib/logic/native_widget_service.dart new file mode 100644 index 00000000..ae86086f --- /dev/null +++ b/lib/logic/native_widget_service.dart @@ -0,0 +1,28 @@ +import 'package:home_widget/home_widget.dart'; +import 'package:wonders/logic/common/platform_info.dart'; + +/// Small facade for the HomeWidget package +class NativeWidgetService { + static const _iosAppGroupId = 'group.com.gskinner.flutter.wonders.widget'; + static const _iosAppName = 'WonderousWidget'; + + static final bool _isSupported = PlatformInfo.isIOS; + + Future init() async { + if (!_isSupported) return; + await HomeWidget.setAppGroupId(_iosAppGroupId); + } + + Future save(String s, T value, {void Function(bool?)? onSaveComplete}) async { + if (!_isSupported) return false; + return await HomeWidget.saveWidgetData(s, value).then((value) { + onSaveComplete?.call(value); + return null; + }); + } + + Future markDirty() async { + if (!_isSupported) return false; + return await HomeWidget.updateWidget(iOSName: _iosAppName); + } +} diff --git a/lib/main.dart b/lib/main.dart index f826298b..e486080e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,6 +5,7 @@ import 'package:wonders/common_libs.dart'; import 'package:wonders/logic/artifact_api_logic.dart'; import 'package:wonders/logic/artifact_api_service.dart'; import 'package:wonders/logic/collectibles_logic.dart'; +import 'package:wonders/logic/native_widget_service.dart'; import 'package:wonders/logic/locale_logic.dart'; import 'package:wonders/logic/timeline_logic.dart'; import 'package:wonders/logic/unsplash_logic.dart'; @@ -69,6 +70,8 @@ void registerSingletons() { GetIt.I.registerLazySingleton(() => CollectiblesLogic()); // Localizations GetIt.I.registerLazySingleton(() => LocaleLogic()); + // Home Widget Service + GetIt.I.registerLazySingleton(() => NativeWidgetService()); } /// Add syntax sugar for quickly accessing the main "logic" controllers in the app