Java tutorial
/* * Copyright @ 2019-present 8x8, Inc. * Copyright @ 2018 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; 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.bridge.ReactContext; import com.facebook.react.modules.core.PermissionListener; /** * Helper class to encapsulate the work which needs to be done on * {@link Activity} lifecycle methods in order for the React side to be aware of * it. */ public class JitsiMeetActivityDelegate { /** * Needed for making sure this class working with the "PermissionsAndroid" * React Native module. */ private static PermissionListener permissionListener; private static Callback permissionsCallback; /** * Tells whether or not the permissions request is currently in progress. * * @return {@code true} if the permssions are being requested or {@code false} otherwise. */ static boolean arePermissionsBeingRequested() { return permissionListener != null; } /** * {@link Activity} lifecycle method which should be called from * {@code Activity#onActivityResult} so we are notified about results of external intents * started/finished. * * @param activity {@code Activity} activity from where the result comes from. * @param requestCode {@code int} code of the request. * @param resultCode {@code int} code of the result. * @param data {@code Intent} the intent of the activity. */ public static void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { ReactInstanceManager reactInstanceManager = ReactInstanceManagerHolder.getReactInstanceManager(); if (reactInstanceManager != null) { reactInstanceManager.onActivityResult(activity, requestCode, resultCode, data); } } /** * {@link Activity} lifecycle method which should be called from * {@link Activity#onBackPressed} so we can do the required internal * processing. * * @return {@code true} if the back-press was processed; {@code false}, * otherwise. If {@code false}, the application should call the * {@code super}'s implementation. */ public static void onBackPressed() { ReactInstanceManager reactInstanceManager = ReactInstanceManagerHolder.getReactInstanceManager(); if (reactInstanceManager != null) { reactInstanceManager.onBackPressed(); } } /** * {@link Activity} lifecycle method which should be called from * {@code Activity#onDestroy} so we can do the required internal * processing. * * @param activity {@code Activity} being destroyed. */ public static void onHostDestroy(Activity activity) { ReactInstanceManager reactInstanceManager = ReactInstanceManagerHolder.getReactInstanceManager(); if (reactInstanceManager != null) { reactInstanceManager.onHostDestroy(activity); } } /** * {@link Activity} lifecycle method which should be called from * {@code Activity#onPause} so we can do the required internal processing. * * @param activity {@code Activity} being paused. */ public static void onHostPause(Activity activity) { ReactInstanceManager reactInstanceManager = ReactInstanceManagerHolder.getReactInstanceManager(); if (reactInstanceManager != null) { // Try to avoid a crash because some devices trip on this assert: // https://github.com/facebook/react-native/blob/df4e67fe75d781d1eb264128cadf079989542755/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java#L512 // Why this happens is a mystery wrapped in an enigma. ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); if (activity == reactContext.getCurrentActivity()) { reactInstanceManager.onHostPause(activity); } } } /** * {@link Activity} lifecycle method which should be called from * {@code Activity#onResume} so we can do the required internal processing. * * @param activity {@code Activity} being resumed. */ public static void onHostResume(Activity activity) { ReactInstanceManager reactInstanceManager = ReactInstanceManagerHolder.getReactInstanceManager(); if (reactInstanceManager != null) { reactInstanceManager.onHostResume(activity, new DefaultHardwareBackBtnHandlerImpl(activity)); } if (permissionsCallback != null) { permissionsCallback.invoke(); permissionsCallback = null; } } /** * {@link Activity} lifecycle method which should be called from * {@code Activity#onNewIntent} so we can do the required internal * processing. Note that this is only needed if the activity's "launchMode" * was set to "singleTask". This is required for deep linking to work once * the application is already running. * * @param intent {@code Intent} instance which was received. */ public static void onNewIntent(Intent intent) { ReactInstanceManager reactInstanceManager = ReactInstanceManagerHolder.getReactInstanceManager(); if (reactInstanceManager != null) { reactInstanceManager.onNewIntent(intent); } } public static void onRequestPermissionsResult(final int requestCode, final String[] permissions, final int[] grantResults) { CalendarEventsPackage.onRequestPermissionsResult(requestCode, permissions, 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); } }