diff --git a/sky/services/firebase/firebase.mojom b/sky/services/firebase/firebase.mojom index 484e98dc4e28d22fd6f1394ca6a83ade629b48c1..04f9a0b373f6e8f5d90e033bcccf5b39722d4c5b 100644 --- a/sky/services/firebase/firebase.mojom +++ b/sky/services/firebase/firebase.mojom @@ -15,7 +15,7 @@ enum EventType { struct DataSnapshot { string key; - string value; // TODO(jackson): Support more value types + string jsonValue; }; struct Error { @@ -51,4 +51,5 @@ interface Firebase { AddChildEventListener(ChildEventListener listener); ObserveSingleEventOfType(EventType eventType) => (DataSnapshot snapshot); AuthWithOAuthToken(string provider, string credentials) => (Error? error, AuthData? authData); + SetValue(string jsonValue) => (Error? error); }; diff --git a/sky/services/firebase/ios/firebase_impl.h b/sky/services/firebase/ios/firebase_impl.h index f96dd1d6e40c02a155aaf7dd026a1541f3f56f51..c733bb915f1f0128085185524ddc61f9b70a6c1e 100644 --- a/sky/services/firebase/ios/firebase_impl.h +++ b/sky/services/firebase/ios/firebase_impl.h @@ -35,12 +35,13 @@ class FirebaseImpl : public ::firebase::Firebase { void AddChildEventListener( ::firebase::ChildEventListenerPtr listener) override; void ObserveSingleEventOfType( - ::firebase::EventType eventType, - const ObserveSingleEventOfTypeCallback& callback) override; + ::firebase::EventType eventType, + const ObserveSingleEventOfTypeCallback& callback) override; void AuthWithOAuthToken( const mojo::String& provider, const mojo::String& credentials, const AuthWithOAuthTokenCallback& callback) override; + void SetValue(const mojo::String& jsonValue); private: mojo::StrongBinding<::firebase::Firebase> binding_; diff --git a/sky/services/firebase/ios/firebase_impl.mm b/sky/services/firebase/ios/firebase_impl.mm index 239fc9043b27e0e92f906ea6963b514087d9a249..bed899567b9a00b7b3202172ac3346e5c120ef5f 100644 --- a/sky/services/firebase/ios/firebase_impl.mm +++ b/sky/services/firebase/ios/firebase_impl.mm @@ -159,6 +159,11 @@ void FirebaseImpl::AuthWithOAuthToken( }]; } +void FirebaseImpl::SetValue(const mojo::String& jsonValue) { + // TODO(jackson): JSON deserialization + [client_ setValue:@(jsonValue.data())]; +} + void FirebaseFactory::Create( mojo::ApplicationConnection* connection, mojo::InterfaceRequest<::firebase::Firebase> request) { diff --git a/sky/services/firebase/src/org/domokit/firebase/FirebaseImpl.java b/sky/services/firebase/src/org/domokit/firebase/FirebaseImpl.java index 48d6c76a168038cc1561e701d9297828feca49a0..ea795c22bbd305c40e1a0af97c15d8cbeac118e5 100644 --- a/sky/services/firebase/src/org/domokit/firebase/FirebaseImpl.java +++ b/sky/services/firebase/src/org/domokit/firebase/FirebaseImpl.java @@ -7,11 +7,17 @@ package org.domokit.firebase; import android.content.Context; import android.util.Log; -import java.io.IOException; - +import com.firebase.client.AuthData; import com.firebase.client.FirebaseError; import com.firebase.client.Firebase.AuthResultHandler; -import com.firebase.client.AuthData; +import com.firebase.client.Firebase.CompletionListener; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Iterator; +import java.util.Map; +import java.util.HashMap; import org.chromium.mojo.bindings.ConnectionErrorHandler; import org.chromium.mojo.bindings.InterfaceRequest; @@ -21,6 +27,10 @@ import org.chromium.mojom.firebase.EventType; import org.chromium.mojom.firebase.Firebase; import org.chromium.mojom.firebase.ValueEventListener; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + public class FirebaseImpl implements org.chromium.mojom.firebase.Firebase { private static final String TAG = "FirebaseImpl"; static private Context mContext; @@ -149,27 +159,86 @@ public class FirebaseImpl implements org.chromium.mojom.firebase.Firebase { responseCopy.call(null, mojoAuthData); } public void onAuthenticationError(FirebaseError error) { - org.chromium.mojom.firebase.Error mojoError = - new org.chromium.mojom.firebase.Error(); - mojoError.code = error.getCode(); - mojoError.message = error.getMessage(); - responseCopy.call(mojoError, null); + responseCopy.call(toMojoError(error), null); } }); } + @Override + public void setValue(String jsonValue, SetValueResponse response) { + final SetValueResponse responseCopy = response; + try { + JSONObject root = new JSONObject(jsonValue); + Object value = toMap(root).get("value"); + mClient.setValue(value, null, new CompletionListener() { + @Override + public void onComplete(FirebaseError error, com.firebase.client.Firebase ref) { + responseCopy.call(toMojoError(error)); + } + }); + } catch(JSONException e) { + org.chromium.mojom.firebase.Error mojoError = + new org.chromium.mojom.firebase.Error(); + mojoError.code = -1; + mojoError.message = "setValue JSONException"; + Log.e(TAG, "setValue JSONException", e); + responseCopy.call(mojoError); + } + } + DataSnapshot toMojoSnapshot(com.firebase.client.DataSnapshot snapshot) { DataSnapshot mojoSnapshot = new DataSnapshot(); mojoSnapshot.key = snapshot.getKey(); - mojoSnapshot.value = (String)snapshot.getValue(); + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("value", snapshot.getValue()); + mojoSnapshot.jsonValue = jsonObject.toString(); + } catch (JSONException e) { + Log.e(TAG, "toMojoSnapshot JSONException", e); + } return mojoSnapshot; } org.chromium.mojom.firebase.Error toMojoError(FirebaseError error) { + if (error == null) + return null; org.chromium.mojom.firebase.Error mojoError = new org.chromium.mojom.firebase.Error(); mojoError.code = error.getCode(); mojoError.message = error.getMessage(); return mojoError; } + + // public domain code from https://gist.github.com/codebutler/2339666 + @SuppressWarnings({ "rawtypes", "unchecked" }) + static Map toMap(JSONObject object) throws JSONException { + Map map = new HashMap(); + Iterator keys = object.keys(); + while (keys.hasNext()) { + String key = (String) keys.next(); + map.put(key, fromJson(object.get(key))); + } + return map; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + static List toList(JSONArray array) throws JSONException { + List list = new ArrayList(); + for (int i = 0; i < array.length(); i++) { + list.add(fromJson(array.get(i))); + } + return list; + } + + static Object fromJson(Object json) throws JSONException { + if (json == JSONObject.NULL) { + return null; + } else if (json instanceof JSONObject) { + return toMap((JSONObject) json); + } else if (json instanceof JSONArray) { + return toList((JSONArray) json); + } else { + return json; + } + } }