[mob][photos] fix widget tap on iOS (#6882)

## Description

Widget tap was not opening the specified photo because the app group id
was not setting correctly when the method was being called.

## Tests
This commit is contained in:
Prateek Sunal
2025-08-18 22:23:36 +05:30
committed by GitHub
10 changed files with 45 additions and 40 deletions

View File

@@ -12,6 +12,8 @@ PODS:
- Flutter - Flutter
- device_info_plus (0.0.1): - device_info_plus (0.0.1):
- Flutter - Flutter
- emoji_picker_flutter (0.0.1):
- Flutter
- ffmpeg_kit_custom (6.0.3) - ffmpeg_kit_custom (6.0.3)
- ffmpeg_kit_flutter (6.0.3): - ffmpeg_kit_flutter (6.0.3):
- ffmpeg_kit_custom - ffmpeg_kit_custom
@@ -179,6 +181,8 @@ PODS:
- PromisesObjC (2.4.0) - PromisesObjC (2.4.0)
- receive_sharing_intent (1.8.1): - receive_sharing_intent (1.8.1):
- Flutter - Flutter
- rust_lib_photos (0.0.1):
- Flutter
- SDWebImage (5.21.1): - SDWebImage (5.21.1):
- SDWebImage/Core (= 5.21.1) - SDWebImage/Core (= 5.21.1)
- SDWebImage/Core (5.21.1) - SDWebImage/Core (5.21.1)
@@ -228,6 +232,8 @@ PODS:
- Flutter - Flutter
- url_launcher_ios (0.0.1): - url_launcher_ios (0.0.1):
- Flutter - Flutter
- vibration (1.7.5):
- Flutter
- video_player_avfoundation (0.0.1): - video_player_avfoundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
@@ -248,6 +254,7 @@ DEPENDENCIES:
- cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`) - cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`)
- dart_ui_isolate (from `.symlinks/plugins/dart_ui_isolate/ios`) - dart_ui_isolate (from `.symlinks/plugins/dart_ui_isolate/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/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`) - ffmpeg_kit_flutter (from `.symlinks/plugins/ffmpeg_kit_flutter/ios`)
- file_saver (from `.symlinks/plugins/file_saver/ios`) - file_saver (from `.symlinks/plugins/file_saver/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`)
@@ -294,6 +301,7 @@ DEPENDENCIES:
- thermal (from `.symlinks/plugins/thermal/ios`) - thermal (from `.symlinks/plugins/thermal/ios`)
- ua_client_hints (from `.symlinks/plugins/ua_client_hints/ios`) - ua_client_hints (from `.symlinks/plugins/ua_client_hints/ios`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/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_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
- video_thumbnail (from `.symlinks/plugins/video_thumbnail/ios`) - video_thumbnail (from `.symlinks/plugins/video_thumbnail/ios`)
- volume_controller (from `.symlinks/plugins/volume_controller/ios`) - volume_controller (from `.symlinks/plugins/volume_controller/ios`)
@@ -336,6 +344,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/dart_ui_isolate/ios" :path: ".symlinks/plugins/dart_ui_isolate/ios"
device_info_plus: device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios" :path: ".symlinks/plugins/device_info_plus/ios"
emoji_picker_flutter:
:path: ".symlinks/plugins/emoji_picker_flutter/ios"
ffmpeg_kit_flutter: ffmpeg_kit_flutter:
:path: ".symlinks/plugins/ffmpeg_kit_flutter/ios" :path: ".symlinks/plugins/ffmpeg_kit_flutter/ios"
file_saver: file_saver:
@@ -428,6 +438,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/ua_client_hints/ios" :path: ".symlinks/plugins/ua_client_hints/ios"
url_launcher_ios: url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios" :path: ".symlinks/plugins/url_launcher_ios/ios"
vibration:
:path: ".symlinks/plugins/vibration/ios"
video_player_avfoundation: video_player_avfoundation:
:path: ".symlinks/plugins/video_player_avfoundation/darwin" :path: ".symlinks/plugins/video_player_avfoundation/darwin"
video_thumbnail: video_thumbnail:
@@ -446,6 +458,7 @@ SPEC CHECKSUMS:
cupertino_http: 94ac07f5ff090b8effa6c5e2c47871d48ab7c86c cupertino_http: 94ac07f5ff090b8effa6c5e2c47871d48ab7c86c
dart_ui_isolate: 46f6714abe6891313267153ef6f9748d8ecfcab1 dart_ui_isolate: 46f6714abe6891313267153ef6f9748d8ecfcab1
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
emoji_picker_flutter: ed468d9746c21711e66b2788880519a9de5de211
ffmpeg_kit_custom: 682b4f2f1ff1f8abae5a92f6c3540f2441d5be99 ffmpeg_kit_custom: 682b4f2f1ff1f8abae5a92f6c3540f2441d5be99
ffmpeg_kit_flutter: 915b345acc97d4142e8a9a8549d177ff10f043f5 ffmpeg_kit_flutter: 915b345acc97d4142e8a9a8549d177ff10f043f5
file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6 file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6
@@ -497,6 +510,7 @@ SPEC CHECKSUMS:
privacy_screen: 3159a541f5d3a31bea916cfd4e58f9dc722b3fd4 privacy_screen: 3159a541f5d3a31bea916cfd4e58f9dc722b3fd4
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00 receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00
rust_lib_photos: 04d3901908d2972192944083310b65abf410774c
SDWebImage: f29024626962457f3470184232766516dee8dfea SDWebImage: f29024626962457f3470184232766516dee8dfea
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
Sentry: da60d980b197a46db0b35ea12cb8f39af48d8854 Sentry: da60d980b197a46db0b35ea12cb8f39af48d8854
@@ -510,6 +524,7 @@ SPEC CHECKSUMS:
thermal: d4c48be750d1ddbab36b0e2dcb2471531bc8df41 thermal: d4c48be750d1ddbab36b0e2dcb2471531bc8df41
ua_client_hints: 92fe0d139619b73ec9fcb46cc7e079a26178f586 ua_client_hints: 92fe0d139619b73ec9fcb46cc7e079a26178f586
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
vibration: 8e2f50fc35bb736f9eecb7dd9f7047fbb6a6e888
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
video_thumbnail: b637e0ad5f588ca9945f6e2c927f73a69a661140 video_thumbnail: b637e0ad5f588ca9945f6e2c927f73a69a661140
volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12 volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12

View File

@@ -532,6 +532,7 @@
"${BUILT_PRODUCTS_DIR}/cupertino_http/cupertino_http.framework", "${BUILT_PRODUCTS_DIR}/cupertino_http/cupertino_http.framework",
"${BUILT_PRODUCTS_DIR}/dart_ui_isolate/dart_ui_isolate.framework", "${BUILT_PRODUCTS_DIR}/dart_ui_isolate/dart_ui_isolate.framework",
"${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.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}/file_saver/file_saver.framework",
"${BUILT_PRODUCTS_DIR}/flutter_email_sender/flutter_email_sender.framework", "${BUILT_PRODUCTS_DIR}/flutter_email_sender/flutter_email_sender.framework",
"${BUILT_PRODUCTS_DIR}/flutter_image_compress_common/flutter_image_compress_common.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}/thermal/thermal.framework",
"${BUILT_PRODUCTS_DIR}/ua_client_hints/ua_client_hints.framework", "${BUILT_PRODUCTS_DIR}/ua_client_hints/ua_client_hints.framework",
"${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.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_player_avfoundation/video_player_avfoundation.framework",
"${BUILT_PRODUCTS_DIR}/video_thumbnail/video_thumbnail.framework", "${BUILT_PRODUCTS_DIR}/video_thumbnail/video_thumbnail.framework",
"${BUILT_PRODUCTS_DIR}/volume_controller/volume_controller.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}/cupertino_http.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/dart_ui_isolate.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}/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}/file_saver.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_email_sender.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_email_sender.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_image_compress_common.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}/thermal.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ua_client_hints.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}/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_player_avfoundation.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_thumbnail.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_thumbnail.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/volume_controller.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/volume_controller.framework",

View File

@@ -27,9 +27,12 @@ import workmanager
// Retrieve the link from parameters // Retrieve the link from parameters
if let url = AppLinks.shared.getLink(launchOptions: launchOptions) { if let url = AppLinks.shared.getLink(launchOptions: launchOptions) {
// We have a link, propagate it to your Flutter app or not // only accept non-homewidget urls for AppLinks
AppLinks.shared.handleLink(url: url) if !url.absoluteString.contains("&homeWidget") {
return true // Returning true will stop the propagation to other packages AppLinks.shared.handleLink(url: url)
// link is handled, stop propagation
return true
}
} }
return super.application(application, didFinishLaunchingWithOptions: launchOptions) return super.application(application, didFinishLaunchingWithOptions: launchOptions)

View File

@@ -89,8 +89,9 @@ class _EnteAppState extends State<EnteApp> with WidgetsBindingObserver {
_checkForWidgetLaunch(); _checkForWidgetLaunch();
} }
void _checkForWidgetLaunch() { Future<void> _checkForWidgetLaunch() async {
hw.HomeWidget.initiallyLaunchedFromHomeWidget().then( await HomeWidgetService.instance.setAppGroup();
await hw.HomeWidget.initiallyLaunchedFromHomeWidget().then(
(uri) => HomeWidgetService.instance.onLaunchFromWidget(uri, context), (uri) => HomeWidgetService.instance.onLaunchFromWidget(uri, context),
); );
hw.HomeWidget.widgetClicked.listen( hw.HomeWidget.widgetClicked.listen(

View File

@@ -174,7 +174,6 @@ Future<void> _runMinimally(String taskId, TimeLogger tlog) async {
// Misc Services // Misc Services
await UserService.instance.init(); await UserService.instance.init();
NotificationService.instance.init(prefs); NotificationService.instance.init(prefs);
if (Platform.isAndroid) HomeWidgetService.instance.init(prefs);
// Begin Execution // Begin Execution
// only runs for android // only runs for android
@@ -269,8 +268,6 @@ Future<void> _init(bool isBackground, {String via = ''}) async {
await SyncService.instance.init(preferences); await SyncService.instance.init(preferences);
_logger.info("SyncService init done $tlog"); _logger.info("SyncService init done $tlog");
HomeWidgetService.instance.init(preferences);
if (!isBackground) { if (!isBackground) {
await _scheduleFGHomeWidgetSync(); await _scheduleFGHomeWidgetSync();
} }

View File

@@ -39,12 +39,7 @@ class AlbumHomeWidgetService {
// Properties // Properties
final Logger _logger = Logger((AlbumHomeWidgetService).toString()); final Logger _logger = Logger((AlbumHomeWidgetService).toString());
late final SharedPreferences _prefs; SharedPreferences get _prefs => ServiceLocator.instance.prefs;
// Initialization
void init(SharedPreferences prefs) {
_prefs = prefs;
}
// Public methods // Public methods
List<int>? getSelectedAlbumIds() { List<int>? getSelectedAlbumIds() {

View File

@@ -55,23 +55,22 @@ class HomeWidgetService {
final Logger _logger = Logger((HomeWidgetService).toString()); final Logger _logger = Logger((HomeWidgetService).toString());
final computeLock = Lock(); final computeLock = Lock();
bool _isAppGroupSet = false;
void init(SharedPreferences prefs) { Future<void> setAppGroup({String id = iOSGroupIDMemory}) async {
setAppGroupID(iOSGroupIDMemory); if (!Platform.isIOS || _isAppGroupSet) return;
_initializeWidgetServices(prefs); _logger.info("Setting app group id");
} await hw.HomeWidget.setAppGroupId(id).catchError(
(error) {
void _initializeWidgetServices(SharedPreferences prefs) { _logger.severe("Failed to set app group ID: $error");
AlbumHomeWidgetService.instance.init(prefs); return null;
PeopleHomeWidgetService.instance.init(prefs); },
MemoryHomeWidgetService.instance.init(prefs); );
} _isAppGroupSet = true;
void setAppGroupID(String id) {
hw.HomeWidget.setAppGroupId(id).ignore();
} }
Future<void> initHomeWidget([bool isBg = false]) async { Future<void> initHomeWidget([bool isBg = false]) async {
await setAppGroup();
await AlbumHomeWidgetService.instance.initAlbumHomeWidget(isBg); await AlbumHomeWidgetService.instance.initAlbumHomeWidget(isBg);
await PeopleHomeWidgetService.instance.initPeopleHomeWidget(); await PeopleHomeWidgetService.instance.initPeopleHomeWidget();
await MemoryHomeWidgetService.instance.initMemoryHomeWidget(); await MemoryHomeWidgetService.instance.initMemoryHomeWidget();
@@ -218,7 +217,7 @@ class HomeWidgetService {
Future<void> clearWidget(bool autoLogout) async { Future<void> clearWidget(bool autoLogout) async {
if (autoLogout) { if (autoLogout) {
setAppGroupID(iOSGroupIDMemory); await setAppGroup();
} }
await Future.wait([ await Future.wait([

View File

@@ -31,12 +31,7 @@ class MemoryHomeWidgetService {
// Properties // Properties
final Logger _logger = Logger((MemoryHomeWidgetService).toString()); final Logger _logger = Logger((MemoryHomeWidgetService).toString());
late final SharedPreferences _prefs; SharedPreferences get _prefs => ServiceLocator.instance.prefs;
// Initialization
void init(SharedPreferences prefs) {
_prefs = prefs;
}
// Preference getters and setters // Preference getters and setters
bool? hasLastYearMemoriesSelected() { bool? hasLastYearMemoriesSelected() {

View File

@@ -35,14 +35,9 @@ class PeopleHomeWidgetService {
// Properties // Properties
final Logger _logger = Logger((PeopleHomeWidgetService).toString()); final Logger _logger = Logger((PeopleHomeWidgetService).toString());
late final SharedPreferences _prefs; SharedPreferences get _prefs => ServiceLocator.instance.prefs;
final peopleChangedLock = Lock(); final peopleChangedLock = Lock();
// Initialization
void init(SharedPreferences prefs) {
_prefs = prefs;
}
// Public methods // Public methods
List<String>? getSelectedPeople() { List<String>? getSelectedPeople() {
return _prefs.getStringList(SELECTED_PEOPLE_KEY); return _prefs.getStringList(SELECTED_PEOPLE_KEY);

View File

@@ -1,3 +1,4 @@
- (prtk) Fix widget initial launch on iOS
- (prtk) Upgrade Flutter version to 3.32.8 - (prtk) Upgrade Flutter version to 3.32.8
- (prtk) Run FFMpeg in an isolate - (prtk) Run FFMpeg in an isolate
- Neeraj: Handle custom domain links - Neeraj: Handle custom domain links