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 73ad720ef..4013c4de9 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 @@ -27,6 +27,7 @@ import android.view.KeyEvent; import com.facebook.react.ReactInstanceManager; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; +import com.facebook.react.modules.core.PermissionListener; import java.net.URL; @@ -42,7 +43,7 @@ import java.net.URL; * {@code JitsiMeetView} static methods. */ public class JitsiMeetActivity - extends AppCompatActivity { + extends AppCompatActivity implements JitsiMeetActivityInterface { /** * The request code identifying requests for the permission to draw on top @@ -260,6 +261,15 @@ public class JitsiMeetActivity ReactActivityLifecycleCallbacks.onNewIntent(intent); } + // https://developer.android.com/reference/android/support/v4/app/ActivityCompat.OnRequestPermissionsResultCallback + @Override + public void onRequestPermissionsResult( + final int requestCode, + final String[] permissions, + final int[] grantResults) { + ReactActivityLifecycleCallbacks.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + @Override protected void onResume() { super.onResume(); @@ -283,6 +293,14 @@ public class JitsiMeetActivity } } + /** + * Implementation of the {@code PermissionAwareActivity} interface. + */ + @Override + public void requestPermissions(String[] permissions, int requestCode, PermissionListener listener) { + ReactActivityLifecycleCallbacks.requestPermissions(this, permissions, requestCode, listener); + } + /** * * @see JitsiMeetView#setDefaultURL(URL) diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivityInterface.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivityInterface.java new file mode 100644 index 000000000..eeda6954b --- /dev/null +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivityInterface.java @@ -0,0 +1,15 @@ +package org.jitsi.meet.sdk; + +import android.support.v4.app.ActivityCompat; + +import com.facebook.react.modules.core.PermissionAwareActivity; + +/** + * This interface serves as the umbrella interface that applications not using + * {@code JitsiMeetActivity} must implement in order to ensure full + * functionality. + */ +public interface JitsiMeetActivityInterface + extends ActivityCompat.OnRequestPermissionsResultCallback, + PermissionAwareActivity { +} diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/ReactActivityLifecycleCallbacks.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/ReactActivityLifecycleCallbacks.java index 234ddd55e..26c4138af 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/ReactActivityLifecycleCallbacks.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/ReactActivityLifecycleCallbacks.java @@ -16,11 +16,16 @@ package org.jitsi.meet.sdk; +import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; +import android.os.Build; +import com.calendarevents.CalendarEventsPackage; import com.facebook.react.ReactInstanceManager; +import com.facebook.react.bridge.Callback; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; +import com.facebook.react.modules.core.PermissionListener; /** * Helper class to encapsulate the work which needs to be done on @@ -28,6 +33,13 @@ import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; * it. */ public class ReactActivityLifecycleCallbacks { + /** + * Needed for making sure this class working with the "PermissionsAndroid" + * React Native module. + */ + private static PermissionListener permissionListener; + private static Callback permissionsCallback; + /** * {@link Activity} lifecycle method which should be called from * {@link Activity#onBackPressed} so we can do the required internal @@ -107,6 +119,11 @@ public class ReactActivityLifecycleCallbacks { if (reactInstanceManager != null) { reactInstanceManager.onHostResume(activity, defaultBackButtonImpl); } + + if (permissionsCallback != null) { + permissionsCallback.invoke(); + permissionsCallback = null; + } } /** @@ -126,4 +143,25 @@ public class ReactActivityLifecycleCallbacks { reactInstanceManager.onNewIntent(intent); } } + + public static void onRequestPermissionsResult( + final int requestCode, + final String[] permissions, + final int[] grantResults) { + permissionsCallback = new Callback() { + @Override + public void invoke(Object... args) { + if (permissionListener != null + && permissionListener.onRequestPermissionsResult(requestCode, permissions, grantResults)) { + permissionListener = null; + } + } + }; + } + + @TargetApi(Build.VERSION_CODES.M) + public static void requestPermissions(Activity activity, String[] permissions, int requestCode, PermissionListener listener) { + permissionListener = listener; + activity.requestPermissions(permissions, requestCode); + } }