package uk.ac.cam.echo.services;
import java.util.List;
import uk.ac.cam.echo.BitmapUtil;
import uk.ac.cam.echo.R;
import uk.ac.cam.echo.activities.ConversationDetailActivity;
import uk.ac.cam.echo.activities.ConversationListActivity;
import uk.ac.cam.echo.activities.MainActivity;
import uk.ac.cam.echo.client.ClientApi;
import uk.ac.cam.echo.data.Conference;
import uk.ac.cam.echo.data.Conversation;
import uk.ac.cam.echo.data.Message;
import uk.ac.cam.echo.data.User;
import uk.ac.cam.echo.data.async.Handler;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.util.Log;
public class EchoService extends Service {
// This is the object that receives interactions from clients. See
// RemoteService for a more complete example.
private final IBinder binder = new LocalBinder();
private static Vibrator v;
private long conferenceId;
private long conversationId;
private Conference conference;
private Conversation conversation;
private static ClientApi api;
private static User user;
private NotificationManager notificationManager;
private static boolean notifEnabled;
private int numMessages;
@Override
public void onCreate() {
super.onCreate();
api = new ClientApi("http://echoconf.herokuapp.com/");
notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
v = (Vibrator)getSystemService(VIBRATOR_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public void onDestroy() {
Log.d("SERVICE", "onDestroy()");
if(getUser() != null) {
getUser().setCurrentConversation(null);
getUser().save();
}
super.onDestroy();
}
public ClientApi getApi() {return api; }
public void setUser(User u) { user = u; }
public User getUser() { return user; }
public void notify(Message message) {
if(notifEnabled) {
new AsyncTask<Message, Void, Notification.Builder>(){
@Override
protected Notification.Builder doInBackground(Message... args) {
Message msg = args[0];
Context context = getApplicationContext();
Intent intent = new Intent(context, ConversationListActivity.class);
intent.putExtra("_id", msg.getConversation().getId());
PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0);
String user = msg.getSender().getFirstName();
Bitmap avatar = BitmapUtil.getBitmapFromURL(msg.getSender().getAvatarLink()+"&s=200");
long[] vibratePattern = {500,0,0,500};
Notification.Builder notifBuilder = new Notification.Builder(context)
.setContentTitle(conversation.getName())
.setContentIntent(pIntent)
.setSmallIcon(android.R.drawable.ic_dialog_email)
.setLargeIcon(avatar)
.setAutoCancel(true)
.setContentText(user + ": " + msg.getContents())
.setVibrate(vibratePattern)
.setTicker(user + ": " + msg.getContents());
return notifBuilder;
}
@Override
protected void onPostExecute(Notification.Builder nb) {
super.onPostExecute(nb);
notificationManager.notify(0, nb.getNotification());
}
}.execute(message);
}
}
public void notifyUpdate(Message message) {
Log.d("NOTIF", "notifyUpdate");
if(message == null) return;
new AsyncTask<Message, Void, Notification.Builder>(){
@Override
protected Notification.Builder doInBackground(Message... args) {
Message msg = args[0];
Context context = getApplicationContext();
Conversation msgConv = msg.getConversation();
Intent intent = new Intent(context, ConversationListActivity.class);
intent.putExtra("_id", msgConv.getId());
PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0);
String user = msg.getSender().getFirstName();
Bitmap avatar = BitmapUtil.getBitmapFromURL(msg.getSender().getAvatarLink()+"&s=200");
Notification.Builder notifBuilder = new Notification.Builder(context)
.setTicker("Overheard " + msg.getSender().getDisplayName() + " in " + msgConv.getName())
.setContentTitle("Overheard " + msgConv.getName())
.setContentIntent(pIntent)
.setSmallIcon(android.R.drawable.ic_dialog_info)
.setLargeIcon(avatar)
.setAutoCancel(true)
.setContentText(user + ": " + msg.getContents());
return notifBuilder;
}
@Override
protected void onPostExecute(Notification.Builder nb) {
super.onPostExecute(nb);
Notification n = nb.getNotification();
notificationManager.notify(1, n);
}
}.execute(message);
}
public void setNotifEnabled(boolean enabled) {
Log.d("NOTIF", "notifications are now " + enabled);
notifEnabled = enabled;
}
public void listenToConversation(long id) {
if(conversationId != id) {
new AsyncTask<Long, Void, Conversation>() {
@Override
protected Conversation doInBackground(Long... args) {
Conversation c = api.conversationResource.get(args[0]);
getUser().setCurrentConversation(c);
getUser().save();
return c;
}
@Override
protected void onPostExecute(Conversation conversation) {
super.onPostExecute(conversation);
setCurrentConversation(conversation);
}
}.execute(id);
Log.d("Notif", conversation == null ? " conv is null " : "conv is not null");
conversationId = id;
Handler<Message> handler = new Handler<Message>() {
@Override
public void handle(Message message) {
Log.d("NOTIF", "new notif received");
EchoService.this.notify(message);
}
};
api.conversationResource.listenToMessages(id).subscribe(handler);
}
}
public void setCurrentConversation(Conversation newConv) {conversation = newConv; }
public long getConversationId() {
return conversationId;
}
/**
* Class for clients to access. Because we know this service always
* runs in the same process as its clients, we don't need to deal with
* IPC.
*/
public class LocalBinder extends Binder {
public EchoService getService() {
return EchoService.this;
}
}
}