/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.react.modules.core;
import javax.annotation.Nullable;
import android.net.Uri;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.SupportsWebWorkers;
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 = "DeviceEventManager")
public class DeviceEventManagerModule extends ReactContextBaseJavaModule {
@SupportsWebWorkers
public interface RCTDeviceEventEmitter extends JavaScriptModule {
void emit(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() {
getReactApplicationContext()
.getJSModule(RCTDeviceEventEmitter.class)
.emit("hardwareBackPress", null);
}
/**
* Sends an event to the JS instance that a new intent was received.
*/
public void emitNewIntentReceived(Uri uri) {
WritableMap map = Arguments.createMap();
map.putString("url", uri.toString());
getReactApplicationContext()
.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() {
getReactApplicationContext().runOnUiQueueThread(mInvokeDefaultBackPressRunnable);
}
@Override
public String getName() {
return "DeviceEventManager";
}
}