diff --git a/android/README.md b/android/README.md index 7c3130fb0..a43182767 100644 --- a/android/README.md +++ b/android/README.md @@ -208,14 +208,6 @@ Helper method which should be called from the activity's `onResume` method. This is a static method. -#### onNewIntent(intent) - -Helper method for integrating the *deep linking* functionality. If your app's -activity is launched in "singleTask" mode this method should be called from the -activity's `onNewIntent` method. - -This is a static method. - #### JitsiMeetViewListener `JitsiMeetViewListener` provides an interface apps can implement to listen to diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivity.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivity.java index 453557e7a..e1de4db7f 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivity.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivity.java @@ -200,7 +200,12 @@ public class JitsiMeetActivity */ @Override public void onNewIntent(Intent intent) { - JitsiMeetView.onNewIntent(intent); + Uri uri; + + if (Intent.ACTION_VIEW.equals(intent.getAction()) + && (uri = intent.getData()) != null) { + view.loadURLString(uri.toString()); + } } /** diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetView.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetView.java index 5a80f9900..7169fecf4 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetView.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetView.java @@ -19,8 +19,6 @@ package org.jitsi.meet.sdk; import android.app.Activity; import android.app.Application; import android.content.Context; -import android.content.Intent; -import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -207,34 +205,6 @@ public class JitsiMeetView extends FrameLayout { } } - /** - * Activity lifecycle method which should be called from - * Activity.onNewIntent so we can do the required internal - * processing. Note that this is only needed if the activity's "launchMode" - * was set to "singleTask". This is required for deep linking to work once - * the application is already running. - * - * @param intent - Intent instance which was received. - */ - public static void onNewIntent(Intent intent) { - // XXX At least twice we received bug reports about malfunctioning - // loadURL in the Jitsi Meet SDK while the Jitsi Meet app seemed to - // functioning as expected in our testing. But that was to be expected - // because the app does not exercise loadURL. In order to increase the - // test coverage of loadURL, channel deep linking through loadURL. - Uri uri; - - if (Intent.ACTION_VIEW.equals(intent.getAction()) - && (uri = intent.getData()) != null - && loadURLStringInViews(uri.toString())) { - return; - } - - if (reactInstanceManager != null) { - reactInstanceManager.onNewIntent(intent); - } - } - /** * The unique identifier of this {@code JitsiMeetView} within the process * for the purposes of {@link ExternalAPI}. The name scope was inspired by diff --git a/ios/README.md b/ios/README.md index 8922d03ab..7073c5b40 100644 --- a/ios/README.md +++ b/ios/README.md @@ -91,34 +91,6 @@ Loads a specific URL which may identify a conference to join. If the specified URL is `nil` and the Welcome page is enabled, the Welcome page is displayed instead. -#### Universal / deep linking - -In order to support Universal / deep linking, `JitsiMeetView` offers 2 class -methods that you app's delegate should call in order for the app to follow those -links. - -```objc -- (BOOL)application:(UIApplication *)application -continueUserActivity:(NSUserActivity *)userActivity - restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler -{ - return [JitsiMeetView application:application - continueUserActivity:userActivity - restorationHandler:restorationHandler]; -} - -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation -{ - return [JitsiMeetView application:application - openURL:url - sourceApplication:sourceApplication - annotation:annotation]; -} -``` - ### JitsiMeetViewDelegate This delegate is optional, and can be set on the `JitsiMeetView` instance using diff --git a/ios/app/src/AppDelegate.m b/ios/app/src/AppDelegate.m index 3073dc84a..7bb6af8fe 100644 --- a/ios/app/src/AppDelegate.m +++ b/ios/app/src/AppDelegate.m @@ -28,22 +28,29 @@ #pragma mark Linking delegate methods -- (BOOL)application:(UIApplication *)application - continueUserActivity:(NSUserActivity *)userActivity - restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { - return [JitsiMeetView application:application - continueUserActivity:userActivity - restorationHandler:restorationHandler]; +- (BOOL)application:(UIApplication *)application + continueUserActivity:(NSUserActivity *)userActivity + restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { + + if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { + JitsiMeetView *view + = (JitsiMeetView *) self.window.rootViewController.view; + [view loadURL:userActivity.webpageURL]; + + return YES; + } + + return NO; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation { - return [JitsiMeetView application:application - openURL:url - sourceApplication:sourceApplication - annotation:annotation]; + options:(NSDictionary *)options { + + JitsiMeetView *view = (JitsiMeetView *) self.window.rootViewController.view; + [view loadURL:url]; + + return YES; } @end diff --git a/ios/sdk/src/JitsiMeetView.h b/ios/sdk/src/JitsiMeetView.h index f328d8f44..885dcca08 100644 --- a/ios/sdk/src/JitsiMeetView.h +++ b/ios/sdk/src/JitsiMeetView.h @@ -28,15 +28,6 @@ + (BOOL)application:(UIApplication *_Nonnull)application didFinishLaunchingWithOptions:(NSDictionary *_Nonnull)launchOptions; -+ (BOOL)application:(UIApplication * _Nonnull)application - continueUserActivity:(NSUserActivity * _Nonnull)userActivity - restorationHandler:(void (^ _Nullable)(NSArray * _Nullable))restorationHandler; - -+ (BOOL)application:(UIApplication * _Nonnull)application - openURL:(NSURL * _Nonnull)URL - sourceApplication:(NSString * _Nullable)sourceApplication - annotation:(id _Nullable)annotation; - - (void)loadURL:(NSURL * _Nullable)url; - (void)loadURLObject:(NSDictionary * _Nullable)urlObject; diff --git a/ios/sdk/src/JitsiMeetView.m b/ios/sdk/src/JitsiMeetView.m index 0e0985da8..eaed6c373 100644 --- a/ios/sdk/src/JitsiMeetView.m +++ b/ios/sdk/src/JitsiMeetView.m @@ -18,7 +18,6 @@ #include #import -#import #import #import "JitsiMeetView+Private.h" @@ -133,48 +132,6 @@ static NSMapTable *views; return YES; } -#pragma mark Linking delegate helpers -// https://facebook.github.io/react-native/docs/linking.html - -+ (BOOL)application:(UIApplication *)application - continueUserActivity:(NSUserActivity *)userActivity - restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler -{ - // XXX At least twice we received bug reports about malfunctioning loadURL - // in the Jitsi Meet SDK while the Jitsi Meet app seemed to functioning as - // expected in our testing. But that was to be expected because the app does - // not exercise loadURL. In order to increase the test coverage of loadURL, - // channel Universal linking through loadURL. - if ([userActivity.activityType - isEqualToString:NSUserActivityTypeBrowsingWeb] - && [JitsiMeetView loadURLInViews:userActivity.webpageURL]) { - return YES; - } - - return [RCTLinkingManager application:application - continueUserActivity:userActivity - restorationHandler:restorationHandler]; -} - -+ (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation { - // XXX At least twice we received bug reports about malfunctioning loadURL - // in the Jitsi Meet SDK while the Jitsi Meet app seemed to functioning as - // expected in our testing. But that was to be expected because the app does - // not exercise loadURL. In order to increase the test coverage of loadURL, - // channel Universal linking through loadURL. - if ([JitsiMeetView loadURLInViews:url]) { - return YES; - } - - return [RCTLinkingManager application:application - openURL:url - sourceApplication:sourceApplication - annotation:annotation]; -} - #pragma mark Initializers - (instancetype)init { @@ -281,32 +238,6 @@ static NSMapTable *views; #pragma mark Private methods -/** - * Loads a specific {@link NSURL} in all existing {@code JitsiMeetView}s. - * - * @param url - The {@code NSURL} to load in all existing - * {@code JitsiMeetView}s. - * @return {@code YES} if the specified {@code url} was submitted for loading in - * at least one {@code JitsiMeetView}; otherwise, {@code NO}. - */ -+ (BOOL)loadURLInViews:(NSURL *)url { - BOOL handled = NO; - - if (views) { - for (NSString *externalAPIScope in views) { - JitsiMeetView *view - = [JitsiMeetView viewForExternalAPIScope:externalAPIScope]; - - if (view) { - [view loadURL:url]; - handled = YES; - } - } - } - - return handled; -} - + (instancetype)viewForExternalAPIScope:(NSString *)externalAPIScope { return [views objectForKey:externalAPIScope]; } diff --git a/react/features/app/components/App.native.js b/react/features/app/components/App.native.js index e29720df6..2388687ed 100644 --- a/react/features/app/components/App.native.js +++ b/react/features/app/components/App.native.js @@ -1,7 +1,6 @@ /* global __DEV__ */ import React from 'react'; -import { Linking } from 'react-native'; import '../../analytics'; import '../../authentication'; @@ -47,9 +46,6 @@ export class App extends AbstractApp { constructor(props) { super(props); - // Bind event handlers so they are only bound once for every instance. - this._onLinkingURL = this._onLinkingURL.bind(this); - // In the Release configuration, React Native will (intentionally) throw // an unhandled JavascriptException for an unhandled JavaScript error. // This will effectively kill the application. In accord with the Web, @@ -57,34 +53,6 @@ export class App extends AbstractApp { this._maybeDisableExceptionsManager(); } - /** - * Subscribe to notifications about activating URLs registered to be handled - * by this app. - * - * @inheritdoc - * @returns {void} - * @see https://facebook.github.io/react-native/docs/linking.html - */ - componentWillMount() { - super.componentWillMount(); - - Linking.addEventListener('url', this._onLinkingURL); - } - - /** - * Unsubscribe from notifications about activating URLs registered to be - * handled by this app. - * - * @inheritdoc - * @returns {void} - * @see https://facebook.github.io/react-native/docs/linking.html - */ - componentWillUnmount() { - Linking.removeEventListener('url', this._onLinkingURL); - - super.componentWillUnmount(); - } - /** * Attempts to disable the use of React Native * {@link ExceptionsManager#handleException} on platforms and in @@ -122,20 +90,6 @@ export class App extends AbstractApp { global.ErrorUtils.setGlobalHandler(newHandler); } } - - /** - * Notified by React's Linking API that a specific URL registered to be - * handled by this App was activated. - * - * @param {Object} event - The details of the notification/event. - * @param {string} event.url - The URL registered to be handled by this App - * which was activated. - * @private - * @returns {void} - */ - _onLinkingURL({ url }) { - this._openURL(url); - } } /**