diff --git a/mobile/apps/photos/ios/Podfile.lock b/mobile/apps/photos/ios/Podfile.lock index a152ef181c..3a8b2d74df 100644 --- a/mobile/apps/photos/ios/Podfile.lock +++ b/mobile/apps/photos/ios/Podfile.lock @@ -12,6 +12,8 @@ PODS: - Flutter - device_info_plus (0.0.1): - Flutter + - emoji_picker_flutter (0.0.1): + - Flutter - ffmpeg_kit_custom (6.0.3) - ffmpeg_kit_flutter (6.0.3): - ffmpeg_kit_custom @@ -179,6 +181,8 @@ PODS: - PromisesObjC (2.4.0) - receive_sharing_intent (1.8.1): - Flutter + - rust_lib_photos (0.0.1): + - Flutter - SDWebImage (5.21.1): - SDWebImage/Core (= 5.21.1) - SDWebImage/Core (5.21.1) @@ -228,6 +232,8 @@ PODS: - Flutter - url_launcher_ios (0.0.1): - Flutter + - vibration (1.7.5): + - Flutter - video_player_avfoundation (0.0.1): - Flutter - FlutterMacOS @@ -248,6 +254,7 @@ DEPENDENCIES: - cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`) - dart_ui_isolate (from `.symlinks/plugins/dart_ui_isolate/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) + - emoji_picker_flutter (from `.symlinks/plugins/emoji_picker_flutter/ios`) - ffmpeg_kit_flutter (from `.symlinks/plugins/ffmpeg_kit_flutter/ios`) - file_saver (from `.symlinks/plugins/file_saver/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) @@ -294,6 +301,7 @@ DEPENDENCIES: - thermal (from `.symlinks/plugins/thermal/ios`) - ua_client_hints (from `.symlinks/plugins/ua_client_hints/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - vibration (from `.symlinks/plugins/vibration/ios`) - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) - video_thumbnail (from `.symlinks/plugins/video_thumbnail/ios`) - volume_controller (from `.symlinks/plugins/volume_controller/ios`) @@ -336,6 +344,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/dart_ui_isolate/ios" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" + emoji_picker_flutter: + :path: ".symlinks/plugins/emoji_picker_flutter/ios" ffmpeg_kit_flutter: :path: ".symlinks/plugins/ffmpeg_kit_flutter/ios" file_saver: @@ -428,6 +438,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/ua_client_hints/ios" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" + vibration: + :path: ".symlinks/plugins/vibration/ios" video_player_avfoundation: :path: ".symlinks/plugins/video_player_avfoundation/darwin" video_thumbnail: @@ -446,6 +458,7 @@ SPEC CHECKSUMS: cupertino_http: 94ac07f5ff090b8effa6c5e2c47871d48ab7c86c dart_ui_isolate: 46f6714abe6891313267153ef6f9748d8ecfcab1 device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe + emoji_picker_flutter: ed468d9746c21711e66b2788880519a9de5de211 ffmpeg_kit_custom: 682b4f2f1ff1f8abae5a92f6c3540f2441d5be99 ffmpeg_kit_flutter: 915b345acc97d4142e8a9a8549d177ff10f043f5 file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6 @@ -497,6 +510,7 @@ SPEC CHECKSUMS: privacy_screen: 3159a541f5d3a31bea916cfd4e58f9dc722b3fd4 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00 + rust_lib_photos: 04d3901908d2972192944083310b65abf410774c SDWebImage: f29024626962457f3470184232766516dee8dfea SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 Sentry: da60d980b197a46db0b35ea12cb8f39af48d8854 @@ -510,6 +524,7 @@ SPEC CHECKSUMS: thermal: d4c48be750d1ddbab36b0e2dcb2471531bc8df41 ua_client_hints: 92fe0d139619b73ec9fcb46cc7e079a26178f586 url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + vibration: 8e2f50fc35bb736f9eecb7dd9f7047fbb6a6e888 video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b video_thumbnail: b637e0ad5f588ca9945f6e2c927f73a69a661140 volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12 diff --git a/mobile/apps/photos/ios/Runner.xcodeproj/project.pbxproj b/mobile/apps/photos/ios/Runner.xcodeproj/project.pbxproj index 56ba9d2b02..5471f4f021 100644 --- a/mobile/apps/photos/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/apps/photos/ios/Runner.xcodeproj/project.pbxproj @@ -532,6 +532,7 @@ "${BUILT_PRODUCTS_DIR}/cupertino_http/cupertino_http.framework", "${BUILT_PRODUCTS_DIR}/dart_ui_isolate/dart_ui_isolate.framework", "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework", + "${BUILT_PRODUCTS_DIR}/emoji_picker_flutter/emoji_picker_flutter.framework", "${BUILT_PRODUCTS_DIR}/file_saver/file_saver.framework", "${BUILT_PRODUCTS_DIR}/flutter_email_sender/flutter_email_sender.framework", "${BUILT_PRODUCTS_DIR}/flutter_image_compress_common/flutter_image_compress_common.framework", @@ -575,6 +576,7 @@ "${BUILT_PRODUCTS_DIR}/thermal/thermal.framework", "${BUILT_PRODUCTS_DIR}/ua_client_hints/ua_client_hints.framework", "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework", + "${BUILT_PRODUCTS_DIR}/vibration/vibration.framework", "${BUILT_PRODUCTS_DIR}/video_player_avfoundation/video_player_avfoundation.framework", "${BUILT_PRODUCTS_DIR}/video_thumbnail/video_thumbnail.framework", "${BUILT_PRODUCTS_DIR}/volume_controller/volume_controller.framework", @@ -627,6 +629,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/cupertino_http.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/dart_ui_isolate.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/emoji_picker_flutter.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/file_saver.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_email_sender.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_image_compress_common.framework", @@ -670,6 +673,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/thermal.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ua_client_hints.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibration.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_player_avfoundation.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_thumbnail.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/volume_controller.framework", diff --git a/mobile/apps/photos/ios/Runner/AppDelegate.swift b/mobile/apps/photos/ios/Runner/AppDelegate.swift index cbf287bc52..8673b08bc4 100644 --- a/mobile/apps/photos/ios/Runner/AppDelegate.swift +++ b/mobile/apps/photos/ios/Runner/AppDelegate.swift @@ -27,9 +27,12 @@ import workmanager // Retrieve the link from parameters if let url = AppLinks.shared.getLink(launchOptions: launchOptions) { - // We have a link, propagate it to your Flutter app or not - AppLinks.shared.handleLink(url: url) - return true // Returning true will stop the propagation to other packages + // only accept non-homewidget urls for AppLinks + if !url.absoluteString.contains("&homeWidget") { + AppLinks.shared.handleLink(url: url) + // link is handled, stop propagation + return true + } } return super.application(application, didFinishLaunchingWithOptions: launchOptions) diff --git a/mobile/apps/photos/lib/app.dart b/mobile/apps/photos/lib/app.dart index 45bcb63019..a872a704df 100644 --- a/mobile/apps/photos/lib/app.dart +++ b/mobile/apps/photos/lib/app.dart @@ -89,8 +89,9 @@ class _EnteAppState extends State with WidgetsBindingObserver { _checkForWidgetLaunch(); } - void _checkForWidgetLaunch() { - hw.HomeWidget.initiallyLaunchedFromHomeWidget().then( + Future _checkForWidgetLaunch() async { + await HomeWidgetService.instance.setAppGroup(); + await hw.HomeWidget.initiallyLaunchedFromHomeWidget().then( (uri) => HomeWidgetService.instance.onLaunchFromWidget(uri, context), ); hw.HomeWidget.widgetClicked.listen( diff --git a/mobile/apps/photos/lib/main.dart b/mobile/apps/photos/lib/main.dart index db7aa5d1b8..585170bc32 100644 --- a/mobile/apps/photos/lib/main.dart +++ b/mobile/apps/photos/lib/main.dart @@ -174,7 +174,6 @@ Future _runMinimally(String taskId, TimeLogger tlog) async { // Misc Services await UserService.instance.init(); NotificationService.instance.init(prefs); - if (Platform.isAndroid) HomeWidgetService.instance.init(prefs); // Begin Execution // only runs for android @@ -269,8 +268,6 @@ Future _init(bool isBackground, {String via = ''}) async { await SyncService.instance.init(preferences); _logger.info("SyncService init done $tlog"); - HomeWidgetService.instance.init(preferences); - if (!isBackground) { await _scheduleFGHomeWidgetSync(); } diff --git a/mobile/apps/photos/lib/services/album_home_widget_service.dart b/mobile/apps/photos/lib/services/album_home_widget_service.dart index 9513427e1f..7cf07d9e13 100644 --- a/mobile/apps/photos/lib/services/album_home_widget_service.dart +++ b/mobile/apps/photos/lib/services/album_home_widget_service.dart @@ -39,12 +39,7 @@ class AlbumHomeWidgetService { // Properties final Logger _logger = Logger((AlbumHomeWidgetService).toString()); - late final SharedPreferences _prefs; - - // Initialization - void init(SharedPreferences prefs) { - _prefs = prefs; - } + SharedPreferences get _prefs => ServiceLocator.instance.prefs; // Public methods List? getSelectedAlbumIds() { diff --git a/mobile/apps/photos/lib/services/home_widget_service.dart b/mobile/apps/photos/lib/services/home_widget_service.dart index 3c86fbe51b..f6f9e057b2 100644 --- a/mobile/apps/photos/lib/services/home_widget_service.dart +++ b/mobile/apps/photos/lib/services/home_widget_service.dart @@ -55,23 +55,22 @@ class HomeWidgetService { final Logger _logger = Logger((HomeWidgetService).toString()); final computeLock = Lock(); + bool _isAppGroupSet = false; - void init(SharedPreferences prefs) { - setAppGroupID(iOSGroupIDMemory); - _initializeWidgetServices(prefs); - } - - void _initializeWidgetServices(SharedPreferences prefs) { - AlbumHomeWidgetService.instance.init(prefs); - PeopleHomeWidgetService.instance.init(prefs); - MemoryHomeWidgetService.instance.init(prefs); - } - - void setAppGroupID(String id) { - hw.HomeWidget.setAppGroupId(id).ignore(); + Future setAppGroup({String id = iOSGroupIDMemory}) async { + if (!Platform.isIOS || _isAppGroupSet) return; + _logger.info("Setting app group id"); + await hw.HomeWidget.setAppGroupId(id).catchError( + (error) { + _logger.severe("Failed to set app group ID: $error"); + return null; + }, + ); + _isAppGroupSet = true; } Future initHomeWidget([bool isBg = false]) async { + await setAppGroup(); await AlbumHomeWidgetService.instance.initAlbumHomeWidget(isBg); await PeopleHomeWidgetService.instance.initPeopleHomeWidget(); await MemoryHomeWidgetService.instance.initMemoryHomeWidget(); @@ -218,7 +217,7 @@ class HomeWidgetService { Future clearWidget(bool autoLogout) async { if (autoLogout) { - setAppGroupID(iOSGroupIDMemory); + await setAppGroup(); } await Future.wait([ diff --git a/mobile/apps/photos/lib/services/memory_home_widget_service.dart b/mobile/apps/photos/lib/services/memory_home_widget_service.dart index ca69b75eb4..a78a650a9d 100644 --- a/mobile/apps/photos/lib/services/memory_home_widget_service.dart +++ b/mobile/apps/photos/lib/services/memory_home_widget_service.dart @@ -31,12 +31,7 @@ class MemoryHomeWidgetService { // Properties final Logger _logger = Logger((MemoryHomeWidgetService).toString()); - late final SharedPreferences _prefs; - - // Initialization - void init(SharedPreferences prefs) { - _prefs = prefs; - } + SharedPreferences get _prefs => ServiceLocator.instance.prefs; // Preference getters and setters bool? hasLastYearMemoriesSelected() { diff --git a/mobile/apps/photos/lib/services/people_home_widget_service.dart b/mobile/apps/photos/lib/services/people_home_widget_service.dart index c204e140b1..323bac5351 100644 --- a/mobile/apps/photos/lib/services/people_home_widget_service.dart +++ b/mobile/apps/photos/lib/services/people_home_widget_service.dart @@ -35,14 +35,9 @@ class PeopleHomeWidgetService { // Properties final Logger _logger = Logger((PeopleHomeWidgetService).toString()); - late final SharedPreferences _prefs; + SharedPreferences get _prefs => ServiceLocator.instance.prefs; final peopleChangedLock = Lock(); - // Initialization - void init(SharedPreferences prefs) { - _prefs = prefs; - } - // Public methods List? getSelectedPeople() { return _prefs.getStringList(SELECTED_PEOPLE_KEY); diff --git a/mobile/apps/photos/scripts/internal_changes.txt b/mobile/apps/photos/scripts/internal_changes.txt index f6341c95b3..82485723c3 100644 --- a/mobile/apps/photos/scripts/internal_changes.txt +++ b/mobile/apps/photos/scripts/internal_changes.txt @@ -1,3 +1,4 @@ +- (prtk) Fix widget initial launch on iOS - (prtk) Upgrade Flutter version to 3.32.8 - (prtk) Run FFMpeg in an isolate - Neeraj: Handle custom domain links