package io.fullstack.firestack; import android.content.Context; import android.util.Log; import java.util.Map; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.bridge.ReactContext; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.Task; import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; import com.google.firebase.database.ServerValue; interface KeySetterFn { String setKeyOrDefault(String a, String b); } class FirestackModule extends ReactContextBaseJavaModule implements LifecycleEventListener { private static final String TAG = "Firestack"; private Context context; private ReactContext mReactContext; private FirebaseApp app; public FirestackModule(ReactApplicationContext reactContext, Context context) { super(reactContext); this.context = context; mReactContext = reactContext; Log.d(TAG, "New instance"); } @Override public String getName() { return TAG; } @ReactMethod public void configureWithOptions(final ReadableMap params, @Nullable final Callback onComplete) { Log.i(TAG, "configureWithOptions"); FirebaseOptions.Builder builder = new FirebaseOptions.Builder(); FirebaseOptions defaultOptions = FirebaseOptions.fromResource(this.context); if (defaultOptions == null) { defaultOptions = new FirebaseOptions.Builder().build(); } KeySetterFn fn = new KeySetterFn() { public String setKeyOrDefault( final String key, final String defaultValue) { if (params.hasKey(key)) { // User-set key final String val = params.getString(key); Log.d(TAG, "Setting " + key + " from params to: " + val); return val; } else if (defaultValue != null && !defaultValue.equals("")) { Log.d(TAG, "Setting " + key + " from params to: " + defaultValue); return defaultValue; } else { return null; } } }; String val = fn.setKeyOrDefault("applicationId", defaultOptions.getApplicationId()); if (val != null) { builder.setApplicationId(val); } val = fn.setKeyOrDefault("apiKey", defaultOptions.getApiKey()); if (val != null) { builder.setApiKey(val); } val = fn.setKeyOrDefault("gcmSenderID", defaultOptions.getGcmSenderId()); if (val != null) { builder.setGcmSenderId(val); } val = fn.setKeyOrDefault("storageBucket", defaultOptions.getStorageBucket()); if (val != null) { builder.setStorageBucket(val); } val = fn.setKeyOrDefault("databaseURL", defaultOptions.getDatabaseUrl()); if (val != null) { builder.setDatabaseUrl(val); } val = fn.setKeyOrDefault("databaseUrl", defaultOptions.getDatabaseUrl()); if (val != null) { builder.setDatabaseUrl(val); } val = fn.setKeyOrDefault("clientId", defaultOptions.getApplicationId()); if (val != null) { builder.setApplicationId(val); } // if (params.hasKey("applicationId")) { // final String applicationId = params.getString("applicationId"); // Log.d(TAG, "Setting applicationId from params " + applicationId); // builder.setApplicationId(applicationId); // } // if (params.hasKey("apiKey")) { // final String apiKey = params.getString("apiKey"); // Log.d(TAG, "Setting API key from params " + apiKey); // builder.setApiKey(apiKey); // } // if (params.hasKey("APIKey")) { // final String apiKey = params.getString("APIKey"); // Log.d(TAG, "Setting API key from params " + apiKey); // builder.setApiKey(apiKey); // } // if (params.hasKey("gcmSenderID")) { // final String gcmSenderID = params.getString("gcmSenderID"); // Log.d(TAG, "Setting gcmSenderID from params " + gcmSenderID ); // builder.setGcmSenderId(gcmSenderID); // } // if (params.hasKey("storageBucket")) { // final String storageBucket = params.getString("storageBucket"); // Log.d(TAG, "Setting storageBucket from params " + storageBucket); // builder.setStorageBucket(storageBucket); // } // if (params.hasKey("databaseURL")) { // final String databaseURL = params.getString("databaseURL"); // Log.d(TAG, "Setting databaseURL from params " + databaseURL); // builder.setDatabaseUrl(databaseURL); // } // if (params.hasKey("clientID")) { // final String clientID = params.getString("clientID"); // Log.d(TAG, "Setting clientID from params " + clientID); // builder.setApplicationId(clientID); // } try { Log.i(TAG, "Configuring app"); if (app == null) { app = FirebaseApp.initializeApp(this.context, builder.build()); } Log.i(TAG, "Configured"); WritableMap resp = Arguments.createMap(); resp.putString("msg", "success"); onComplete.invoke(null, resp); } catch (Exception ex){ Log.e(TAG, "ERROR configureWithOptions"); Log.e(TAG, ex.getMessage()); WritableMap resp = Arguments.createMap(); resp.putString("msg", ex.getMessage()); onComplete.invoke(resp); } } @ReactMethod public void serverValue(@Nullable final Callback onComplete) { WritableMap timestampMap = Arguments.createMap(); for (Map.Entry<String, String> entry : ServerValue.TIMESTAMP.entrySet()) { timestampMap.putString(entry.getKey(), entry.getValue()); } WritableMap map = Arguments.createMap(); map.putMap("TIMESTAMP", timestampMap); onComplete.invoke(null, map); } // Internal helpers @Override public void onHostResume() { WritableMap params = Arguments.createMap(); params.putBoolean("isForeground", true); FirestackUtils.sendEvent(mReactContext, "FirestackAppState", params); } @Override public void onHostPause() { WritableMap params = Arguments.createMap(); params.putBoolean("isForeground", false); FirestackUtils.sendEvent(mReactContext, "FirestackAppState", params); } @Override public void onHostDestroy() { } }