Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 74 additions & 1 deletion src/Firebase.Database/Database.uno
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ namespace Firebase.Database
"android.util.Log",
"org.json.JSONObject",
"java.util.Map",
"java.util.HashMap")]
"java.util.HashMap",
"java.util.ArrayList")]
[Require("Cocoapods.Podfile.Target", "pod 'Firebase/Database'")]
[Require("Gradle.Dependency.Compile", "com.google.firebase:firebase-database:9.2.0")]
[extern(iOS) Require("Source.Import","FirebaseDatabase/FIRDatabase.h")]
Expand All @@ -34,6 +35,10 @@ namespace Firebase.Database
static bool _initialized;
extern(android) static Java.Object _handle;
extern(ios) public static ObjC.Object _handle;
extern(android) static Java.Object _valueListenerMap; // For storing ChildEventListener
extern(android) static Java.Object _childListenerMap; // For storing ValueEventListener
extern(android) static Java.Object _queryListenerArray; // For storing Query EventListener


public static void Init()
{
Expand All @@ -60,6 +65,11 @@ namespace Firebase.Database
public static void AndroidInit()
@{
@{_handle:Set(FirebaseDatabase.getInstance().getReference())};

// Initialize variables
@{_childListenerMap:Set(new HashMap<String, ChildEventListener>())};
@{_valueListenerMap:Set(new HashMap<String, ValueEventListener>())};
@{_queryListenerArray:Set(new ArrayList<FirebaseQueryObject>())};
@}

[Foreign(Language.ObjC)]
Expand Down Expand Up @@ -127,6 +137,11 @@ namespace Firebase.Database
DatabaseReference ref = (DatabaseReference)@{DatabaseService._handle:Get()};
Query lastAddedQuery = ref.child(path).limitToLast(count);
lastAddedQuery.addChildEventListener(childEventListener);

@SuppressWarnings("unchecked") // For removing cast check warnings
ArrayList<FirebaseQueryObject> queryListenerArray = (ArrayList<FirebaseQueryObject>)@{DatabaseService._queryListenerArray:Get()};
FirebaseQueryObject firebaseQueryObject = new FirebaseQueryObject(path, lastAddedQuery, childEventListener);
queryListenerArray.add(firebaseQueryObject); // Add firebaseQueryObject to query array
@}

[Foreign(Language.ObjC)]
Expand Down Expand Up @@ -184,6 +199,11 @@ namespace Firebase.Database
DatabaseReference ref = (DatabaseReference)@{DatabaseService._handle:Get()};
Query readQuery = ref.child(path).orderByChild(keyName).endAt(longLastValue).limitToLast(count);
readQuery.addValueEventListener(dataListener);

@SuppressWarnings("unchecked")
ArrayList<FirebaseQueryObject> queryListenerArray = (ArrayList<FirebaseQueryObject>)@{DatabaseService._queryListenerArray:Get()};
FirebaseQueryObject firebaseQueryObject = new FirebaseQueryObject(path, readQuery, dataListener);
queryListenerArray.add(firebaseQueryObject);
@}

[Foreign(Language.ObjC)]
Expand Down Expand Up @@ -249,6 +269,9 @@ namespace Firebase.Database
};
DatabaseReference ref = (DatabaseReference)@{DatabaseService._handle:Get()};
ref.child(path).addChildEventListener(childEventListener);
@SuppressWarnings("unchecked")
HashMap<String, ChildEventListener> mListenerMap = (HashMap<String, ChildEventListener>)@{DatabaseService._childListenerMap:Get()};
mListenerMap.put(path, childEventListener); // Add to Child event listener map
@}

[Foreign(Language.ObjC)]
Expand Down Expand Up @@ -314,6 +337,9 @@ namespace Firebase.Database
};
DatabaseReference ref = (DatabaseReference)@{DatabaseService._handle:Get()};
ref.child(path).addChildEventListener(childEventListener);
@SuppressWarnings("unchecked")
HashMap<String, ChildEventListener> mListenerMap = (HashMap<String, ChildEventListener>)@{DatabaseService._childListenerMap:Get()};
mListenerMap.put(path, childEventListener);
@}

[Foreign(Language.ObjC)]
Expand Down Expand Up @@ -379,6 +405,9 @@ namespace Firebase.Database
};
DatabaseReference ref = (DatabaseReference)@{DatabaseService._handle:Get()};
ref.child(path).addChildEventListener(childEventListener);
@SuppressWarnings("unchecked")
HashMap<String, ChildEventListener> mListenerMap = (HashMap<String, ChildEventListener>)@{DatabaseService._childListenerMap:Get()};
mListenerMap.put(path, childEventListener);
@}

