package com.badoo.chateau.example;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.annotation.NonNull;
import android.support.v4.content.LocalBroadcastManager;
/**
* Class containing methods for creating common broadcasts to notify about changes in the application or data state.
*/
public class Broadcaster {
private static final String ACTION_CONVERSATION_UPDATED = Broadcaster.class.getSimpleName() + "_action_conversationUpdated";
private static final String ACTION_OTHER_USER_TYPING = Broadcaster.class.getSimpleName() + "_action_otherUserTyping";
private static final String ACTION_IMAGE_UPLOADED = Broadcaster.class.getSimpleName() + "_action_imageUploaded";
private static final String ACTION_USER_SIGNED_IN = Broadcaster.class.getSimpleName() + "_action_userSignedIn";
private static final String ACTION_USER_SIGNED_OUT = Broadcaster.class.getSimpleName() + "_action_userSignedOut";
private static final String ARG_CHAT_ID = Broadcaster.class.getSimpleName() + "_arg_chatId";
private static final String ARG_USER_ID = Broadcaster.class.getSimpleName() + "_arg_userId";
private static final String ARG_TIMESTAMP = Broadcaster.class.getSimpleName() + "_arg_timestamp";
private static final String ARG_MESSAGE_ID = Broadcaster.class.getSimpleName() + "_arg_messageId";
public static IntentFilter getConversationUpdatedFilter() {
final IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_CONVERSATION_UPDATED);
filter.addAction(ACTION_IMAGE_UPLOADED);
return filter;
}
public static IntentFilter getOtherUserTypingFilter() {
final IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_OTHER_USER_TYPING);
return filter;
}
public static IntentFilter getUserSignInStateChangedFilter() {
final IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_USER_SIGNED_IN);
filter.addAction(ACTION_USER_SIGNED_OUT);
return filter;
}
private Context mContext;
public Broadcaster(@NonNull Context context) {
mContext = context;
}
/**
* Sends a broadcast notifying that the user has signed in.
*/
public void userSignedIn() {
Intent intent = new Intent(ACTION_USER_SIGNED_IN);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
}
/**
* Sends a broadcast notifying that the user has signed out.
*/
public void userSignedOut() {
Intent intent = new Intent(ACTION_USER_SIGNED_OUT);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
}
/**
* Sends a broadcast to notify that an image finished uploading (in one of the conversations that the user is taking part in)
*/
public void imageUploaded(@NonNull String conversationId, @NonNull String messageId) {
Intent intent = new Intent(ACTION_IMAGE_UPLOADED);
intent.putExtra(ARG_CHAT_ID, conversationId);
intent.putExtra(ARG_MESSAGE_ID, messageId);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
}
/**
* Sends a broadcast to notify that another user is typing in a conversation
*/
public void otherUserTyping(@NonNull String userId, @NonNull String conversationId) {
Intent intent = new Intent(ACTION_OTHER_USER_TYPING);
intent.putExtra(ARG_USER_ID, userId);
intent.putExtra(ARG_CHAT_ID, conversationId);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
}
/**
* Sends a broadcast notifying that a conversation has been updated.
*/
public void conversationUpdated(@NonNull String chatId, long timestamp) {
Intent intent = new Intent(ACTION_CONVERSATION_UPDATED);
intent.putExtra(ARG_CHAT_ID, chatId);
intent.putExtra(ARG_TIMESTAMP, timestamp);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
}
public abstract static class ConversationUpdatedReceiver extends BroadcastReceiver {
@Override
public final void onReceive(Context context, Intent intent) {
if (ACTION_CONVERSATION_UPDATED.equals(intent.getAction())) {
onConversationUpdated(intent.getStringExtra(ARG_CHAT_ID), intent.getLongExtra(ARG_TIMESTAMP, 0));
}
else if (ACTION_IMAGE_UPLOADED.equals(intent.getAction())) {
onImageUploaded(intent.getStringExtra(ARG_CHAT_ID), intent.getStringExtra(ARG_MESSAGE_ID));
}
}
public abstract void onConversationUpdated(@NonNull String conversationId, long timestamp);
protected abstract void onImageUploaded(@NonNull String conversationId, @NonNull String messageId);
}
public abstract static class OtherUserTypingReceiver extends BroadcastReceiver {
@Override
public final void onReceive(Context context, Intent intent) {
if (ACTION_OTHER_USER_TYPING.equals(intent.getAction())) {
onOtherUserTyping(intent.getStringExtra(ARG_USER_ID), intent.getStringExtra(ARG_CHAT_ID));
}
}
protected abstract void onOtherUserTyping(@NonNull String userId, @NonNull String chatId);
}
public abstract static class UserSignInStateChangedReceiver extends BroadcastReceiver {
@Override
public final void onReceive(Context context, Intent intent) {
if (ACTION_USER_SIGNED_IN.equals(intent.getAction())) {
onUserSignedIn();
}
else if (ACTION_USER_SIGNED_OUT.equals(intent.getAction())) {
onUserSignedOut();
}
}
protected abstract void onUserSignedIn();
protected abstract void onUserSignedOut();
}
}