package com.nbs.client.assassins.services;
import java.util.UUID;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import com.google.android.gcm.GCMBaseIntentService;
import com.google.android.gcm.GCMRegistrar;
import com.google.android.gms.maps.model.LatLng;
import com.googlecode.androidannotations.annotations.AfterInject;
import com.googlecode.androidannotations.annotations.EService;
import com.googlecode.androidannotations.annotations.rest.RestService;
import com.nbs.client.assassins.R;
import com.nbs.client.assassins.controllers.MainActivity;
import com.nbs.client.assassins.controllers.MainActivity_;
import com.nbs.client.assassins.models.App;
import com.nbs.client.assassins.models.Db;
import com.nbs.client.assassins.models.MatchMapper;
import com.nbs.client.assassins.models.Player;
import com.nbs.client.assassins.models.PlayerMapper;
import com.nbs.client.assassins.models.PlayerModel;
import com.nbs.client.assassins.models.Repository;
import com.nbs.client.assassins.models.User;
import com.nbs.client.assassins.network.GCMRegistrationRequest;
import com.nbs.client.assassins.network.HuntedRestClient;
import com.nbs.client.assassins.network.Response;
import com.nbs.client.assassins.network.LoginRequest;
import com.nbs.client.assassins.network.LoginResponse;
import com.nbs.client.assassins.utils.Bus;
@EService
public class GCMIntentService extends GCMBaseIntentService {
@RestService
HuntedRestClient restClient;
@AfterInject
public void afterInjection() {
//subvert a bug in HttpUrlConnection
//see: http://www.sapandiwakar.in/technical/eofexception-with-spring-rest-template-android/
restClient.getRestTemplate().setRequestFactory(
new HttpComponentsClientHttpRequestFactory());
}
public GCMIntentService() {}
public GCMIntentService(String... senderIds) {
super(GCMUtilities.SENDER_ID);
}
@Override
protected void onError(Context context, String errorId) {
Log.e(TAG, "ERROR: " + errorId);
}
@Override
protected void onMessage(Context c, Intent intent) {
Log.i(TAG, "received a GCM message.");
Log.i(TAG, " action: " + intent.getAction());
Bundle extras = intent.getExtras();
for(String key : extras.keySet()) {
Log.i(TAG, " " + key + " : " + extras.getString(key));
}
String type = extras.getString("type");
Repository model = App.getRepo();
if(type.equals(PushNotifications.PLAYER_EVENT)) {
model.createOrUpdatePlayer(PlayerMapper.fromExtras(extras));
}
else if(type.equals(PushNotifications.PLAYER_JOINED_MATCH)) {
model.createOrUpdatePlayer(PlayerMapper.fromExtras(extras));
}
else if(type.equals(PushNotifications.MATCH_END)) {
model.onMatchEnd(MatchMapper.fromExtras(extras));
Bus.post(c,PushNotifications.MATCH_END,extras);
}
else {
Bus.post(c, type, extras);
}
}
@Override
protected void onRegistered(Context context, String registrationId) {
Log.i(TAG, "OnRegistered() received: " + registrationId);
Repository model = App.getRepo();
User user = model.getUser();
//only send the new id if the user already has created an account
if(model.getUser().hasToken()) {
GCMRegistrationRequest msg = new GCMRegistrationRequest();
msg.installId = user.getInstallId();
msg.gcmRegId = registrationId;
try {
LoginResponse response =
restClient.updateGCMRegId(user.getToken(), msg);
if(response != null && response.status != Response.ERROR) {
Log.i(TAG, response.toString());
user.setToken(response.token);
GCMRegistrar.setRegisteredOnServer(context, true);
}
} catch(Exception e) {
Log.e(TAG, e.getMessage());
GCMRegistrar.setRegisteredOnServer(context, false);
}
}
//provisional user
else if(!user.hasUsername()) {
LoginRequest msg = new LoginRequest();
msg.installId = user.getInstallId();
msg.gcmRegId = registrationId;
try {
LoginResponse response =
restClient.registerProvisionalUser(msg);
if(response != null && response.status != Response.ERROR) {
Log.i(TAG, response.toString());
user.setToken(response.token);
GCMRegistrar.setRegisteredOnServer(context, true);
}
} catch(Exception e) {
Log.e(TAG, e.getMessage());
GCMRegistrar.setRegisteredOnServer(context, false);
}
}
}
@Override
protected void onUnregistered(Context context, String registrationId) {
Repository model = App.getRepo();
if(model.getUser().hasToken()) {
GCMRegistrationRequest msg = new GCMRegistrationRequest();
msg.installId = model.getUser().getInstallId();
msg.gcmRegId = registrationId;
restClient.unregisterGCMRegId(model.getUser().getToken(), msg);
//TODO handle response for unregister and make sure it was successful
GCMRegistrar.setRegisteredOnServer(context, false);
}
}
}