[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
- 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

View File

@@ -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",

View File

@@ -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)

View File

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

View File

@@ -174,7 +174,6 @@ Future<void> _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<void> _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();
}

View File

@@ -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<int>? getSelectedAlbumIds() {

View File

@@ -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<void> 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<void> 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<void> clearWidget(bool autoLogout) async {
if (autoLogout) {
setAppGroupID(iOSGroupIDMemory);
await setAppGroup();
}
await Future.wait([

View File

@@ -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() {

View File

@@ -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<String>? getSelectedPeople() {
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) Run FFMpeg in an isolate
- Neeraj: Handle custom domain links