package com.braunster.androidchatsdk.firebaseplugin.firebase.backendless;
import android.content.Context;
import com.backendless.Backendless;
import com.backendless.DeviceRegistration;
import com.backendless.async.callback.AsyncCallback;
import com.backendless.exceptions.BackendlessFault;
import com.backendless.messaging.DeliveryOptions;
import com.backendless.messaging.PublishOptions;
import com.backendless.messaging.PushBroadcastMask;
import com.backendless.messaging.PushPolicyEnum;
import com.backendless.services.messaging.MessageStatus;
import com.braunster.androidchatsdk.firebaseplugin.R;
import com.braunster.chatsdk.Utils.Debug;
import com.braunster.chatsdk.interfaces.BPushHandler;
import com.braunster.chatsdk.interfaces.BUploadHandler;
import com.braunster.chatsdk.network.BDefines;
import com.braunster.chatsdk.network.BNetworkManager;
import org.jdeferred.Promise;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Collection;
import timber.log.Timber;
/**
* Created by Erk on 27.07.2016.
*/
public class BBackendlessHandler implements BPushHandler, BUploadHandler {
private static final String TAG = BBackendlessHandler.class.getSimpleName();
private static final boolean DEBUG = Debug.BBackendlessPushHandler;
private boolean isSubscribed;
private Context context;
public void setContext(Context ctx) {
context = ctx;
}
public void initWithAppKey(String appKey, String secretKey, String versionKey)
{
Backendless.initApp(context, appKey, secretKey, versionKey);
}
@Override
public boolean subscribeToPushChannel(final String channel) {
if (!BNetworkManager.sharedManager().getNetworkAdapter().backendlessEnabled())
return false;
try {
Backendless.Messaging.registerDevice(context.getString(R.string.google_project_number), channel, new AsyncCallback<Void>() {
@Override
public void handleResponse(Void response) {
if(DEBUG) Timber.v("Device has been subscribed to channel " + channel);
}
@Override
public void handleFault(BackendlessFault fault) {
if(DEBUG) Timber.v("Device subscription failed. " + fault.getMessage());
}
});
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
public boolean unsubscribeToPushChannel(String channel) {
if (!BNetworkManager.sharedManager().getNetworkAdapter().backendlessEnabled())
return false;
// TODO: unsubscribe from push channel backendless
// http://support.backendless.com/topic/push-notification-unregister-from-a-specific-channel
DeviceRegistration devReg = null;
try {
devReg = Backendless.Messaging.getDeviceRegistration();
} catch (Exception e) {
e.printStackTrace();
}
if(devReg != null) {
Backendless.Messaging.unregisterDevice();
}
return true;
}
@Override
public void pushToChannels(Collection<String> channels, JSONObject data) {
// Configure the header
PublishOptions publishOptions = new PublishOptions();
try {
publishOptions.putHeader("android-ticker-text", data.getString(BDefines.Keys.CONTENT));
publishOptions.putHeader("android-content-title", "Message from " + data.getString(BDefines.Keys.MESSAGE_SENDER_NAME));
publishOptions.putHeader("android-content-text", data.getString(BDefines.Keys.MESSAGE_PAYLOAD));
publishOptions.setPublisherId(data.getString(BDefines.Keys.MESSAGE_SENDER_ENTITY_ID));
} catch (JSONException e) {
e.printStackTrace();
}
// Only push to android devices
DeliveryOptions deliveryOptions = new DeliveryOptions();
deliveryOptions.setPushPolicy(PushPolicyEnum.ONLY);
deliveryOptions.setPushBroadcast(PushBroadcastMask.ALL);
// Publish a push notification to each channel
for(final String channel : channels) {
try {
data.put(BDefines.Keys.Channel, channel);
} catch (JSONException e) {
e.printStackTrace();
}
Backendless.Messaging.publish(channel, data.toString(), publishOptions, deliveryOptions, new AsyncCallback<MessageStatus>() {
@Override
public void handleResponse(MessageStatus response) {
if (DEBUG) Timber.v("Message published to channel: " + channel);
}
@Override
public void handleFault(BackendlessFault fault) {
if (DEBUG) Timber.v("Publish failed, " + fault.getMessage());
}
});
}
}
@Override
public Promise uploadFile(byte[] data, String name, String mimeType) {
return null;
}
}