com.facebook.react.modules.core.DeviceEventManagerModule.java Source code

Java tutorial

Introduction

Here is the source code for com.facebook.react.modules.core.DeviceEventManagerModule.java

Source

/*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

package com.facebook.react.modules.core;

import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.module.annotations.ReactModule;

/** Native module that handles device hardware events like hardware back presses. */
@ReactModule(name = DeviceEventManagerModule.NAME)
public class DeviceEventManagerModule extends ReactContextBaseJavaModule {
    public static final String NAME = "DeviceEventManager";

    @DoNotStrip
    public interface RCTDeviceEventEmitter extends JavaScriptModule {
        void emit(@NonNull String eventName, @Nullable Object data);
    }

    private final Runnable mInvokeDefaultBackPressRunnable;

    public DeviceEventManagerModule(ReactApplicationContext reactContext,
            final DefaultHardwareBackBtnHandler backBtnHandler) {
        super(reactContext);
        mInvokeDefaultBackPressRunnable = new Runnable() {
            @Override
            public void run() {
                UiThreadUtil.assertOnUiThread();
                backBtnHandler.invokeDefaultOnBackPressed();
            }
        };
    }

    /** Sends an event to the JS instance that the hardware back has been pressed. */
    public void emitHardwareBackPressed() {
        ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn();

        if (reactApplicationContext != null) {
            reactApplicationContext.getJSModule(RCTDeviceEventEmitter.class).emit("hardwareBackPress", null);
        }
    }

    /** Sends an event to the JS instance that a new intent was received. */
    public void emitNewIntentReceived(Uri uri) {
        ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn();

        if (reactApplicationContext != null) {
            WritableMap map = Arguments.createMap();
            map.putString("url", uri.toString());
            reactApplicationContext.getJSModule(RCTDeviceEventEmitter.class).emit("url", map);
        }
    }

    /**
     * Invokes the default back handler for the host of this catalyst instance. This should be invoked
     * if JS does not want to handle the back press itself.
     */
    @ReactMethod
    public void invokeDefaultBackPressHandler() {
        // There should be no need to check if the catalyst instance is alive. After initialization
        // the thread instances cannot be null, and scheduling on a thread after ReactApplicationContext
        // teardown is a noop.
        getReactApplicationContext().runOnUiQueueThread(mInvokeDefaultBackPressRunnable);
    }

    @Override
    public String getName() {
        return "DeviceEventManager";
    }
}