From 7d96f38e5387bf5b32d5a2c72a471680aa5dcb20 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 21 Nov 2024 17:04:56 +0530 Subject: [PATCH] [mob][photos] Only show dialog asking for permission to open public link in-app in the android app's independednt and fdroid versions --- mobile/lib/services/deeplink_service.dart | 77 +++++++++++------------ mobile/lib/ui/tabs/home_widget.dart | 24 +++++-- mobile/pubspec.lock | 17 +++-- 3 files changed, 68 insertions(+), 50 deletions(-) diff --git a/mobile/lib/services/deeplink_service.dart b/mobile/lib/services/deeplink_service.dart index a655514e35..8ebd4900e1 100644 --- a/mobile/lib/services/deeplink_service.dart +++ b/mobile/lib/services/deeplink_service.dart @@ -1,10 +1,6 @@ -import "dart:io"; - import "package:android_intent_plus/android_intent.dart"; import "package:flutter/widgets.dart"; import "package:logging/logging.dart"; -import "package:package_info_plus/package_info_plus.dart"; -import "package:photos/services/remote_sync_service.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/utils/dialog_util.dart"; import "package:shared_preferences/shared_preferences.dart"; @@ -13,7 +9,7 @@ class DeeplinkService { static final DeeplinkService instance = DeeplinkService._privateConstructor(); DeeplinkService._privateConstructor(); - static const hasConfiguredDeeplinkPermissionKey = + static const _hasConfiguredDeeplinkPermissionKey = "has_configured_deeplink_permission"; late SharedPreferences _preferences; final _logger = Logger("NotificationService"); @@ -22,43 +18,40 @@ class DeeplinkService { _preferences = preferences; } - Future requestDeeplinkPermissions(BuildContext context) async { + Future requestDeeplinkPermissions( + BuildContext context, + String packageName, + ) async { _logger.info("Requesting to allow opening public links in-app"); try { - if (!hasConfiguredDeeplinkPermissions() && - RemoteSyncService.instance.isFirstRemoteSyncDone()) { - final choice = await showChoiceActionSheet( - isDismissible: false, - context, - title: "", - body: "Allow app to open album links", - firstButtonLabel: "Allow", - ); - if (choice!.action == ButtonAction.first) { - if (Platform.isAndroid) { - final AndroidIntent intent; - final PackageInfo packageInfo = await PackageInfo.fromPlatform(); - if (packageInfo.packageName == 'io.ente.photos.independent') { - intent = const AndroidIntent( - action: 'android.settings.APP_OPEN_BY_DEFAULT_SETTINGS', - package: 'io.ente.photos.independent', - data: 'package:io.ente.photos.independent', - ); - await intent.launch(); - } else if (packageInfo.packageName == 'io.ente.photos.fdroid') { - intent = const AndroidIntent( - action: 'android.settings.APP_OPEN_BY_DEFAULT_SETTINGS', - package: 'io.ente.photos.fdroid', - data: 'package:io.ente.photos.fdroid', - ); - await intent.launch(); - } - await setConfiguredDeeplinkPermissions(true); - _logger.info("Deeplink permissions granted"); - } - } else { - _logger.info("Deeplink permissions not granted"); + final choice = await showChoiceActionSheet( + isDismissible: false, + context, + title: "", + body: "Allow app to open album links", + firstButtonLabel: "Allow", + ); + if (choice!.action == ButtonAction.first) { + final AndroidIntent intent; + if (packageName == 'io.ente.photos.independent') { + intent = const AndroidIntent( + action: 'android.settings.APP_OPEN_BY_DEFAULT_SETTINGS', + package: 'io.ente.photos.independent', + data: 'package:io.ente.photos.independent', + ); + await intent.launch(); + } else if (packageName == 'io.ente.photos.fdroid') { + intent = const AndroidIntent( + action: 'android.settings.APP_OPEN_BY_DEFAULT_SETTINGS', + package: 'io.ente.photos.fdroid', + data: 'package:io.ente.photos.fdroid', + ); + await intent.launch(); } + await setConfiguredDeeplinkPermissions(true); + _logger.info("Deeplink permissions granted"); + } else { + _logger.info("Deeplink permissions not granted"); } } catch (e) { _logger.severe("Failed to req deeplink permission for album links", e); @@ -66,11 +59,13 @@ class DeeplinkService { } Future setConfiguredDeeplinkPermissions(bool value) async { - await _preferences.setBool(hasConfiguredDeeplinkPermissionKey, value); + await _preferences.setBool(_hasConfiguredDeeplinkPermissionKey, value); } + /// This is only relevant for fdorid and independent builds since in them, + /// user has to manually allow the app to open public links in-app bool hasConfiguredDeeplinkPermissions() { - final result = _preferences.getBool(hasConfiguredDeeplinkPermissionKey); + final result = _preferences.getBool(_hasConfiguredDeeplinkPermissionKey); return result ?? false; } } diff --git a/mobile/lib/ui/tabs/home_widget.dart b/mobile/lib/ui/tabs/home_widget.dart index 3d74058c73..0093b64d2c 100644 --- a/mobile/lib/ui/tabs/home_widget.dart +++ b/mobile/lib/ui/tabs/home_widget.dart @@ -11,6 +11,7 @@ import 'package:logging/logging.dart'; import "package:media_extension/media_extension_action_types.dart"; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import "package:move_to_background/move_to_background.dart"; +import "package:package_info_plus/package_info_plus.dart"; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/ente_theme_data.dart'; @@ -35,6 +36,7 @@ import 'package:photos/services/collections_service.dart'; import "package:photos/services/deeplink_service.dart"; import 'package:photos/services/local_sync_service.dart'; import "package:photos/services/notification_service.dart"; +import "package:photos/services/remote_sync_service.dart"; import 'package:photos/services/user_service.dart'; import 'package:photos/states/user_details_state.dart'; import 'package:photos/theme/colors.dart'; @@ -233,15 +235,27 @@ class _HomeWidgetState extends State { }, ), ); + NotificationService.instance .initialize(_onDidReceiveNotificationResponse) .ignore(); - Platform.isAndroid - ? WidgetsBinding.instance.addPostFrameCallback((_) { - DeeplinkService.instance.requestDeeplinkPermissions(context); - }) - : null; + if (Platform.isAndroid && + !DeeplinkService.instance.hasConfiguredDeeplinkPermissions() && + RemoteSyncService.instance.isFirstRemoteSyncDone()) { + PackageInfo.fromPlatform().then((packageInfo) { + final packageName = packageInfo.packageName; + if (packageName == 'io.ente.photos.independent' || + packageName == 'io.ente.photos.fdroid') { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + DeeplinkService.instance + .requestDeeplinkPermissions(context, packageName); + } + }); + } + }); + } } Future _handlePublicAlbumLink(Uri uri) async { diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 87517811da..d5953361ba 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -38,6 +38,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.7.0" + android_intent_plus: + dependency: "direct main" + description: + name: android_intent_plus + sha256: "38921ec22ebb3b9a7eb678792cf6fab0b6f458b61b9d327688573449c9b47db3" + url: "https://pub.dev" + source: hosted + version: "5.2.0" animate_do: dependency: "direct main" description: @@ -1501,10 +1509,11 @@ packages: media_extension: dependency: "direct main" description: - name: media_extension - sha256: "5c4347d7035a48220c210149df776c764b920daf312b2ae7e3077506273db8d3" - url: "https://pub.dev" - source: hosted + path: "." + ref: HEAD + resolved-ref: "4bcd4cf45ea213feef8cf5e2814ea16d61f1d69e" + url: "https://github.com/AmanRajSinghMourya/media_extension.git" + source: git version: "1.0.2" media_kit: dependency: "direct main"