/* * Created by Itzik Braun on 12/3/2015. * Copyright (c) 2015 deluge. All rights reserved. * * Last Modification at: 3/12/15 4:35 PM */ package com.braunster.androidchatsdk.firebaseplugin.firebase.wrappers; import com.braunster.androidchatsdk.firebaseplugin.firebase.FirebasePaths; import com.braunster.chatsdk.dao.BMessage; import com.braunster.chatsdk.dao.BThread; import com.braunster.chatsdk.dao.BUser; import com.braunster.chatsdk.dao.core.DaoCore; import com.braunster.chatsdk.network.BDefines; import com.braunster.chatsdk.object.BError; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.ServerValue; import com.google.firebase.database.ChildEventListener; import org.apache.commons.lang3.StringUtils; import org.jdeferred.Deferred; import org.jdeferred.Promise; import org.jdeferred.impl.DeferredObject; import java.util.Date; import java.util.HashMap; import java.util.Map; import timber.log.Timber; public class BMessageWrapper extends EntityWrapper<BMessage> { private final String TAG = this.getClass().getSimpleName(); private static boolean DEBUG = true; private ChildEventListener readReceiptListener; public BMessageWrapper(BMessage model){ this.model = model; this.entityId = model.getEntityID(); } public BMessageWrapper(BThread thread, DataSnapshot snapshot){ this.model = DaoCore.fetchOrCreateEntityWithEntityID(BMessage.class, snapshot.getKey()); this.getModel().setThread(thread); this.entityId = snapshot.getKey(); deserialize(snapshot); } Map<String, Object> serialize(){ Map<String, Object> values = new HashMap<String, Object>(); values.put(BDefines.Keys.BPayload, model.getText()); values.put(BDefines.Keys.BDate, ServerValue.TIMESTAMP); values.put(BDefines.Keys.BType, model.getType()); values.put(BDefines.Keys.BUserFirebaseId, model.getBUserSender().getEntityID()); return values; } @SuppressWarnings("all") void deserialize(DataSnapshot snapshot){ Map<String, Object> value = (Map<String, Object>) snapshot.getValue(); if (DEBUG) Timber.v("deserialize, Value: %s", value); if (value == null) return; if (value.containsKey(BDefines.Keys.BPayload) && !value.get(BDefines.Keys.BPayload).equals("")) { model.setText((String) value.get(BDefines.Keys.BPayload)); } if (value.containsKey(BDefines.Keys.BType) && !value.get(BDefines.Keys.BType).equals("")) { if (value.get(BDefines.Keys.BType) instanceof Integer) model.setType((Integer) value.get(BDefines.Keys.BType)); else if (value.get(BDefines.Keys.BType) instanceof Long) model.setType( ((Long) value.get(BDefines.Keys.BType)).intValue() ); } if (value.containsKey(BDefines.Keys.BDate) && !value.get(BDefines.Keys.BDate).equals("")) model.setDate( new Date( (Long) value.get(BDefines.Keys.BDate) ) ); if (value.containsKey(BDefines.Keys.BUserFirebaseId) && !value.get(BDefines.Keys.BUserFirebaseId).equals("")) { String userEntityId = (String) value.get(BDefines.Keys.BUserFirebaseId); BUser user = DaoCore.fetchEntityWithEntityID(BUser.class, userEntityId); // If there is no user saved in the db for this entity id, // Create a new one and do a once on it to get all the details. if (user == null) { user = DaoCore.fetchOrCreateEntityWithEntityID(BUser.class, userEntityId); BUserWrapper.initWithModel(user).once(); } model.setBUserSender(user); } // Updating the db DaoCore.updateEntity(model); } public Promise<BMessage, BError, BMessage> push(){ if (DEBUG) Timber.v("push"); final Deferred<BMessage, BError, BMessage> deferred = new DeferredObject<>(); // Getting the message ref. Will be created if not exist. DatabaseReference ref = ref(); model.setEntityID(ref.getKey()); DaoCore.updateEntity(model); ref.setValue(serialize(), ServerValue.TIMESTAMP, new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError firebaseError, DatabaseReference firebase) { if (DEBUG) Timber.v("push message, onDone"); if (firebaseError == null) { deferred.resolve(BMessageWrapper.this.model); } else { deferred.reject(getFirebaseError(firebaseError)); } } }); return deferred.promise(); } public Promise<BMessage, BError, BMessage> send(){ if (DEBUG) Timber.v("send"); if (model.getThread() != null) { return push(); }else { final Deferred<BMessage, BError, BMessage> deferred = new DeferredObject<>(); deferred.reject(null); return deferred.promise(); } } /** * The message model will be updated after this call. **/ public void setDelivered(int delivered){ model.setDelivered(delivered); } private DatabaseReference ref(){ if (StringUtils.isNotEmpty(model.getEntityID())) { return FirebasePaths.threadMessagesRef(model.getThread().getEntityID()).child(model.getEntityID()); } else { return FirebasePaths.threadMessagesRef(model.getThread().getEntityID()).push(); } } }