From 5f7a515610caaa1ef11ff7aca94579f41be37887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Fri, 18 Jan 2019 11:56:18 +0100 Subject: [PATCH] rn: drop {AddPeople,Invite}Controller We are going to implement the invite dialog *inside* the SDK, so there is no need to have all this machinery anymore. --- .../java/org/jitsi/meet/MainActivity.java | 117 -------- .../org/jitsi/meet/sdk/JitsiMeetView.java | 37 --- .../meet/sdk/ReactInstanceManagerHolder.java | 1 - .../meet/sdk/invite/AddPeopleController.java | 211 -------------- .../invite/AddPeopleControllerListener.java | 56 ---- .../meet/sdk/invite/InviteController.java | 265 ------------------ .../sdk/invite/InviteControllerListener.java | 29 -- .../jitsi/meet/sdk/invite/InviteModule.java | 171 ----------- ios/app/src/ViewController.h | 6 +- ios/app/src/ViewController.m | 103 ------- ios/sdk/sdk.xcodeproj/project.pbxproj | 42 --- ios/sdk/src/JitsiMeet.h | 6 - ios/sdk/src/JitsiMeetView.h | 3 - ios/sdk/src/JitsiMeetView.m | 9 - .../src/invite/AddPeopleController+Private.h | 33 --- ios/sdk/src/invite/AddPeopleController.h | 31 -- ios/sdk/src/invite/AddPeopleController.m | 82 ------ .../src/invite/AddPeopleControllerDelegate.h | 41 --- ios/sdk/src/invite/Invite+Private.h | 30 -- ios/sdk/src/invite/Invite.m | 127 --------- ios/sdk/src/invite/InviteController+Private.h | 53 ---- ios/sdk/src/invite/InviteController.h | 32 --- ios/sdk/src/invite/InviteController.m | 160 ----------- ios/sdk/src/invite/InviteControllerDelegate.h | 29 -- react/features/app/components/App.native.js | 10 - react/features/invite/actionTypes.js | 13 - .../invite/components/InviteButton.native.js | 39 +-- react/features/invite/functions.js | 30 +- react/features/invite/middleware.native.js | 232 --------------- react/features/invite/reducer.js | 7 +- 30 files changed, 9 insertions(+), 1996 deletions(-) delete mode 100644 android/sdk/src/main/java/org/jitsi/meet/sdk/invite/AddPeopleController.java delete mode 100644 android/sdk/src/main/java/org/jitsi/meet/sdk/invite/AddPeopleControllerListener.java delete mode 100644 android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteController.java delete mode 100644 android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteControllerListener.java delete mode 100644 android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteModule.java delete mode 100644 ios/sdk/src/invite/AddPeopleController+Private.h delete mode 100644 ios/sdk/src/invite/AddPeopleController.h delete mode 100644 ios/sdk/src/invite/AddPeopleController.m delete mode 100644 ios/sdk/src/invite/AddPeopleControllerDelegate.h delete mode 100644 ios/sdk/src/invite/Invite+Private.h delete mode 100644 ios/sdk/src/invite/Invite.m delete mode 100644 ios/sdk/src/invite/InviteController+Private.h delete mode 100644 ios/sdk/src/invite/InviteController.h delete mode 100644 ios/sdk/src/invite/InviteController.m delete mode 100644 ios/sdk/src/invite/InviteControllerDelegate.h diff --git a/android/app/src/main/java/org/jitsi/meet/MainActivity.java b/android/app/src/main/java/org/jitsi/meet/MainActivity.java index 09464fad2..4b0c34018 100644 --- a/android/app/src/main/java/org/jitsi/meet/MainActivity.java +++ b/android/app/src/main/java/org/jitsi/meet/MainActivity.java @@ -24,10 +24,6 @@ import android.util.Log; import org.jitsi.meet.sdk.JitsiMeetActivity; import org.jitsi.meet.sdk.JitsiMeetView; import org.jitsi.meet.sdk.JitsiMeetViewListener; -import org.jitsi.meet.sdk.invite.AddPeopleController; -import org.jitsi.meet.sdk.invite.AddPeopleControllerListener; -import org.jitsi.meet.sdk.invite.InviteController; -import org.jitsi.meet.sdk.invite.InviteControllerListener; import com.crashlytics.android.Crashlytics; import com.facebook.react.bridge.UiThreadUtil; @@ -36,8 +32,6 @@ import io.fabric.sdk.android.Fabric; import java.net.MalformedURLException; import java.net.URL; -import java.util.ArrayList; -import java.util.List; import java.util.Map; /** @@ -53,13 +47,6 @@ import java.util.Map; * {@code react-native run-android}. */ public class MainActivity extends JitsiMeetActivity { - /** - * The query to perform through {@link AddPeopleController} when the - * {@code InviteButton} is tapped in order to exercise the public API of the - * feature invite. If {@code null}, the {@code InviteButton} will not be - * rendered. - */ - private static final String ADD_PEOPLE_CONTROLLER_QUERY = null; @Override protected JitsiMeetView initializeView() { @@ -113,72 +100,11 @@ public class MainActivity extends JitsiMeetActivity { } }); - // inviteController - final InviteController inviteController - = view.getInviteController(); - - inviteController.setListener(new InviteControllerListener() { - public void beginAddPeople( - AddPeopleController addPeopleController) { - onInviteControllerBeginAddPeople( - inviteController, - addPeopleController); - } - }); - inviteController.setAddPeopleEnabled( - ADD_PEOPLE_CONTROLLER_QUERY != null); - inviteController.setDialOutEnabled( - inviteController.isAddPeopleEnabled()); } return view; } - private void onAddPeopleControllerInviteSettled( - AddPeopleController addPeopleController, - List> failedInvitees) { - UiThreadUtil.assertOnUiThread(); - - // XXX Explicitly invoke endAddPeople on addPeopleController; otherwise, - // it is going to be memory-leaked in the associated InviteController - // and no subsequent InviteButton clicks/taps will be delivered. - // Technically, endAddPeople will automatically be invoked if there are - // no failedInviteees i.e. the invite succeeeded for all specified - // invitees. - addPeopleController.endAddPeople(); - } - - private void onAddPeopleControllerReceivedResults( - AddPeopleController addPeopleController, - List> results, - String query) { - UiThreadUtil.assertOnUiThread(); - - int size = results.size(); - - if (size > 0) { - // Exercise AddPeopleController's inviteById implementation. - List ids = new ArrayList<>(size); - - for (Map result : results) { - Object id = result.get("id"); - - if (id != null) { - ids.add(id.toString()); - } - } - - addPeopleController.inviteById(ids); - - return; - } - - // XXX Explicitly invoke endAddPeople on addPeopleController; otherwise, - // it is going to be memory-leaked in the associated InviteController - // and no subsequent InviteButton clicks/taps will be delivered. - addPeopleController.endAddPeople(); - } - @Override protected void onCreate(Bundle savedInstanceState) { // As this is the Jitsi Meet app (i.e. not the Jitsi Meet SDK), we do @@ -213,47 +139,4 @@ public class MainActivity extends JitsiMeetActivity { } } - private void onInviteControllerBeginAddPeople( - InviteController inviteController, - AddPeopleController addPeopleController) { - UiThreadUtil.assertOnUiThread(); - - // Log with the tag "ReactNative" in order to have the log visible in - // react-native log-android as well. - Log.d( - "ReactNative", - InviteControllerListener.class.getSimpleName() + ".beginAddPeople"); - - String query = ADD_PEOPLE_CONTROLLER_QUERY; - - if (query != null - && (inviteController.isAddPeopleEnabled() - || inviteController.isDialOutEnabled())) { - addPeopleController.setListener(new AddPeopleControllerListener() { - public void onInviteSettled( - AddPeopleController addPeopleController, - List> failedInvitees) { - onAddPeopleControllerInviteSettled( - addPeopleController, - failedInvitees); - } - - public void onReceivedResults( - AddPeopleController addPeopleController, - List> results, - String query) { - onAddPeopleControllerReceivedResults( - addPeopleController, - results, query); - } - }); - addPeopleController.performQuery(query); - } else { - // XXX Explicitly invoke endAddPeople on addPeopleController; - // otherwise, it is going to be memory-leaked in the associated - // InviteController and no subsequent InviteButton clicks/taps will - // be delivered. - addPeopleController.endAddPeople(); - } - } } 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 e96cfa349..82222d85f 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 @@ -24,8 +24,6 @@ import android.util.Log; import com.facebook.react.bridge.ReadableMap; -import org.jitsi.meet.sdk.invite.InviteController; - import java.lang.reflect.Method; import java.net.URL; import java.util.Map; @@ -78,12 +76,6 @@ public class JitsiMeetView */ private URL defaultURL; - /** - * The entry point into the invite feature of Jitsi Meet. The Java - * counterpart of the JavaScript {@code InviteButton}. - */ - private final InviteController inviteController; - /** * Whether Picture-in-Picture is enabled. If {@code null}, defaults to * {@code true} iff the Android platform supports Picture-in-Picture @@ -106,10 +98,6 @@ public class JitsiMeetView public JitsiMeetView(@NonNull Context context) { super(context); - // The entry point into the invite feature of Jitsi Meet. The Java - // counterpart of the JavaScript InviteButton. - inviteController = new InviteController(externalAPIScope); - // Check if the parent Activity implements JitsiMeetActivityInterface, // otherwise things may go wrong. if (!(context instanceof JitsiMeetActivityInterface)) { @@ -155,19 +143,6 @@ public class JitsiMeetView return defaultURL; } - /** - * Gets the {@link InviteController} which represents the entry point into - * the invite feature of Jitsi Meet and is the Java counterpart of the - * JavaScript {@code InviteButton}. - * - * @return the {@link InviteController} which represents the entry point - * into the invite feature of Jitsi Meet and is the Java counterpart of the - * JavaScript {@code InviteButton} - */ - public InviteController getInviteController() { - return inviteController; - } - /** * Gets the URL of the current conference. * @@ -238,18 +213,6 @@ public class JitsiMeetView props.putString("defaultURL", defaultURL.toString()); } - // inviteController - InviteController inviteController = getInviteController(); - - if (inviteController != null) { - props.putBoolean( - "addPeopleEnabled", - inviteController.isAddPeopleEnabled()); - props.putBoolean( - "dialOutEnabled", - inviteController.isDialOutEnabled()); - } - // pictureInPictureEnabled props.putBoolean( "pictureInPictureEnabled", diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/ReactInstanceManagerHolder.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/ReactInstanceManagerHolder.java index 6b81641ac..9167932ca 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/ReactInstanceManagerHolder.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/ReactInstanceManagerHolder.java @@ -54,7 +54,6 @@ class ReactInstanceManagerHolder { new ProximityModule(reactContext), new WiFiStatsModule(reactContext), new org.jitsi.meet.sdk.dropbox.Dropbox(reactContext), - new org.jitsi.meet.sdk.invite.InviteModule(reactContext), new org.jitsi.meet.sdk.net.NAT64AddrInfoModule(reactContext))); if (android.os.Build.VERSION.SDK_INT diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/AddPeopleController.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/AddPeopleController.java deleted file mode 100644 index ba70a4c0d..000000000 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/AddPeopleController.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright @ 2017-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jitsi.meet.sdk.invite; - -import android.util.Log; - -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReadableArray; -import com.facebook.react.bridge.ReadableMap; -import com.facebook.react.bridge.WritableArray; -import com.facebook.react.bridge.WritableNativeArray; -import com.facebook.react.bridge.WritableNativeMap; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -/** - * Controller object used by native code to query and submit user selections for - * the user invitation flow. - */ -public class AddPeopleController { - - /** - * The AddPeopleControllerListener for this controller, used to pass query - * results back to the native code that initiated the query. - */ - private AddPeopleControllerListener listener; - - /** - * Local cache of search query results. Used to re-hydrate the list of - * selected items based on their ids passed to inviteById in order to pass - * the full item maps back to the JitsiMeetView during submission. - */ - private final Map items = new HashMap<>(); - - private final WeakReference owner; - - private final WeakReference reactContext; - - /** - * Randomly generated UUID, used for identification in the InviteModule. - */ - private final String uuid = UUID.randomUUID().toString(); - - public AddPeopleController( - InviteController owner, - ReactApplicationContext reactContext) { - this.owner = new WeakReference<>(owner); - this.reactContext = new WeakReference<>(reactContext); - } - - /** - * Cancel the invitation flow and free memory allocated to the - * AddPeopleController. After calling this method, this object is invalid - - * a new AddPeopleController will be passed to the caller through - * beginAddPeople. - */ - public void endAddPeople() { - InviteController owner = this.owner.get(); - - if (owner != null) { - owner.endAddPeople(this); - } - } - - /** - * - * @return the AddPeopleControllerListener for this controller, used to pass - * query results back to the native code that initiated the query. - */ - public AddPeopleControllerListener getListener() { - return listener; - } - - final ReactApplicationContext getReactApplicationContext() { - return reactContext.get(); - } - - /** - * - * @return the unique identifier for this AddPeopleController - */ - public String getUuid() { - return uuid; - } - - /** - * Send invites to selected users based on their item ids - * - * @param ids - */ - public void inviteById(List ids) { - InviteController owner = this.owner.get(); - - if (owner != null) { - WritableArray invitees = new WritableNativeArray(); - - for(int i = 0, size = ids.size(); i < size; i++) { - String id = ids.get(i); - - if(items.containsKey(id)) { - WritableNativeMap map = new WritableNativeMap(); - map.merge(items.get(id)); - invitees.pushMap(map); - } else { - // If the id doesn't exist in the map, we can't do anything, - // so just skip it. - } - } - - owner.invite(this, invitees); - } - } - - void inviteSettled(ReadableArray failedInvitees) { - AddPeopleControllerListener listener = getListener(); - - if (listener != null) { - ArrayList> jFailedInvitees = new ArrayList<>(); - - for (int i = 0, size = failedInvitees.size(); i < size; ++i) { - jFailedInvitees.add(failedInvitees.getMap(i).toHashMap()); - } - - listener.onInviteSettled(this, jFailedInvitees); - } - } - - /** - * Start a search for entities to invite with the given query. Results will - * be returned through the associated AddPeopleControllerListener's - * onReceivedResults method. - * - * @param query - */ - public void performQuery(String query) { - InviteController owner = this.owner.get(); - - if (owner != null) { - owner.performQuery(this, query); - } - } - - /** - * Caches results received by the search into a local map for use later when - * the items are submitted. Submission requires the full map of - * information, but only the IDs are returned back to the delegate. Using - * this map means we don't have to send the whole map back to the delegate. - * - * @param results - * @param query - */ - void receivedResultsForQuery(ReadableArray results, String query) { - AddPeopleControllerListener listener = getListener(); - - if (listener != null) { - List> jvmResults = new ArrayList<>(); - - // cache results for use in submission later - // convert to jvm array - for(int i = 0; i < results.size(); i++) { - ReadableMap map = results.getMap(i); - - if(map.hasKey("id")) { - items.put(map.getString("id"), map); - } else if(map.hasKey("type") - && map.getString("type").equals("phone") - && map.hasKey("number")) { - items.put(map.getString("number"), map); - } else { - Log.w( - "AddPeopleController", - "Received result without id and that was not a phone number, so not adding it to suggestions: " - + map); - } - - jvmResults.add(map.toHashMap()); - } - - listener.onReceivedResults(this, jvmResults, query); - } - } - - /** - * Sets the AddPeopleControllerListener for this controller, used to pass - * query results back to the native code that initiated the query. - * - * @param listener - */ - public void setListener(AddPeopleControllerListener listener) { - this.listener = listener; - } -} diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/AddPeopleControllerListener.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/AddPeopleControllerListener.java deleted file mode 100644 index 02a5928d4..000000000 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/AddPeopleControllerListener.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright @ 2017-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jitsi.meet.sdk.invite; - -import java.util.List; -import java.util.Map; - -public interface AddPeopleControllerListener { - /** - * Called when the call to {@link AddPeopleController#inviteById(List)} - * completes. - * - * @param addPeopleController the active {@link AddPeopleController} for - * this invite flow. This object should be cleaned up by calling - * {@link AddPeopleController#endAddPeople()} if the user exits the invite - * flow. Otherwise, it can stay active if the user will attempt to invite - * @param failedInvitees a {@code List} of {@code Map} - * dictionaries that represent the invitations that failed. The data type of - * the objects is identical to the results returned in onReceivedResuls. - */ - void onInviteSettled( - AddPeopleController addPeopleController, - List> failedInvitees); - - /** - * Called when results are received for a query called through - * AddPeopleController.query(). - * - * @param addPeopleController - * @param results a List of Map objects that represent items - * returned by the query. The object at key "type" describes the type of - * item: "user", "videosipgw" (conference room), or "phone". "user" types - * have properties at "id", "name", and "avatar". "videosipgw" types have - * properties at "id" and "name". "phone" types have properties at "number", - * "title", "and "subtitle" - * @param query the query that generated the given results - */ - void onReceivedResults( - AddPeopleController addPeopleController, - List> results, - String query); -} diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteController.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteController.java deleted file mode 100644 index 78b0ce632..000000000 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteController.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright @ 2017-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jitsi.meet.sdk.invite; - -import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContext; -import com.facebook.react.bridge.ReadableArray; -import com.facebook.react.bridge.WritableArray; -import com.facebook.react.bridge.WritableNativeMap; - -import org.jitsi.meet.sdk.ReactContextUtils; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.Callable; -import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; - -/** - * Represents the entry point into the invite feature of Jitsi Meet and is the - * Java counterpart of the JavaScript {@code InviteButton}. - */ -public class InviteController { - private AddPeopleController addPeopleController; - - /** - * Whether adding/inviting people by name (as opposed to phone number) is - * enabled. - */ - private Boolean addPeopleEnabled; - - /** - * Whether adding/inviting people by phone number (as opposed to name) is - * enabled. - */ - private Boolean dialOutEnabled; - - private final String externalAPIScope; - - private InviteControllerListener listener; - - public InviteController(String externalAPIScope) { - this.externalAPIScope = externalAPIScope; - } - - void beginAddPeople(ReactApplicationContext reactContext) { - InviteControllerListener listener = getListener(); - - if (listener != null) { - // XXX For the sake of simplicity and in order to reduce the risk of - // memory leaks, allow a single AddPeopleController at a time. - AddPeopleController addPeopleController = this.addPeopleController; - - if (addPeopleController != null) { - return; - } - - // Initialize a new AddPeopleController to represent the click/tap - // on the InviteButton and notify the InviteControllerListener - // about the event. - addPeopleController = new AddPeopleController(this, reactContext); - - boolean success = false; - - this.addPeopleController = addPeopleController; - try { - listener.beginAddPeople(addPeopleController); - success = true; - } finally { - if (!success) { - endAddPeople(addPeopleController); - } - } - } - } - - void endAddPeople(AddPeopleController addPeopleController) { - if (this.addPeopleController == addPeopleController) { - this.addPeopleController = null; - } - } - - public InviteControllerListener getListener() { - return listener; - } - - /** - * Sends JavaScript event to submit invitations to the given item ids - * - * @param invitees a WritableArray of WritableNativeMaps representing - * selected items. Each map representing a selected item should match the - * data passed back in the return from a query. - */ - boolean invite( - AddPeopleController addPeopleController, - WritableArray invitees) { - return - invite( - addPeopleController.getUuid(), - addPeopleController.getReactApplicationContext(), - invitees); - } - - public Future>> invite( - final List> invitees) { - final boolean inviteBegan - = invite( - UUID.randomUUID().toString(), - /* reactContext */ null, - Arguments.makeNativeArray(invitees)); - FutureTask futureTask - = new FutureTask(new Callable() { - @Override - public List> call() { - if (inviteBegan) { - // TODO Complete the returned Future when the invite - // settles. - return Collections.emptyList(); - } else { - // The invite failed to even begin so report that all - // invitees failed. - return invitees; - } - } - }); - - // If the invite failed to even begin, complete the returned Future - // already and the Future implementation will report that all invitees - // failed. - if (!inviteBegan) { - futureTask.run(); - } - - return futureTask; - } - - private boolean invite( - String addPeopleControllerScope, - ReactContext reactContext, - WritableArray invitees) { - WritableNativeMap data = new WritableNativeMap(); - - data.putString("addPeopleControllerScope", addPeopleControllerScope); - data.putString("externalAPIScope", externalAPIScope); - data.putArray("invitees", invitees); - - return - ReactContextUtils.emitEvent( - reactContext, - "org.jitsi.meet:features/invite#invite", - data); - } - - void inviteSettled( - String addPeopleControllerScope, - ReadableArray failedInvitees) { - AddPeopleController addPeopleController = this.addPeopleController; - - if (addPeopleController != null - && addPeopleController.getUuid().equals( - addPeopleControllerScope)) { - try { - addPeopleController.inviteSettled(failedInvitees); - } finally { - if (failedInvitees.size() == 0) { - endAddPeople(addPeopleController); - } - } - } - } - - public boolean isAddPeopleEnabled() { - Boolean b = this.addPeopleEnabled; - - return - (b == null || b.booleanValue()) ? (getListener() != null) : false; - } - - public boolean isDialOutEnabled() { - Boolean b = this.dialOutEnabled; - - return - (b == null || b.booleanValue()) ? (getListener() != null) : false; - } - - /** - * Starts a query for users to invite to the conference. Results will be - * returned through - * {@link AddPeopleControllerListener#onReceivedResults(AddPeopleController, List, String)}. - * - * @param query {@code String} to use for the query - */ - void performQuery(AddPeopleController addPeopleController, String query) { - WritableNativeMap params = new WritableNativeMap(); - - params.putString("addPeopleControllerScope", addPeopleController.getUuid()); - params.putString("externalAPIScope", externalAPIScope); - params.putString("query", query); - ReactContextUtils.emitEvent( - addPeopleController.getReactApplicationContext(), - "org.jitsi.meet:features/invite#performQuery", - params); - } - - void receivedResultsForQuery( - String addPeopleControllerScope, - String query, - ReadableArray results) { - AddPeopleController addPeopleController = this.addPeopleController; - - if (addPeopleController != null - && addPeopleController.getUuid().equals( - addPeopleControllerScope)) { - addPeopleController.receivedResultsForQuery(results, query); - } - } - - /** - * Sets whether the ability to add users to the call is enabled. If this is - * enabled, an add user button will appear on the {@link JitsiMeetView}. If - * enabled, and the user taps the add user button, - * {@link InviteControllerListener#beginAddPeople(AddPeopleController)} - * will be called. - * - * @param addPeopleEnabled {@code true} to enable the add people button; - * otherwise, {@code false} - */ - public void setAddPeopleEnabled(boolean addPeopleEnabled) { - this.addPeopleEnabled = Boolean.valueOf(addPeopleEnabled); - } - - /** - * Sets whether the ability to add phone numbers to the call is enabled. - * Must be enabled along with {@link #setAddPeopleEnabled(boolean)} to be - * effective. - * - * @param dialOutEnabled {@code true} to enable the ability to add phone - * numbers to the call; otherwise, {@code false} - */ - public void setDialOutEnabled(boolean dialOutEnabled) { - this.dialOutEnabled = Boolean.valueOf(dialOutEnabled); - } - - public void setListener(InviteControllerListener listener) { - this.listener = listener; - } -} diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteControllerListener.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteControllerListener.java deleted file mode 100644 index a1643082d..000000000 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteControllerListener.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright @ 2017-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jitsi.meet.sdk.invite; - -public interface InviteControllerListener { - /** - * Called when the add user button is tapped. - * - * @param addPeopleController {@code AddPeopleController} scoped for this - * user invite flow. The {@code AddPeopleController} is used to start user - * queries and accepts an {@code AddPeopleControllerListener} for receiving - * user query responses. - */ - void beginAddPeople(AddPeopleController addPeopleController); -} diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteModule.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteModule.java deleted file mode 100644 index 95e15c0a5..000000000 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/invite/InviteModule.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright @ 2017-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jitsi.meet.sdk.invite; - -import android.util.Log; - -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; -import com.facebook.react.bridge.ReadableArray; -import com.facebook.react.bridge.UiThreadUtil; - -import org.jitsi.meet.sdk.BaseReactView; -import org.jitsi.meet.sdk.JitsiMeetView; - -/** - * Implements the react-native module of the feature invite. - */ -public class InviteModule - extends ReactContextBaseJavaModule { - - public InviteModule(ReactApplicationContext reactContext) { - super(reactContext); - } - - /** - * Signals that a click/tap has been performed on {@code InviteButton} and - * that the execution flow for adding/inviting people to the current - * conference/meeting is to begin - * - * @param externalAPIScope the unique identifier of the - * {@code JitsiMeetView} whose {@code InviteButton} was clicked/tapped. - */ - @ReactMethod - public void beginAddPeople(final String externalAPIScope) { - // Make sure InviteControllerListener (like all other listeners of the - // SDK) is invoked on the UI thread. It was requested by SDK consumers. - if (!UiThreadUtil.isOnUiThread()) { - UiThreadUtil.runOnUiThread(new Runnable() { - @Override - public void run() { - beginAddPeople(externalAPIScope); - } - }); - return; - } - - InviteController inviteController - = findInviteControllerByExternalAPIScope(externalAPIScope); - - if (inviteController != null) { - inviteController.beginAddPeople(getReactApplicationContext()); - } - } - - private InviteController findInviteControllerByExternalAPIScope( - String externalAPIScope) { - JitsiMeetView view - = (JitsiMeetView) - BaseReactView.findViewByExternalAPIScope(externalAPIScope); - - return view == null ? null : view.getInviteController(); - } - - @Override - public String getName() { - return "Invite"; - } - - /** - * Callback for invitation failures - * - * @param failedInvitees the items for which the invitation failed - * @param addPeopleControllerScope a string that represents a connection to - * a specific AddPeopleController - */ - @ReactMethod - public void inviteSettled( - final String externalAPIScope, - final String addPeopleControllerScope, - final ReadableArray failedInvitees) { - // Make sure AddPeopleControllerListener (like all other listeners of - // the SDK) is invoked on the UI thread. It was requested by SDK - // consumers. - if (!UiThreadUtil.isOnUiThread()) { - UiThreadUtil.runOnUiThread(new Runnable() { - @Override - public void run() { - inviteSettled( - externalAPIScope, - addPeopleControllerScope, - failedInvitees); - } - }); - return; - } - - InviteController inviteController - = findInviteControllerByExternalAPIScope(externalAPIScope); - - if (inviteController == null) { - Log.w( - "InviteModule", - "Invite settled, but failed to find active controller to notify"); - } else { - inviteController.inviteSettled( - addPeopleControllerScope, - failedInvitees); - } - } - - /** - * Callback for results received from the JavaScript invite search call - * - * @param results the results in a ReadableArray of ReadableMap objects - * @param query the query associated with the search - * @param addPeopleControllerScope a string that represents a connection to - * a specific AddPeopleController - */ - @ReactMethod - public void receivedResults( - final String externalAPIScope, - final String addPeopleControllerScope, - final String query, - final ReadableArray results) { - // Make sure AddPeopleControllerListener (like all other listeners of - // the SDK) is invoked on the UI thread. It was requested by SDK - // consumers. - if (!UiThreadUtil.isOnUiThread()) { - UiThreadUtil.runOnUiThread(new Runnable() { - @Override - public void run() { - receivedResults( - externalAPIScope, - addPeopleControllerScope, - query, - results); - } - }); - return; - } - - InviteController inviteController - = findInviteControllerByExternalAPIScope(externalAPIScope); - - if (inviteController == null) { - Log.w( - "InviteModule", - "Received results, but failed to find active controller to send results back"); - } else { - inviteController.receivedResultsForQuery( - addPeopleControllerScope, - query, - results); - } - } -} diff --git a/ios/app/src/ViewController.h b/ios/app/src/ViewController.h index c0e66f613..048427e56 100644 --- a/ios/app/src/ViewController.h +++ b/ios/app/src/ViewController.h @@ -18,10 +18,6 @@ #import -@interface ViewController - : UIViewController< - JitsiMeetViewDelegate, - JMAddPeopleControllerDelegate, - JMInviteControllerDelegate> +@interface ViewController : UIViewController @end diff --git a/ios/app/src/ViewController.m b/ios/app/src/ViewController.m index 205e7e3bf..eb5463f70 100644 --- a/ios/app/src/ViewController.m +++ b/ios/app/src/ViewController.m @@ -24,15 +24,8 @@ // Needed for NSUserActivity suggestedInvocationPhrase @import Intents; -/** - * The query to perform through JMAddPeopleController when the InviteButton is - * tapped in order to exercise the public API of the feature invite. If nil, the - * InviteButton will not be rendered. - */ -static NSString * const ADD_PEOPLE_CONTROLLER_QUERY = nil; @interface ViewController () - @end @implementation ViewController @@ -43,17 +36,6 @@ static NSString * const ADD_PEOPLE_CONTROLLER_QUERY = nil; JitsiMeetView *view = (JitsiMeetView *) self.view; view.delegate = self; -#ifdef DEBUG - - // inviteController - JMInviteController *inviteController = view.inviteController; - inviteController.delegate = self; - inviteController.addPeopleEnabled - = inviteController.dialOutEnabled - = ADD_PEOPLE_CONTROLLER_QUERY != nil; - -#endif // #ifdef DEBUG - // As this is the Jitsi Meet app (i.e. not the Jitsi Meet SDK), we do want // the Welcome page to be enabled. It defaults to disabled in the SDK at the // time of this writing but it is clearer to be explicit about what we want @@ -135,89 +117,4 @@ static NSString * const ADD_PEOPLE_CONTROLLER_QUERY = nil; [self _onJitsiMeetViewDelegateEvent:@"LOAD_CONFIG_ERROR" withData:data]; } -#if DEBUG - -// JMInviteControllerDelegate - -- (void)beginAddPeople:(JMAddPeopleController *)addPeopleController { - NSLog( - @"[%s:%d] JMInviteControllerDelegate %s", - __FILE__, __LINE__, __FUNCTION__); - - NSAssert( - [NSThread isMainThread], - @"JMInviteControllerDelegate beginAddPeople: invoked on a non-main thread"); - - NSString *query = ADD_PEOPLE_CONTROLLER_QUERY; - JitsiMeetView *view = (JitsiMeetView *) self.view; - JMInviteController *inviteController = view.inviteController; - - if (query - && (inviteController.addPeopleEnabled - || inviteController.dialOutEnabled)) { - addPeopleController.delegate = self; - [addPeopleController performQuery:query]; - } else { - // XXX Explicitly invoke endAddPeople on addPeopleController; otherwise, - // it is going to be memory-leaked in the associated JMInviteController - // and no subsequent InviteButton clicks/taps will be delivered. - [addPeopleController endAddPeople]; - } -} - -// JMAddPeopleControllerDelegate - -- (void)addPeopleController:(JMAddPeopleController * _Nonnull)controller - didReceiveResults:(NSArray * _Nonnull)results - forQuery:(NSString * _Nonnull)query { - NSAssert( - [NSThread isMainThread], - @"JMAddPeopleControllerDelegate addPeopleController:didReceiveResults:forQuery: invoked on a non-main thread"); - - NSUInteger count = results.count; - - if (count) { - // Exercise JMAddPeopleController's inviteById: implementation. - NSMutableArray *ids = [NSMutableArray arrayWithCapacity:count]; - - for (NSUInteger i = 0; i < count; ++i) { - ids[i] = results[i][@"id"]; - } - - [controller inviteById:ids]; - - // Exercise JMInviteController's invite:withCompletion: implementation. - // - // XXX Technically, only at most one of the two exercises will result in - // an actual invitation eventually. - JitsiMeetView *view = (JitsiMeetView *) self.view; - JMInviteController *inviteController = view.inviteController; - - [inviteController invite:results withCompletion:nil]; - - return; - } - - // XXX Explicitly invoke endAddPeople on addPeopleController; otherwise, it - // is going to be memory-leaked in the associated JMInviteController and no - // subsequent InviteButton clicks/taps will be delivered. - [controller endAddPeople]; -} - -- (void) inviteSettled:(NSArray * _Nonnull)failedInvitees - fromSearchController:(JMAddPeopleController * _Nonnull)addPeopleController { - NSAssert( - [NSThread isMainThread], - @"JMAddPeopleControllerDelegate inviteSettled:fromSearchController: invoked on a non-main thread"); - - // XXX Explicitly invoke endAddPeople on addPeopleController; otherwise, it - // is going to be memory-leaked in the associated JMInviteController and no - // subsequent InviteButton clicks/taps will be delivered. Technically, - // endAddPeople will automatically be invoked if there are no - // failedInviteees i.e. the invite succeeeded for all specified invitees. - [addPeopleController endAddPeople]; -} - -#endif // #ifdef DEBUG - @end diff --git a/ios/sdk/sdk.xcodeproj/project.pbxproj b/ios/sdk/sdk.xcodeproj/project.pbxproj index 19c00f237..6a7f2aaf8 100644 --- a/ios/sdk/sdk.xcodeproj/project.pbxproj +++ b/ios/sdk/sdk.xcodeproj/project.pbxproj @@ -35,13 +35,6 @@ 87FE6F3321E52437004A5DC7 /* incomingMessage.wav in Resources */ = {isa = PBXBuildFile; fileRef = 87FE6F3221E52437004A5DC7 /* incomingMessage.wav */; }; A4414AE020B37F1A003546E6 /* rejected.wav in Resources */ = {isa = PBXBuildFile; fileRef = A4414ADF20B37F1A003546E6 /* rejected.wav */; }; A4A934E9212F3ADB001E9388 /* Dropbox.m in Sources */ = {isa = PBXBuildFile; fileRef = A4A934E8212F3ADB001E9388 /* Dropbox.m */; }; - B386B85720981A75000DEF7A /* InviteController.m in Sources */ = {isa = PBXBuildFile; fileRef = B386B85020981A74000DEF7A /* InviteController.m */; }; - B386B85820981A75000DEF7A /* AddPeopleController.m in Sources */ = {isa = PBXBuildFile; fileRef = B386B85120981A74000DEF7A /* AddPeopleController.m */; }; - B386B85920981A75000DEF7A /* AddPeopleControllerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = B386B85220981A74000DEF7A /* AddPeopleControllerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B386B85A20981A75000DEF7A /* AddPeopleController.h in Headers */ = {isa = PBXBuildFile; fileRef = B386B85320981A74000DEF7A /* AddPeopleController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B386B85B20981A75000DEF7A /* InviteControllerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = B386B85420981A74000DEF7A /* InviteControllerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B386B85C20981A75000DEF7A /* InviteController.h in Headers */ = {isa = PBXBuildFile; fileRef = B386B85520981A75000DEF7A /* InviteController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B386B85D20981A75000DEF7A /* Invite.m in Sources */ = {isa = PBXBuildFile; fileRef = B386B85620981A75000DEF7A /* Invite.m */; }; C6245F5D2053091D0040BE68 /* image-resize@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6245F5B2053091D0040BE68 /* image-resize@2x.png */; }; C6245F5E2053091D0040BE68 /* image-resize@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6245F5C2053091D0040BE68 /* image-resize@3x.png */; }; C69EFA0C209A0F660027712B /* JMCallKitEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69EFA09209A0F650027712B /* JMCallKitEmitter.swift */; }; @@ -61,9 +54,6 @@ 0B44A0181F902126009D1D64 /* MPVolumeViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPVolumeViewManager.m; sourceTree = ""; }; 0B49424320AD8DBD00BD2DE0 /* outgoingStart.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = outgoingStart.wav; path = ../../sounds/outgoingStart.wav; sourceTree = ""; }; 0B49424420AD8DBD00BD2DE0 /* outgoingRinging.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = outgoingRinging.wav; path = ../../sounds/outgoingRinging.wav; sourceTree = ""; }; - 0B6F414F20987DE600FF6789 /* Invite+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Invite+Private.h"; sourceTree = ""; }; - 0B6F41502098840600FF6789 /* InviteController+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "InviteController+Private.h"; sourceTree = ""; }; - 0B6F4151209884E500FF6789 /* AddPeopleController+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AddPeopleController+Private.h"; sourceTree = ""; }; 0B7C2CFC200F51D60060D076 /* LaunchOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LaunchOptions.m; sourceTree = ""; }; 0B93EF7A1EC608550030D24D /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 0B93EF7C1EC9DDCD0030D24D /* RCTBridgeWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTBridgeWrapper.h; sourceTree = ""; }; @@ -92,13 +82,6 @@ A4414ADF20B37F1A003546E6 /* rejected.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = rejected.wav; path = ../../sounds/rejected.wav; sourceTree = ""; }; A4A934E8212F3ADB001E9388 /* Dropbox.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Dropbox.m; sourceTree = ""; }; A4A934EB21349A06001E9388 /* Dropbox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Dropbox.h; sourceTree = ""; }; - B386B85020981A74000DEF7A /* InviteController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InviteController.m; sourceTree = ""; }; - B386B85120981A74000DEF7A /* AddPeopleController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddPeopleController.m; sourceTree = ""; }; - B386B85220981A74000DEF7A /* AddPeopleControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddPeopleControllerDelegate.h; sourceTree = ""; }; - B386B85320981A74000DEF7A /* AddPeopleController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddPeopleController.h; sourceTree = ""; }; - B386B85420981A74000DEF7A /* InviteControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InviteControllerDelegate.h; sourceTree = ""; }; - B386B85520981A75000DEF7A /* InviteController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InviteController.h; sourceTree = ""; }; - B386B85620981A75000DEF7A /* Invite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Invite.m; sourceTree = ""; }; C6245F5B2053091D0040BE68 /* image-resize@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "image-resize@2x.png"; path = "src/picture-in-picture/image-resize@2x.png"; sourceTree = ""; }; C6245F5C2053091D0040BE68 /* image-resize@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "image-resize@3x.png"; path = "src/picture-in-picture/image-resize@3x.png"; sourceTree = ""; }; C69EFA09209A0F650027712B /* JMCallKitEmitter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JMCallKitEmitter.swift; sourceTree = ""; }; @@ -171,7 +154,6 @@ A4A934E7212F3AB8001E9388 /* dropbox */, 0BA13D301EE83FF8007BEF7F /* ExternalAPI.m */, 0BD906E91EC0C00300C8C18E /* Info.plist */, - B386B84F20981A11000DEF7A /* invite */, 0BD906E81EC0C00300C8C18E /* JitsiMeet.h */, 0B412F161EDEC65D00B1A0A6 /* JitsiMeetView.h */, 0B412F171EDEC65D00B1A0A6 /* JitsiMeetView.m */, @@ -210,23 +192,6 @@ path = dropbox; sourceTree = ""; }; - B386B84F20981A11000DEF7A /* invite */ = { - isa = PBXGroup; - children = ( - B386B85320981A74000DEF7A /* AddPeopleController.h */, - B386B85120981A74000DEF7A /* AddPeopleController.m */, - 0B6F4151209884E500FF6789 /* AddPeopleController+Private.h */, - B386B85220981A74000DEF7A /* AddPeopleControllerDelegate.h */, - B386B85620981A75000DEF7A /* Invite.m */, - 0B6F414F20987DE600FF6789 /* Invite+Private.h */, - B386B85520981A75000DEF7A /* InviteController.h */, - B386B85020981A74000DEF7A /* InviteController.m */, - 0B6F41502098840600FF6789 /* InviteController+Private.h */, - B386B85420981A74000DEF7A /* InviteControllerDelegate.h */, - ); - path = invite; - sourceTree = ""; - }; C5E72ADFC30ED96F9B35F076 /* Pods */ = { isa = PBXGroup; children = ( @@ -263,14 +228,10 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - B386B85C20981A75000DEF7A /* InviteController.h in Headers */, - B386B85B20981A75000DEF7A /* InviteControllerDelegate.h in Headers */, C6F99C15204DB63E0001F710 /* JitsiMeetView+Private.h in Headers */, 0B412F181EDEC65D00B1A0A6 /* JitsiMeetView.h in Headers */, - B386B85920981A75000DEF7A /* AddPeopleControllerDelegate.h in Headers */, 0B93EF7E1EC9DDCD0030D24D /* RCTBridgeWrapper.h in Headers */, 0B412F221EDEF6EA00B1A0A6 /* JitsiMeetViewDelegate.h in Headers */, - B386B85A20981A75000DEF7A /* AddPeopleController.h in Headers */, 0BD906EA1EC0C00300C8C18E /* JitsiMeet.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -466,12 +427,9 @@ 0B93EF7F1EC9DDCD0030D24D /* RCTBridgeWrapper.m in Sources */, 0BA13D311EE83FF8007BEF7F /* ExternalAPI.m in Sources */, 0BCA49601EC4B6C600B793EE /* POSIX.m in Sources */, - B386B85D20981A75000DEF7A /* Invite.m in Sources */, 0B7C2CFD200F51D60060D076 /* LaunchOptions.m in Sources */, C6CC49AF207412CF000DFA42 /* PiPViewCoordinator.swift in Sources */, - B386B85720981A75000DEF7A /* InviteController.m in Sources */, DEFC743F21B178FA00E4DD96 /* LocaleDetector.m in Sources */, - B386B85820981A75000DEF7A /* AddPeopleController.m in Sources */, 0BCA495F1EC4B6C600B793EE /* AudioMode.m in Sources */, 0B44A0191F902126009D1D64 /* MPVolumeViewManager.m in Sources */, 0BCA49611EC4B6C600B793EE /* Proximity.m in Sources */, diff --git a/ios/sdk/src/JitsiMeet.h b/ios/sdk/src/JitsiMeet.h index 7223fb4bc..cad0a6bdf 100644 --- a/ios/sdk/src/JitsiMeet.h +++ b/ios/sdk/src/JitsiMeet.h @@ -17,9 +17,3 @@ // JitsiMeetView #import #import - -// invite/ -#import -#import -#import -#import diff --git a/ios/sdk/src/JitsiMeetView.h b/ios/sdk/src/JitsiMeetView.h index f0a0d69ad..dbb217f00 100644 --- a/ios/sdk/src/JitsiMeetView.h +++ b/ios/sdk/src/JitsiMeetView.h @@ -17,7 +17,6 @@ #import #import -#import "InviteController.h" #import "JitsiMeetViewDelegate.h" @interface JitsiMeetView : UIView @@ -28,8 +27,6 @@ @property (nonatomic, nullable, weak) id delegate; -@property (nonatomic, readonly, nonnull) JMInviteController *inviteController; - @property (nonatomic) BOOL pictureInPictureEnabled; @property (nonatomic) BOOL welcomePageEnabled; diff --git a/ios/sdk/src/JitsiMeetView.m b/ios/sdk/src/JitsiMeetView.m index d575224dc..9f4ed9e67 100644 --- a/ios/sdk/src/JitsiMeetView.m +++ b/ios/sdk/src/JitsiMeetView.m @@ -25,8 +25,6 @@ #import #import "Dropbox.h" -#import "Invite+Private.h" -#import "InviteController+Private.h" #import "JitsiMeetView+Private.h" #import "RCTBridgeWrapper.h" @@ -237,9 +235,6 @@ static NSMapTable *views; props[@"pictureInPictureEnabled"] = @(self.pictureInPictureEnabled); props[@"welcomePageEnabled"] = @(self.welcomePageEnabled); - props[@"addPeopleEnabled"] = @(_inviteController.addPeopleEnabled); - props[@"dialOutEnabled"] = @(_inviteController.dialOutEnabled); - // XXX If urlObject is nil, then it must appear as undefined in the // JavaScript source code so that we check the launchOptions there. if (urlObject) { @@ -420,10 +415,6 @@ static NSMapTable *views; externalAPIScope = [NSUUID UUID].UUIDString; [views setObject:self forKey:externalAPIScope]; - _inviteController - = [[JMInviteController alloc] initWithExternalAPIScope:externalAPIScope - bridgeWrapper:bridgeWrapper]; - // Set a background color which is in accord with the JavaScript and Android // parts of the application and causes less perceived visual flicker than // the default background color. diff --git a/ios/sdk/src/invite/AddPeopleController+Private.h b/ios/sdk/src/invite/AddPeopleController+Private.h deleted file mode 100644 index 6f068c8a3..000000000 --- a/ios/sdk/src/invite/AddPeopleController+Private.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright @ 2018-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "AddPeopleController.h" -#import "InviteController.h" - -@interface JMAddPeopleController () - -@property (nonatomic, strong) NSMutableDictionary* _Nonnull items; -@property (nonatomic, weak, nullable) JMInviteController *owner; -@property (nonatomic, readonly) NSString* _Nonnull uuid; - -- (instancetype _Nonnull)initWithOwner:(JMInviteController * _Nonnull)owner; - -- (void)inviteSettled:(NSArray * _Nonnull)failedInvitees; - -- (void)receivedResults:(NSArray * _Nonnull)results - forQuery:(NSString * _Nonnull)query; - -@end diff --git a/ios/sdk/src/invite/AddPeopleController.h b/ios/sdk/src/invite/AddPeopleController.h deleted file mode 100644 index 098587da2..000000000 --- a/ios/sdk/src/invite/AddPeopleController.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright @ 2018-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import "AddPeopleControllerDelegate.h" - -@interface JMAddPeopleController: NSObject - -@property (nonatomic, nullable, weak) id delegate; - -- (void)endAddPeople; - -- (void)inviteById:(NSArray * _Nonnull)ids; - -- (void)performQuery:(NSString * _Nonnull)query; - -@end diff --git a/ios/sdk/src/invite/AddPeopleController.m b/ios/sdk/src/invite/AddPeopleController.m deleted file mode 100644 index 7c806bfe8..000000000 --- a/ios/sdk/src/invite/AddPeopleController.m +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright @ 2018-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "AddPeopleController+Private.h" -#import "InviteController+Private.h" - -@implementation JMAddPeopleController - -- (instancetype)initWithOwner:(JMInviteController *)owner { - self = [super init]; - if (self) { - _uuid = [[NSUUID UUID] UUIDString]; - _items = [[NSMutableDictionary alloc] init]; - _owner = owner; - } - return self; -} - -#pragma mark API - -- (void)endAddPeople { - [self.owner endAddPeopleForController:self]; -} - -- (void)inviteById:(NSArray * _Nonnull)ids { - NSMutableArray* invitees = [[NSMutableArray alloc] init]; - - for (NSString* itemId in ids) { - id invitee = [self.items objectForKey:itemId]; - - if (invitee) { - [invitees addObject:invitee]; - } - } - - [self.owner invite:invitees forController:self]; -} - -- (void)performQuery:(NSString *)query { - [self.owner performQuery:query forController:self]; -} - -#pragma mark Internal API, used to call the delegate and report to the user - -- (void)receivedResults:(NSArray *)results - forQuery:(NSString *)query { - for (NSDictionary* item in results) { - NSString* itemId = item[@"id"]; - NSString* itemType = item[@"type"]; - if (itemId) { - [self.items setObject:item forKey:itemId]; - } else if (itemType != nil && [itemType isEqualToString: @"phone"]) { - NSString* number = item[@"number"]; - if (number) { - [self.items setObject:item forKey:number]; - } - } - } - - [self.delegate addPeopleController:self - didReceiveResults:results - forQuery:query]; -} - -- (void)inviteSettled:(NSArray *)failedInvitees { - [self.delegate inviteSettled:failedInvitees fromSearchController:self]; -} - -@end diff --git a/ios/sdk/src/invite/AddPeopleControllerDelegate.h b/ios/sdk/src/invite/AddPeopleControllerDelegate.h deleted file mode 100644 index 58715f5fd..000000000 --- a/ios/sdk/src/invite/AddPeopleControllerDelegate.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright @ 2018-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import "AddPeopleController.h" - -@class JMAddPeopleController; - -@protocol JMAddPeopleControllerDelegate - -/** - * Called when a JMAddPeopleController has results for a query that was - * previously provided. - */ -- (void)addPeopleController:(JMAddPeopleController * _Nonnull)controller - didReceiveResults:(NSArray * _Nonnull)results - forQuery:(NSString * _Nonnull)query; - -/** - * Called when a JMAddPeopleController has finished the inviting process, either - * succesfully or not. In case of failure the failedInvitees array will contain - * the items for which invitations failed. - */ -- (void) inviteSettled:(NSArray * _Nonnull)failedInvitees - fromSearchController:(JMAddPeopleController * _Nonnull)addPeopleController; - -@end diff --git a/ios/sdk/src/invite/Invite+Private.h b/ios/sdk/src/invite/Invite+Private.h deleted file mode 100644 index aa982e743..000000000 --- a/ios/sdk/src/invite/Invite+Private.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright @ 2018-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import -#import - -@interface Invite : RCTEventEmitter - -- (void) invite:(NSArray * _Nonnull)invitees - externalAPIScope:(NSString * _Nonnull)externalAPIScope - addPeopleControllerScope:(NSString * _Nonnull)addPeopleControllerScope; - -- (void) performQuery:(NSString * _Nonnull)query - externalAPIScope:(NSString * _Nonnull)externalAPIScope - addPeopleControllerScope:(NSString * _Nonnull)addPeopleControllerScope; - -@end diff --git a/ios/sdk/src/invite/Invite.m b/ios/sdk/src/invite/Invite.m deleted file mode 100644 index cba2a64e3..000000000 --- a/ios/sdk/src/invite/Invite.m +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright @ 2018-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "Invite+Private.h" -#import "InviteController+Private.h" -#import "JitsiMeetView+Private.h" - -// The events emitted/supported by the Invite react-native module: -// -// XXX The event names are ridiculous on purpose. Even though iOS makes it look -// like it emits within the bounderies of a react-native module ony, it actually -// also emits through DeviceEventEmitter. (Of course, Android emits only through -// DeviceEventEmitter.) -static NSString * const InviteEmitterEvent - = @"org.jitsi.meet:features/invite#invite"; -static NSString * const PerformQueryEmitterEvent - = @"org.jitsi.meet:features/invite#performQuery"; - -@implementation Invite - -RCT_EXPORT_MODULE(); - -/** - * Make sure all methods in this module are invoked on the main/UI thread. - */ -- (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); -} - -- (NSArray *)supportedEvents { - return @[ - InviteEmitterEvent, - PerformQueryEmitterEvent - ]; -} - -/** - * Initiates the process to add people. This involves calling a delegate method - * in the JMInviteControllerDelegate so the native host application can start - * the query process. - * - * @param externalAPIScope - Scope identifying the JitsiMeetView where the - * calling JS code is being executed. - */ -RCT_EXPORT_METHOD(beginAddPeople:(NSString *)externalAPIScope) { - JitsiMeetView *view - = [JitsiMeetView viewForExternalAPIScope:externalAPIScope]; - JMInviteController *inviteController = view.inviteController; - [inviteController beginAddPeople]; -} - -/** - * Indicates the the invite process has settled / finished. - * - * @param externalAPIScope - Scope identifying the JitsiMeetView where the - * calling JS code is being executed. - * @param addPeopleControllerScope - Scope identifying the JMAddPeopleController - * wich was settled. - * @param failedInvitees - Array with the invitees which were not invited due - * to a failure. - */ -RCT_EXPORT_METHOD(inviteSettled:(NSString *)externalAPIScope - addPeopleControllerScope:(NSString *)addPeopleControllerScope - failedInvitees:(NSArray *)failedInvitees) { - JitsiMeetView *view - = [JitsiMeetView viewForExternalAPIScope:externalAPIScope]; - JMInviteController *inviteController = view.inviteController; - [inviteController inviteSettled:addPeopleControllerScope - failedInvitees:failedInvitees]; -} - -/** - * Process results received for the given query. This involves calling a - * delegate method in JMAddPeopleControllerDelegate so the native host - * application is made aware of the query results. - * - * @param externalAPIScope - Scope identifying the JitsiMeetView where the - * calling JS code is being executed. - * @param addPeopleControllerScope - Scope identifying the JMAddPeopleController - * for which the results were received. - * @param query - The actual query for which the results were received. - * @param results - The query results. - */ -RCT_EXPORT_METHOD(receivedResults:(NSString *)externalAPIScope - addPeopleControllerScope:(NSString *)addPeopleControllerScope - query:(NSString *)query - results:(NSArray *)results) { - JitsiMeetView *view - = [JitsiMeetView viewForExternalAPIScope:externalAPIScope]; - JMInviteController *inviteController = view.inviteController; - [inviteController receivedResults:addPeopleControllerScope - query:query - results:results]; -} - -- (void) invite:(NSArray * _Nonnull)invitees - externalAPIScope:(NSString * _Nonnull)externalAPIScope - addPeopleControllerScope:(NSString * _Nonnull) addPeopleControllerScope { - [self sendEventWithName:InviteEmitterEvent - body:@{ @"addPeopleControllerScope": addPeopleControllerScope, - @"externalAPIScope": externalAPIScope, - @"invitees": invitees }]; -} - -- (void) performQuery:(NSString * _Nonnull)query - externalAPIScope:(NSString * _Nonnull)externalAPIScope - addPeopleControllerScope:(NSString * _Nonnull) addPeopleControllerScope { - [self sendEventWithName:PerformQueryEmitterEvent - body:@{ @"addPeopleControllerScope": addPeopleControllerScope, - @"externalAPIScope": externalAPIScope, - @"query": query }]; -} - -@end diff --git a/ios/sdk/src/invite/InviteController+Private.h b/ios/sdk/src/invite/InviteController+Private.h deleted file mode 100644 index 8a8b9eac1..000000000 --- a/ios/sdk/src/invite/InviteController+Private.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright @ 2018-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "InviteController.h" - -#import "AddPeopleController.h" -#import "Invite+Private.h" -#import "RCTBridgeWrapper.h" - -@interface JMInviteController () - -@property (nonatomic, nullable) JMAddPeopleController *addPeopleController; - -@property (nonatomic) NSString * _Nonnull externalAPIScope; - -@property (nonatomic, nullable, weak) RCTBridgeWrapper *bridgeWrapper; - -@property (nonatomic, readonly) Invite * _Nullable inviteModule; - -- (instancetype _Nonnull)initWithExternalAPIScope:(NSString * _Nonnull)externalAPIScope - bridgeWrapper:(RCTBridgeWrapper * _Nullable)bridgeWrapper; - -- (void)beginAddPeople; - -- (void)endAddPeopleForController:(JMAddPeopleController * _Nonnull)controller; - -- (void) invite:(NSArray * _Nonnull)invitees - forController:(JMAddPeopleController * _Nonnull)controller; - -- (void)inviteSettled:(NSString * _Nonnull)addPeopleControllerScope - failedInvitees:(NSArray * _Nonnull)failedInvitees; - -- (void)performQuery:(NSString * _Nonnull)query - forController:(JMAddPeopleController * _Nonnull)controller; - -- (void)receivedResults:(NSString * _Nonnull)addPeopleControllerScope - query:(NSString * _Nonnull)query - results:(NSArray * _Nonnull)results; - -@end diff --git a/ios/sdk/src/invite/InviteController.h b/ios/sdk/src/invite/InviteController.h deleted file mode 100644 index bebccc265..000000000 --- a/ios/sdk/src/invite/InviteController.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright @ 2017-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import "InviteControllerDelegate.h" - -@interface JMInviteController : NSObject - -@property (nonatomic) BOOL addPeopleEnabled; - -@property (nonatomic) BOOL dialOutEnabled; - -@property (nonatomic, nullable, weak) id delegate; - -- (void) invite:(NSArray * _Nonnull)invitees - withCompletion:(void (^ _Nullable)(NSArray * _Nonnull failedInvitees))completion; - -@end diff --git a/ios/sdk/src/invite/InviteController.m b/ios/sdk/src/invite/InviteController.m deleted file mode 100644 index 5a4923af2..000000000 --- a/ios/sdk/src/invite/InviteController.m +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright @ 2017-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "InviteController+Private.h" -#import "AddPeopleController+Private.h" - -@implementation JMInviteController { - NSNumber *_addPeopleEnabled; - NSNumber *_dialOutEnabled; -} - -@dynamic addPeopleEnabled; -@dynamic dialOutEnabled; - -#pragma mark Constructor - --(instancetype)initWithExternalAPIScope:(NSString * _Nonnull)externalAPIScope - bridgeWrapper:(RCTBridgeWrapper * _Nullable)bridgeWrapper { - self = [super init]; - if (self) { - self.externalAPIScope = externalAPIScope; - self.bridgeWrapper = bridgeWrapper; - } - - return self; -} - -#pragma mark Public API - --(Invite * _Nullable)inviteModule { - return [self.bridgeWrapper.bridge moduleForName:@"Invite"]; -} - --(void)beginAddPeople { - if (_delegate == nil) { - return; - } - - if (_addPeopleController != nil) { - return; - } - - _addPeopleController = [[JMAddPeopleController alloc] initWithOwner:self]; - - @try { - if (self.delegate - && [self.delegate respondsToSelector:@selector(beginAddPeople:)]) { - [self.delegate beginAddPeople:_addPeopleController]; - } - } @catch (NSException *e) { - [self endAddPeopleForController:_addPeopleController]; - } -} - --(void)endAddPeopleForController:(JMAddPeopleController *)controller { - if (self.addPeopleController == controller) { - self.addPeopleController = nil; - } -} - -#pragma mark Property getters / setters - -- (void) setAddPeopleEnabled:(BOOL)addPeopleEnabled { - _addPeopleEnabled = [NSNumber numberWithBool:addPeopleEnabled]; -} - -- (BOOL) addPeopleEnabled { - if (_addPeopleEnabled == nil || [_addPeopleEnabled boolValue]) { - return self.delegate - && [self.delegate respondsToSelector:@selector(beginAddPeople:)]; - } - - return NO; -} - -- (void) setDialOutEnabled:(BOOL)dialOutEnabled { - _dialOutEnabled = [NSNumber numberWithBool:dialOutEnabled]; -} - -- (BOOL) dialOutEnabled { - if (_dialOutEnabled == nil || [_dialOutEnabled boolValue]) { - return self.delegate - && [self.delegate respondsToSelector:@selector(beginAddPeople:)]; - } - - return NO; -} - -#pragma mark Result handling - -- (void)inviteSettled:(NSString *)addPeopleControllerScope - failedInvitees:(NSArray *)failedInvitees { - JMAddPeopleController *controller = self.addPeopleController; - - if (controller != nil - && [controller.uuid isEqualToString:addPeopleControllerScope]) { - @try { - [controller inviteSettled:failedInvitees]; - } @finally { - if ([failedInvitees count] == 0) { - [self endAddPeopleForController:controller]; - } - } - } -} - -- (void)receivedResults:(NSString *)addPeopleControllerScope - query:(NSString *)query - results:(NSArray *)results { - JMAddPeopleController *controller = self.addPeopleController; - - if (controller != nil - && [controller.uuid isEqualToString:addPeopleControllerScope]) { - [controller receivedResults:results forQuery:query]; - } -} - -#pragma mark Use the Invite react-native module to emit the search / submission events - -- (void) invite:(NSArray *)invitees - forController:(JMAddPeopleController * _Nonnull)controller { - [self invite:invitees - forControllerScope:controller.uuid]; -} - -- (void) invite:(NSArray *)invitees - forControllerScope:(NSString * _Nonnull)controllerScope { - [self.inviteModule invite:invitees - externalAPIScope:self.externalAPIScope - addPeopleControllerScope:controllerScope]; -} - -- (void) invite:(NSArray *)invitees - withCompletion:(void (^)(NSArray *failedInvitees))completion { - // TODO Execute the specified completion block when the invite settles. - [self invite:invitees - forControllerScope:[[NSUUID UUID] UUIDString]]; -} - -- (void)performQuery:(NSString * _Nonnull)query - forController:(JMAddPeopleController * _Nonnull)controller { - [self.inviteModule performQuery:query - externalAPIScope:self.externalAPIScope - addPeopleControllerScope:controller.uuid]; -} - -@end diff --git a/ios/sdk/src/invite/InviteControllerDelegate.h b/ios/sdk/src/invite/InviteControllerDelegate.h deleted file mode 100644 index 5a5ca9efd..000000000 --- a/ios/sdk/src/invite/InviteControllerDelegate.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright @ 2017-present Atlassian Pty Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "AddPeopleController.h" - -@protocol JMInviteControllerDelegate - -/** - * Called when the invite button in the conference is tapped. - * - * The search controller provided can be used to query user search within the - * conference. - */ -- (void)beginAddPeople:(JMAddPeopleController *)addPeopleController; - -@end diff --git a/react/features/app/components/App.native.js b/react/features/app/components/App.native.js index 1354627b6..094adec7a 100644 --- a/react/features/app/components/App.native.js +++ b/react/features/app/components/App.native.js @@ -35,16 +35,6 @@ const logger = require('jitsi-meet-logger').getLogger(__filename); */ type Props = AbstractAppProps & { - /** - * Whether the add people feature is enabled. - */ - addPeopleEnabled: boolean, - - /** - * Whether the dial-out feature is enabled. - */ - dialOutEnabled: boolean, - /** * Whether Picture-in-Picture is enabled. If {@code true}, a toolbar button * is rendered in the {@link Conference} view to afford entering diff --git a/react/features/invite/actionTypes.js b/react/features/invite/actionTypes.js index 549641920..955eeca10 100644 --- a/react/features/invite/actionTypes.js +++ b/react/features/invite/actionTypes.js @@ -1,16 +1,3 @@ -/** - * The type of redux action to set the {@code EventEmitter} subscriptions - * utilized by the feature invite. - * - * { - * type: _SET_EMITTER_SUBSCRIPTIONS, - * emitterSubscriptions: Array|undefined - * } - * - * @protected - */ -export const _SET_EMITTER_SUBSCRIPTIONS = Symbol('_SET_EMITTER_SUBSCRIPTIONS'); - /** * The type of redux action which will add pending invite request to the redux * store. diff --git a/react/features/invite/components/InviteButton.native.js b/react/features/invite/components/InviteButton.native.js index aacf20440..e23d34d80 100644 --- a/react/features/invite/components/InviteButton.native.js +++ b/react/features/invite/components/InviteButton.native.js @@ -38,16 +38,6 @@ type Props = AbstractButtonProps & { _onShareRoom: Function }; -/** - * The indicator which determines (at bundle time) whether there should be a - * button in {@code Toolbox} to expose the functionality of the feature - * share-room in the user interface of the app. - * - * @private - * @type {boolean} - */ -const _SHARE_ROOM_TOOLBAR_BUTTON = true; - /** * Implements an {@link AbstractButton} to enter add/invite people to the * current call/conference/meeting. @@ -64,35 +54,12 @@ class InviteButton extends AbstractButton { * @returns {void} */ _handleClick() { + // FIXME: dispatch _onAddPeople here, when we have a dialog for it. const { - _addPeopleEnabled, - _dialOutEnabled, - _onAddPeople, _onShareRoom } = this.props; - if (_addPeopleEnabled || _dialOutEnabled) { - _onAddPeople(); - } else if (_SHARE_ROOM_TOOLBAR_BUTTON) { - _onShareRoom(); - } - } - - /** - * Implements React's {@link Component#render()}. - * - * @inheritdoc - * @returns {React$Node} - */ - render() { - const { _addPeopleEnabled, _dialOutEnabled } = this.props; - - return ( - _SHARE_ROOM_TOOLBAR_BUTTON - || _addPeopleEnabled - || _dialOutEnabled - ? super.render() - : null); + _onShareRoom(); } } @@ -110,7 +77,7 @@ class InviteButton extends AbstractButton { function _mapDispatchToProps(dispatch: Dispatch<*>) { return { /** - * Launches native invite dialog. + * Launches the add people dialog. * * @private * @returns {void} diff --git a/react/features/invite/functions.js b/react/features/invite/functions.js index cf268badb..6f112b506 100644 --- a/react/features/invite/functions.js +++ b/react/features/invite/functions.js @@ -1,6 +1,5 @@ // @flow -import { getAppProp } from '../base/app'; import { i18next } from '../base/i18n'; import { isLocalParticipantModerator } from '../base/participants'; import { doGetJSON, parseURIString } from '../base/util'; @@ -297,18 +296,7 @@ export function invitePeopleAndChatRooms( // eslint-disable-line max-params export function isAddPeopleEnabled(state: Object): boolean { const { isGuest } = state['features/base/jwt']; - if (!isGuest) { - // XXX The mobile/react-native app is capable of disabling the - // adding/inviting of people in the current conference. Anyway, the - // Web/React app does not have that capability so default appropriately. - const addPeopleEnabled = getAppProp(state, 'addPeopleEnabled'); - - return ( - (typeof addPeopleEnabled === 'undefined') - || Boolean(addPeopleEnabled)); - } - - return false; + return !isGuest; } /** @@ -319,21 +307,9 @@ export function isAddPeopleEnabled(state: Object): boolean { */ export function isDialOutEnabled(state: Object): boolean { const { conference } = state['features/base/conference']; - let dialOutEnabled = isLocalParticipantModerator(state) - && conference - && conference.isSIPCallingSupported(); - if (dialOutEnabled) { - // XXX The mobile/react-native app is capable of disabling of dial-out. - // Anyway, the Web/React app does not have that capability so default - // appropriately. - dialOutEnabled = getAppProp(state, 'dialOutEnabled'); - - return ( - (typeof dialOutEnabled === 'undefined') || Boolean(dialOutEnabled)); - } - - return false; + return isLocalParticipantModerator(state) + && conference && conference.isSIPCallingSupported(); } /** diff --git a/react/features/invite/middleware.native.js b/react/features/invite/middleware.native.js index fc720e9bd..e69de29bb 100644 --- a/react/features/invite/middleware.native.js +++ b/react/features/invite/middleware.native.js @@ -1,232 +0,0 @@ -// @flow - -import i18next from 'i18next'; -import { NativeEventEmitter, NativeModules } from 'react-native'; - -import { APP_WILL_MOUNT, APP_WILL_UNMOUNT, getAppProp } from '../base/app'; -import { MiddlewareRegistry } from '../base/redux'; - -import { invite } from './actions'; -import { - BEGIN_ADD_PEOPLE, - _SET_EMITTER_SUBSCRIPTIONS -} from './actionTypes'; -import { - getInviteResultsForQuery, - isAddPeopleEnabled, - isDialOutEnabled -} from './functions'; -import './middleware.any'; - -/** - * The react-native module of the feature invite. - */ -const { Invite } = NativeModules; - -/** - * The middleware of the feature invite specific to mobile/react-native. - * - * @param {Store} store - The redux store. - * @returns {Function} - */ -Invite && MiddlewareRegistry.register(store => next => action => { - switch (action.type) { - case _SET_EMITTER_SUBSCRIPTIONS: - return _setEmitterSubscriptions(store, next, action); - - case APP_WILL_MOUNT: - return _appWillMount(store, next, action); - - case APP_WILL_UNMOUNT: { - const result = next(action); - - store.dispatch({ - type: _SET_EMITTER_SUBSCRIPTIONS, - emitterSubscriptions: undefined - }); - - return result; - } - - case BEGIN_ADD_PEOPLE: - return _beginAddPeople(store, next, action); - } - - return next(action); -}); - -/** - * Notifies the feature jwt that the action {@link APP_WILL_MOUNT} is being - * dispatched within a specific redux {@code store}. - * - * @param {Store} store - The redux store in which the specified {@code action} - * is being dispatched. - * @param {Dispatch} next - The redux dispatch function to dispatch the - * specified {@code action} to the specified {@code store}. - * @param {Action} action - The redux action {@code APP_WILL_MOUNT} which is - * being dispatched in the specified {@code store}. - * @private - * @returns {*} The value returned by {@code next(action)}. - */ -function _appWillMount({ dispatch, getState }, next, action) { - const result = next(action); - - const emitter = new NativeEventEmitter(Invite); - const context = { - dispatch, - getState - }; - - dispatch({ - type: _SET_EMITTER_SUBSCRIPTIONS, - emitterSubscriptions: [ - emitter.addListener( - 'org.jitsi.meet:features/invite#invite', - _onInvite, - context), - emitter.addListener( - 'org.jitsi.meet:features/invite#performQuery', - _onPerformQuery, - context) - ] - }); - - return result; -} - -/** - * Notifies the feature invite that the action {@link BEGIN_ADD_PEOPLE} is being - * dispatched within a specific redux {@code store}. - * - * @param {Store} store - The redux store in which the specified {@code action} - * is being dispatched. - * @param {Dispatch} next - The redux {@code dispatch} function to dispatch the - * specified {@code action} to the specified {@code store}. - * @param {Action} action - The redux action {@code BEGIN_ADD_PEOPLE} which is - * being dispatched in the specified {@code store}. - * @private - * @returns {*} The value returned by {@code next(action)}. - */ -function _beginAddPeople(store, next, action) { - const result = next(action); - - // The JavaScript App needs to provide uniquely identifying information to - // the native Invite module so that the latter may match the former to the - // native JitsiMeetView which hosts it. - const externalAPIScope = getAppProp(store, 'externalAPIScope'); - - externalAPIScope && Invite.beginAddPeople(externalAPIScope); - - return result; -} - -/** - * Handles the {@code invite} event of the feature invite and invites specific - * invitees to the current, ongoing conference. - * - * @param {Object} event - The details of the event. - * @returns {void} - */ -function _onInvite({ addPeopleControllerScope, externalAPIScope, invitees }) { - const { dispatch, getState } = this; // eslint-disable-line no-invalid-this - - // If there are multiple JitsiMeetView instances alive, they will all get - // the event, since there is a single bridge, so make sure we don't act if - // the event is not for us. - if (getAppProp(getState, 'externalAPIScope') !== externalAPIScope) { - return; - } - - dispatch(invite(invitees)) - .then(failedInvitees => - Invite.inviteSettled( - externalAPIScope, - addPeopleControllerScope, - failedInvitees)); -} - -/** - * Handles the {@code performQuery} event of the feature invite and queries for - * invitees who may subsequently be invited to the current, ongoing conference. - * - * @param {Object} event - The details of the event. - * @returns {void} - */ -function _onPerformQuery( - { addPeopleControllerScope, externalAPIScope, query }) { - const { getState } = this; // eslint-disable-line no-invalid-this - const state = getState(); - - // If there are multiple JitsiMeetView instances alive, they will all get - // the event, since there is a single bridge, so make sure we don't act if - // the event is not for us. - if (getAppProp(state, 'externalAPIScope') !== externalAPIScope) { - return; - } - - const { - dialOutAuthUrl, - peopleSearchQueryTypes, - peopleSearchUrl - } = state['features/base/config']; - const options = { - dialOutAuthUrl, - addPeopleEnabled: isAddPeopleEnabled(state), - dialOutEnabled: isDialOutEnabled(state), - jwt: state['features/base/jwt'].jwt, - peopleSearchQueryTypes, - peopleSearchUrl - }; - - getInviteResultsForQuery(query, options) - .catch(() => []) - .then(results => { - const translatedResults = results.map(result => { - if (result.type === 'phone') { - result.title = i18next.t('addPeople.telephone', { - number: result.number - }); - - if (result.showCountryCodeReminder) { - result.subtitle = i18next.t( - 'addPeople.countryReminder' - ); - } - } - - return result; - }).filter(result => result.type !== 'phone' || result.allowed); - - Invite.receivedResults( - externalAPIScope, - addPeopleControllerScope, - query, - translatedResults); - }); -} - -/** - * Notifies the feature invite that the action - * {@link _SET_EMITTER_SUBSCRIPTIONS} is being dispatched within a specific - * redux {@code store}. - * - * @param {Store} store - The redux store in which the specified {@code action} - * is being dispatched. - * @param {Dispatch} next - The redux dispatch function to dispatch the - * specified {@code action} to the specified {@code store}. - * @param {Action} action - The redux action {@code _SET_EMITTER_SUBSCRIPTIONS} - * which is being dispatched in the specified {@code store}. - * @private - * @returns {*} - */ -function _setEmitterSubscriptions({ getState }, next, action) { - const { emitterSubscriptions } = getState()['features/invite']; - - if (emitterSubscriptions) { - for (const subscription of emitterSubscriptions) { - subscription.remove(); - } - } - - return next(action); -} diff --git a/react/features/invite/reducer.js b/react/features/invite/reducer.js index 87ab24ad4..14f44b624 100644 --- a/react/features/invite/reducer.js +++ b/react/features/invite/reducer.js @@ -1,9 +1,8 @@ // @flow -import { assign, ReducerRegistry } from '../base/redux'; +import { ReducerRegistry } from '../base/redux'; import { - _SET_EMITTER_SUBSCRIPTIONS, ADD_PENDING_INVITE_REQUEST, REMOVE_PENDING_INVITE_REQUESTS, SET_CALLEE_INFO_VISIBLE, @@ -26,9 +25,6 @@ const DEFAULT_STATE = { ReducerRegistry.register('features/invite', (state = DEFAULT_STATE, action) => { switch (action.type) { - case _SET_EMITTER_SUBSCRIPTIONS: - return ( - assign(state, 'emitterSubscriptions', action.emitterSubscriptions)); case ADD_PENDING_INVITE_REQUEST: return { ...state, @@ -37,6 +33,7 @@ ReducerRegistry.register('features/invite', (state = DEFAULT_STATE, action) => { action.request ] }; + case REMOVE_PENDING_INVITE_REQUESTS: return { ...state,