[Foreign(Language.ObjC)]
Expand All @@ -393,7 +422,44 @@ namespace Firebase.Database
extern(Android)
public static void DetachListeners(string path)
@{
DatabaseReference ref = (DatabaseReference)@{DatabaseService._handle:Get()};

// Remove ChildEventListener if any set with this path
@SuppressWarnings("unchecked")
HashMap<String, ChildEventListener> childListenerMap = (HashMap<String, ChildEventListener>)@{DatabaseService._childListenerMap:Get()};
for (Map.Entry<String, ChildEventListener> entry : childListenerMap.entrySet()) {
String pathString = entry.getKey();
if (pathString.equals(path)) { // Check for path name
ChildEventListener listener = entry.getValue();
ref.child(path).removeEventListener(listener);
childListenerMap.remove(entry);
}
}

// Remove ValueEventListener if any set with this path
@SuppressWarnings("unchecked")
HashMap<String, ValueEventListener> valueListenerMap = (HashMap<String, ValueEventListener>)@{DatabaseService._valueListenerMap:Get()};
for (Map.Entry<String, ValueEventListener> entry : valueListenerMap.entrySet()) {
String pathString = entry.getKey();
if (pathString.equals(path)) {
ValueEventListener listener = entry.getValue();
ref.child(path).removeEventListener(listener);
valueListenerMap.remove(entry);
}
}

// Remove Query ValueEventListener if any set with this path
@SuppressWarnings("unchecked")
ArrayList<FirebaseQueryObject> queryListenerArray = (ArrayList<FirebaseQueryObject>)@{DatabaseService._queryListenerArray:Get()};
for (FirebaseQueryObject firebaseQueryObject : queryListenerArray) {
if (firebaseQueryObject.getPath().equals(path)) {
if (firebaseQueryObject.getChildEventListener() != null)
firebaseQueryObject.getQuery().removeEventListener(firebaseQueryObject.getChildEventListener());

if (firebaseQueryObject.getValueEventListener() != null)
firebaseQueryObject.getQuery().removeEventListener(firebaseQueryObject.getValueEventListener());
}
}
@}

[Foreign(Language.ObjC)]
Expand Down Expand Up @@ -443,6 +509,9 @@ namespace Firebase.Database
};
DatabaseReference ref = (DatabaseReference)@{DatabaseService._handle:Get()};
ref.child(path).addValueEventListener(dataListener);
@SuppressWarnings("unchecked")
HashMap<String, ValueEventListener> mListenerMap = (HashMap<String, ValueEventListener>)@{DatabaseService._valueListenerMap:Get()};
mListenerMap.put(path, dataListener); // Add to Value event listener Map
@}


Expand Down Expand Up @@ -759,6 +828,7 @@ namespace Firebase.Database
"org.json.JSONObject",
"org.json.JSONArray",
"java.util.Map",
"java.util.HashMap",
"java.util.List")]
extern(Android)
internal class Read : Promise<string>
Expand Down Expand Up @@ -792,6 +862,9 @@ namespace Firebase.Database
};
DatabaseReference ref = (DatabaseReference)@{DatabaseService._handle:Get()};
ref.child(path).addListenerForSingleValueEvent(dataListener);
@SuppressWarnings("unchecked")
HashMap<String, ValueEventListener> mListenerMap = (HashMap<String, ValueEventListener>)@{DatabaseService._valueListenerMap:Get()};
mListenerMap.put(path, dataListener);
@}
void Reject(string reason) { Reject(new Exception(reason)); }
}
Expand Down
3 changes: 2 additions & 1 deletion src/Firebase.Database/Firebase.Database.unoproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"FuseJS"
],
"Includes": [
"*"
"*",
"FirebaseQueryObject.java:Java:Android",
]
}
45 changes: 45 additions & 0 deletions src/Firebase.Database/FirebaseQueryObject.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.foreign.Firebase.Database;

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

/**
* Created by dhvlsimac on 28/03/18.
*/

public class FirebaseQueryObject {

private String path;
private Query query;
private ChildEventListener childEventListener;
private ValueEventListener valueEventListener;

FirebaseQueryObject(String path, Query query, ChildEventListener listener) {
this.path = path;
this.query = query;
this.childEventListener = listener;
}

FirebaseQueryObject(String path, Query query, ValueEventListener listener) {
this.path = path;
this.query = query;
this.valueEventListener = listener;
}

public String getPath() {
return path;
}

public Query getQuery() {
return query;
}

public ChildEventListener getChildEventListener() {
return childEventListener;
}

public ValueEventListener getValueEventListener() {
return valueEventListener;
}
}