[mob][photos] Only show dialog asking for permission to open public link in-app in the android app's independednt and fdroid versions

This commit is contained in:
ashilkn
2024-11-21 17:04:56 +05:30
parent 45bf98c859
commit 7d96f38e53
3 changed files with 68 additions and 50 deletions

View File

@@ -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<void> requestDeeplinkPermissions(BuildContext context) async {
Future<void> 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<void> 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;
}
}

View File

@@ -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<HomeWidget> {
},
),
);
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<void> _handlePublicAlbumLink(Uri uri) async {

View File

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