diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b6ee3c31a..1b2e5b616 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -109,6 +109,20 @@ + + + + + + + + + + diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 8c6e56146..d57061dd6 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 13.0 diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 91e1a0719..787b57fb8 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -7,6 +7,7 @@ com.apple.developer.associated-domains applinks:app.pangea.chat + applinks:app.staging.pangea.chat com.apple.security.application-groups diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 37bdbd7b9..1419dc938 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:app_links/app_links.dart'; import 'package:cross_file/cross_file.dart'; import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; import 'package:go_router/go_router.dart'; @@ -105,7 +104,9 @@ class ChatListController extends State StreamSubscription? _intentFileStreamSubscription; - StreamSubscription? _intentUriStreamSubscription; + // #Pangea + // StreamSubscription? _intentUriStreamSubscription; + // Pangea# ActiveFilter activeFilter = AppConfig.separateChatTypes ? ActiveFilter.messages @@ -463,6 +464,9 @@ class ChatListController extends State void _processIncomingSharedMedia(List files) { if (files.isEmpty) return; + // #Pangea + if (files.every((f) => f.type == SharedMediaType.url)) return; + // Pangea# showScaffoldDialog( context: context, @@ -487,13 +491,15 @@ class ChatListController extends State ); } - void _processIncomingUris(Uri? uri) async { - if (uri == null) return; - context.go('/rooms'); - WidgetsBinding.instance.addPostFrameCallback((_) { - UrlLauncher(context, uri.toString()).openMatrixToUrl(); - }); - } + // #Pangea + // void _processIncomingUris(Uri? uri) async { + // if (uri == null) return; + // context.go('/rooms'); + // WidgetsBinding.instance.addPostFrameCallback((_) { + // UrlLauncher(context, uri.toString()).openMatrixToUrl(); + // }); + // } + // Pangea# void _initReceiveSharingIntent() { if (!PlatformInfos.isMobile) return; @@ -508,9 +514,11 @@ class ChatListController extends State .getInitialMedia() .then(_processIncomingSharedMedia); - // For receiving shared Uris - _intentUriStreamSubscription = - AppLinks().uriLinkStream.listen(_processIncomingUris); + // #Pangea + // // For receiving shared Uris + // _intentUriStreamSubscription = + // AppLinks().uriLinkStream.listen(_processIncomingUris); + // Pangea# if (PlatformInfos.isAndroid) { final shortcuts = FlutterShortcuts(); @@ -686,12 +694,14 @@ class ChatListController extends State void dispose() { _intentDataStreamSubscription?.cancel(); _intentFileStreamSubscription?.cancel(); - _intentUriStreamSubscription?.cancel(); //#Pangea + // _intentUriStreamSubscription?.cancel(); _invitedSpaceSubscription?.cancel(); _roomCapacitySubscription?.cancel(); MatrixState.pangeaController.subscriptionController.subscriptionNotifier .removeListener(_onSubscribe); + MatrixState.pangeaController.spaceCodeController.codeNotifier + .removeListener(_onCacheSpaceCode); //Pangea# scrollController.removeListener(_onScroll); super.dispose(); @@ -1104,8 +1114,17 @@ class ChatListController extends State if (mounted) { MatrixState.pangeaController.spaceCodeController .joinCachedSpaceCode(context); + MatrixState.pangeaController.spaceCodeController.codeNotifier + .addListener(_onCacheSpaceCode); } } + + void _onCacheSpaceCode() { + if (!mounted) return; + MatrixState.pangeaController.spaceCodeController.joinCachedSpaceCode( + context, + ); + } // Pangea# void setActiveFilter(ActiveFilter filter) { diff --git a/lib/pangea/spaces/controllers/space_code_controller.dart b/lib/pangea/spaces/controllers/space_code_controller.dart index d0404a19f..9fe95ba0c 100644 --- a/lib/pangea/spaces/controllers/space_code_controller.dart +++ b/lib/pangea/spaces/controllers/space_code_controller.dart @@ -13,9 +13,11 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/common/constants/local.key.dart'; import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart'; +import 'package:fluffychat/pangea/spaces/constants/space_constants.dart'; import 'package:fluffychat/pangea/spaces/utils/knock_space_extension.dart'; import 'package:fluffychat/pangea/spaces/widgets/too_many_requests_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; import '../../common/controllers/base_controller.dart'; class NotFoundException implements Exception {} @@ -25,6 +27,7 @@ class SpaceCodeController extends BaseController { static final GetStorage _spaceStorage = GetStorage('class_storage'); Completer initCompleter = Completer(); + ValueNotifier codeNotifier = ValueNotifier(null); SpaceCodeController(PangeaController pangeaController) : super() { _pangeaController = pangeaController; @@ -39,6 +42,7 @@ class SpaceCodeController extends BaseController { PLocalKey.cachedSpaceCodeToJoin, code, ); + codeNotifier.value = code; } String? get justInputtedCode => @@ -176,4 +180,14 @@ class SpaceCodeController extends BaseController { await room.requestParticipants(); } } + + static Future onOpenAppViaUrl(Uri url) async { + if (url.fragment.isEmpty) return; + final fragment = Uri.parse(url.fragment); + final code = fragment.queryParameters[SpaceConstants.classCode]; + if (code != null && fragment.path.contains('join_with_link')) { + await MatrixState.pangeaController.spaceCodeController + .cacheSpaceCode(code); + } + } } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 6286843af..53df7ced8 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:app_links/app_links.dart'; import 'package:collection/collection.dart'; import 'package:desktop_notifications/desktop_notifications.dart'; import 'package:http/http.dart' as http; @@ -23,6 +24,7 @@ import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/common/utils/any_state_holder.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/learning_settings/utils/locale_provider.dart'; +import 'package:fluffychat/pangea/spaces/controllers/space_code_controller.dart'; import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -71,6 +73,7 @@ class MatrixState extends State with WidgetsBindingObserver { // #Pangea static late PangeaController pangeaController; static PangeaAnyState pAnyState = PangeaAnyState(); + late StreamSubscription? _uriListener; // Pangea# SharedPreferences get store => widget.store; @@ -275,6 +278,7 @@ class MatrixState extends State with WidgetsBindingObserver { _setAppLanguage(); _setLanguageListener(); }); + _uriListener = AppLinks().uriLinkStream.listen(_processIncomingUris); // Pangea# } @@ -562,6 +566,7 @@ class MatrixState extends State with WidgetsBindingObserver { linuxNotifications?.close(); // #Pangea _languageListener?.cancel(); + _uriListener?.cancel(); // Pangea# super.dispose(); @@ -602,6 +607,13 @@ class MatrixState extends State with WidgetsBindingObserver { final file = MatrixFile(bytes: exportBytes, name: exportFileName); file.save(context); } + + // #Pangea + Future _processIncomingUris(Uri? uri) async { + if (uri == null) return; + await SpaceCodeController.onOpenAppViaUrl(uri); + } + // Pangea# } class _AccountBundleWithClient {