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 {