// Path: data/src/main/java/com/mike/feed/data/entity/DeletedEntity.java
// public class DeletedEntity {
// }
// 
// Path: data/src/main/java/com/mike/feed/data/entity/EventType.java
// public enum  EventType {
//     Added, Changed, Removed, Moved
// }
// 
// Path: data/src/main/java/com/mike/feed/data/entity/FeedChangedInfoEntity.java
// public class FeedChangedInfoEntity {
//     private EventType type;
//     private String previousChildKey;
//     private String key;
//     private FeedEntity feedEntity;
// 
//     public FeedChangedInfoEntity(EventType type, String previousChildKey, String key, FeedEntity feedEntity) {
//         this.type = type;
//         this.previousChildKey = previousChildKey;
//         this.key = key;
//         this.feedEntity = feedEntity;
//     }
// 
//     public String getKey() {
//         return key;
//     }
// 
//     public void setKey(String key) {
//         this.key = key;
//     }
// 
//     public EventType getType() {
//         return type;
//     }
// 
//     public void setType(EventType type) {
//         this.type = type;
//     }
// 
//     public String getPreviousChildKey() {
//         return previousChildKey;
//     }
// 
//     public void setPreviousChildKey(String previousChildKey) {
//         this.previousChildKey = previousChildKey;
//     }
// 
//     public FeedEntity getFeedEntity() {
//         return feedEntity;
//     }
// 
//     public void setFeedEntity(FeedEntity feedEntity) {
//         this.feedEntity = feedEntity;
//     }
// }
// 
// Path: data/src/main/java/com/mike/feed/data/entity/FeedEntity.java
// @IgnoreExtraProperties
// public class FeedEntity {
// 
//     private String title;
//     private String body;
//     private String image;
//     private String key;
//     private int index;
// 
// 
//     public Map<String, Object> toMap() {
//         HashMap<String, Object> result = new HashMap<>();
//         result.put("title", title);
//         result.put("image", image);
//         result.put("body", body);
// 
//         return result;
//     }
// 
//     public String getKey() {
//         return key;
//     }
// 
//     public void setKey(String key) {
//         this.key = key;
//     }
// 
// 
//     public int getIndex() {
//         return index;
//     }
// 
//     public void setIndex(int index) {
//         this.index = index;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public void setTitle(String title) {
//         this.title = title;
//     }
// 
//     public String getBody() {
//         return body;
//     }
// 
//     public void setBody(String body) {
//         this.body = body;
//     }
// 
//     public String getImage() {
//         return image;
//     }
// 
//     public void setImage(String image) {
//         this.image = image;
//     }
// }
// 
// Path: data/src/main/java/com/mike/feed/data/entity/WrittenEntity.java
// public class WrittenEntity {
//     private String key;
// 
//     public String getKey() {
//         return key;
//     }
// 
//     public void setKey(String key) {
//         this.key = key;
//     }
// }


import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.Query;
import com.mike.feed.data.entity.DeletedEntity;
import com.mike.feed.data.entity.EventType;
import com.mike.feed.data.entity.FeedChangedInfoEntity;
import com.mike.feed.data.entity.FeedEntity;
import com.mike.feed.data.entity.WrittenEntity;
import java.util.HashMap;
import java.util.Map;
import rx.AsyncEmitter;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.subscriptions.Subscriptions;
import timber.log.Timber;
package com.mike.feed.data.firebase;




/**
 * Created by MinhNguyen on 8/24/16.
 */


public class FirebaseImpl implements Firebase {

    DatabaseReference database;

    public FirebaseImpl(DatabaseReference database) {
        this.database = database;
    }


