android: implement the PermissionAwareActivity interface

This makes the PermissionsAndroid builtin module work.

Introduce the JitsiMeetActivityInterface, which defines the interface that
activities using JitsiMeetView directly must implement in order to ensure full
functionality.
This commit is contained in:
Saúl Ibarra Corretgé 2018-09-04 22:45:59 +02:00 committed by Paweł Domas
parent 2043845d52
commit 388c906312
3 changed files with 72 additions and 1 deletions

View File

@ -27,6 +27,7 @@ import android.view.KeyEvent;
import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactInstanceManager;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.modules.core.PermissionListener;
import java.net.URL; import java.net.URL;
@ -42,7 +43,7 @@ import java.net.URL;
* {@code JitsiMeetView} static methods. * {@code JitsiMeetView} static methods.
*/ */
public class JitsiMeetActivity public class JitsiMeetActivity
extends AppCompatActivity { extends AppCompatActivity implements JitsiMeetActivityInterface {
/** /**
* The request code identifying requests for the permission to draw on top * The request code identifying requests for the permission to draw on top
@ -260,6 +261,15 @@ public class JitsiMeetActivity
ReactActivityLifecycleCallbacks.onNewIntent(intent); 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 @Override
protected void onResume() { protected void onResume() {
super.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) * @see JitsiMeetView#setDefaultURL(URL)

View File

@ -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 {
}

View File

@ -16,11 +16,16 @@
package org.jitsi.meet.sdk; package org.jitsi.meet.sdk;
import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import com.calendarevents.CalendarEventsPackage;
import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.Callback;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; 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 * Helper class to encapsulate the work which needs to be done on
@ -28,6 +33,13 @@ import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
* it. * it.
*/ */
public class ReactActivityLifecycleCallbacks { 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} lifecycle method which should be called from
* {@link Activity#onBackPressed} so we can do the required internal * {@link Activity#onBackPressed} so we can do the required internal
@ -107,6 +119,11 @@ public class ReactActivityLifecycleCallbacks {
if (reactInstanceManager != null) { if (reactInstanceManager != null) {
reactInstanceManager.onHostResume(activity, defaultBackButtonImpl); reactInstanceManager.onHostResume(activity, defaultBackButtonImpl);
} }
if (permissionsCallback != null) {
permissionsCallback.invoke();
permissionsCallback = null;
}
} }
/** /**
@ -126,4 +143,25 @@ public class ReactActivityLifecycleCallbacks {
reactInstanceManager.onNewIntent(intent); 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);
}
} }