package net.udrunk.services; import java.sql.SQLException; import java.util.ArrayList; import net.udrunk.domain.Checkin; import net.udrunk.domain.Login; import net.udrunk.domain.dto.AllCheckinsDto; import net.udrunk.infra.DataBaseHelper; import org.springframework.web.client.RestClientException; import android.annotation.SuppressLint; import android.app.Service; import android.content.Intent; import android.content.SharedPreferences; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.util.Log; import com.google.gson.Gson; import com.googlecode.androidannotations.api.BackgroundExecutor; import com.j256.ormlite.android.apptools.OpenHelperManager; public class CheckinService extends Service { UdrunkClient restClient; private DataBaseHelper databaseHelper; @Override public void onCreate() { super.onCreate(); restClient = new UdrunkClient_(); } @Override public IBinder onBind(Intent intent) { // Return our messenger to the Activity to get commands return inMessenger.getBinder(); } public void getCheckins() { try { AllCheckinsDto checkins = restClient.getFeed(getCurrentLogin().getUsername(), getCurrentLogin().getApi_key()); for (Checkin checkin : checkins.objects) { try { getDBHelper().getPlaceDao().createOrUpdate( checkin.getPlace()); getDBHelper().getUserDao() .createOrUpdate(checkin.getUser()); getDBHelper().getCheckinDao().createOrUpdate(checkin); } catch (SQLException e) { e.printStackTrace(); } } } catch (RestClientException e) { sendOutMessageUIThread(MSG_GET_CHECKINS_FAILED); return; } sendOutMessage(MSG_GET_CHECKINS); } protected DataBaseHelper getDBHelper() { if (databaseHelper == null) { databaseHelper = OpenHelperManager.getHelper(this, DataBaseHelper.class); } return databaseHelper; } public static final int MSG_REGISTER_CLIENT = 1; public static final int MSG_UNREGISTER_CLIENT = 2; public static final int MSG_GET_CHECKINS = 3; public static final int MSG_GET_CHECKINS_FAILED = 4; // Used to receive messages from the Activity final Messenger inMessenger = new Messenger(new IncomingHandler()); /** Keeps track of all current registered clients. */ ArrayList<Messenger> outMessengers = new ArrayList<Messenger>(); @SuppressLint("HandlerLeak") class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { Log.d("MESSAGE", "Checkin Service got message " + msg.what); switch (msg.what) { case MSG_REGISTER_CLIENT: outMessengers.add(msg.replyTo); break; case MSG_UNREGISTER_CLIENT: outMessengers.remove(msg.replyTo); break; case MSG_GET_CHECKINS: getCheckinsBackground(); break; default: super.handleMessage(msg); } } } public void sendOutMessage(int messageId) { for (int i = outMessengers.size() - 1; i >= 0; i--) { try { outMessengers.get(i).send(Message.obtain(null, messageId)); } catch (RemoteException e) { // The client is dead. Remove it from the list; // we are going through the list from back to front // so this is safe to do inside the loop. outMessengers.remove(i); } } } private Handler handler_ = new Handler(); public void sendOutMessageUIThread(final int messageId) { handler_.post(new Runnable() { @Override public void run() { try { sendOutMessage(messageId); } catch (RuntimeException e) { Log.e("CheckinService_", "A runtime exception was thrown while executing code in a runnable", e); } } } ); } public void getCheckinsBackground() { BackgroundExecutor.execute(new Runnable() { @Override public void run() { try { getCheckins(); } catch (RuntimeException e) { Log.e("CheckinService_", "A runtime exception was thrown while executing code in a runnable", e); } } } ); } public Login getCurrentLogin() { SharedPreferences settings = getApplication().getSharedPreferences("udrunk", 0); String loginStr = settings.getString("login", null); Gson gson = new Gson(); Login result = gson.fromJson(loginStr, Login.class); return result; } }