    @Override
    public Observable<FeedChangedInfoEntity> registerFeedChangedEvent() {

        return Observable.fromAsync(new Action1<AsyncEmitter<FeedChangedInfoEntity>>() {
            @Override
// Path: data/src/main/java/com/mike/feed/data/entity/DeletedEntity.java
// public class DeletedEntity {
// }
// 
// Path: data/src/main/java/com/mike/feed/data/entity/EventType.java
// public enum  EventType {
//     Added, Changed, Removed, Moved
// }
// 
// Path: data/src/main/java/com/mike/feed/data/entity/FeedChangedInfoEntity.java
// public class FeedChangedInfoEntity {
//     private EventType type;
//     private String previousChildKey;
//     private String key;
//     private FeedEntity feedEntity;
// 
//     public FeedChangedInfoEntity(EventType type, String previousChildKey, String key, FeedEntity feedEntity) {
//         this.type = type;
//         this.previousChildKey = previousChildKey;
//         this.key = key;
//         this.feedEntity = feedEntity;
//     }
// 
//     public String getKey() {
//         return key;
//     }
// 
//     public void setKey(String key) {
//         this.key = key;
//     }
// 
//     public EventType getType() {
//         return type;
//     }
// 
//     public void setType(EventType type) {
//         this.type = type;
//     }
// 
//     public String getPreviousChildKey() {
//         return previousChildKey;
//     }
// 
//     public void setPreviousChildKey(String previousChildKey) {
//         this.previousChildKey = previousChildKey;
//     }
// 
//     public FeedEntity getFeedEntity() {
//         return feedEntity;
//     }
// 
//     public void setFeedEntity(FeedEntity feedEntity) {
//         this.feedEntity = feedEntity;
//     }
// }
// 
// Path: data/src/main/java/com/mike/feed/data/entity/FeedEntity.java
// @IgnoreExtraProperties
// public class FeedEntity {
// 
//     private String title;
//     private String body;
//     private String image;
//     private String key;
//     private int index;
// 
// 
//     public Map<String, Object> toMap() {
//         HashMap<String, Object> result = new HashMap<>();
//         result.put("title", title);
//         result.put("image", image);
//         result.put("body", body);
// 
//         return result;
//     }
// 
//     public String getKey() {
//         return key;
//     }
// 
//     public void setKey(String key) {
//         this.key = key;
//     }
// 
// 
//     public int getIndex() {
//         return index;
//     }
// 
//     public void setIndex(int index) {
//         this.index = index;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public void setTitle(String title) {
//         this.title = title;
//     }
// 
//     public String getBody() {
//         return body;
//     }
// 
//     public void setBody(String body) {
//         this.body = body;
//     }
// 
//     public String getImage() {
//         return image;
//     }
// 
//     public void setImage(String image) {
//         this.image = image;
//     }
// }
// 
// Path: data/src/main/java/com/mike/feed/data/entity/WrittenEntity.java
// public class WrittenEntity {
//     private String key;
// 
//     public String getKey() {
//         return key;
//     }
// 
//     public void setKey(String key) {
//         this.key = key;
//     }
// }


// Path: data/src/main/java/com/mike/feed/data/firebase/FirebaseImpl.java
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.Query;
import com.mike.feed.data.entity.DeletedEntity;
import com.mike.feed.data.entity.EventType;
import com.mike.feed.data.entity.FeedChangedInfoEntity;
import com.mike.feed.data.entity.FeedEntity;
import com.mike.feed.data.entity.WrittenEntity;
import java.util.HashMap;
import java.util.Map;
import rx.AsyncEmitter;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.subscriptions.Subscriptions;
import timber.log.Timber;

package com.mike.feed.data.firebase;




/**
 * Created by MinhNguyen on 8/24/16.
 */


public class FirebaseImpl implements Firebase {

    DatabaseReference database;

    public FirebaseImpl(DatabaseReference database) {
        this.database = database;
    }


    @Override
    public Observable<FeedChangedInfoEntity> registerFeedChangedEvent() {

        return Observable.fromAsync(new Action1<AsyncEmitter<FeedChangedInfoEntity>>() {
            @Override
            public void call(AsyncEmitter<FeedChangedInfoEntity> feedChangedInfoEntityAsyncEmitter) {