package com.reactNativeQuickActions; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; import android.graphics.drawable.Icon; import android.os.Build; import com.facebook.react.bridge.ActivityEventListener; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.modules.core.DeviceEventManagerModule; import java.util.ArrayList; import java.util.List; @ReactModule(name = AppShortcutsModule.REACT_NAME) class AppShortcutsModule extends ReactContextBaseJavaModule { static final String REACT_NAME = "ReactAppShortcuts"; private static final String ACTION_SHORTCUT = "ACTION_SHORTCUT"; private static final String SHORTCUT_TYPE = "SHORTCUT_TYPE"; private List<ShortcutItem> mShortcutItems; AppShortcutsModule(ReactApplicationContext reactContext) { super(reactContext); reactContext.addActivityEventListener(new ActivityEventListener() { @Override public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { // Do nothing } @Override public void onNewIntent(Intent intent) { sendJSEvent(intent); } }); } @Override public String getName() { return REACT_NAME; } @ReactMethod @TargetApi(25) public void popInitialAction(Promise promise) { try { Activity currentActivity = getCurrentActivity(); WritableMap map = null; if (currentActivity != null) { Intent intent = currentActivity.getIntent(); if (ACTION_SHORTCUT.equals(intent.getAction())) { String type = intent.getStringExtra(SHORTCUT_TYPE); if (type != null) { map = Arguments.createMap(); map.putString("type", type); } } } promise.resolve(map); } catch (Exception e) { promise.reject(new JSApplicationIllegalArgumentException( "AppShortcuts.popInitialAction error. " + e.getMessage())); } } @ReactMethod @TargetApi(25) public void setShortcutItems(ReadableArray items) { if (!isShortcutSupported() || items.size() == 0) { return; } Context context = getReactApplicationContext(); mShortcutItems = new ArrayList<>(items.size()); List<ShortcutInfo> shortcuts = new ArrayList<>(items.size()); for (int i = 0; i < items.size(); i++) { ShortcutItem item = ShortcutItem.fromReadableMap(items.getMap(i)); mShortcutItems.add(item); int iconResId = context.getResources() .getIdentifier(item.icon, "drawable", context.getPackageName()); Intent intent = new Intent(context, getCurrentActivity().getClass()); intent.setAction(ACTION_SHORTCUT); intent.putExtra(SHORTCUT_TYPE, item.type); shortcuts.add(new ShortcutInfo.Builder(context, "id" + i) .setShortLabel(item.title) .setLongLabel(item.title) .setIcon(Icon.createWithResource(context, iconResId)) .setIntent(intent) .build()); } getReactApplicationContext().getSystemService(ShortcutManager.class) .setDynamicShortcuts(shortcuts); } @ReactMethod @TargetApi(25) public void clearShortcutItems() { getReactApplicationContext().getSystemService(ShortcutManager.class) .removeAllDynamicShortcuts(); mShortcutItems = null; } @ReactMethod public void isSupported(Callback callback) { if (callback != null) { callback.invoke(null, isShortcutSupported()); } } private boolean isShortcutSupported() { return Build.VERSION.SDK_INT >= 25; } private void sendJSEvent(Intent intent) { if (!isShortcutSupported()) { return; } String type = intent.getStringExtra(SHORTCUT_TYPE); ShortcutItem item = getShortcutItem(type); if (item != null) { getReactApplicationContext() .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("quickActionShortcut", item.toWritableMap()); } } private ShortcutItem getShortcutItem(String type) { if (mShortcutItems != null && type != null) { for (ShortcutItem item : mShortcutItems) { if (item.type.equals(type)) { return item; } } } return null; } }