package de.fau.cs.mad.fablab.android.model; import android.os.Handler; import net.spaceapi.HackerSpace; import net.spaceapi.State; import de.fau.cs.mad.fablab.android.model.events.SpaceApiStateChangedEvent; import de.fau.cs.mad.fablab.android.model.events.SpaceApiStatePushedEvent; import de.fau.cs.mad.fablab.rest.core.DoorState; import de.fau.cs.mad.fablab.rest.myapi.SpaceApi; import de.greenrobot.event.EventBus; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; public class SpaceApiModel { private SpaceApi mSpaceApi; private String mSpaceName; private long mPollingFrequency; private EventBus mEventBus = EventBus.getDefault(); private Handler mSpaceApiHandler = new Handler(); private Runnable mSpaceApiRunner = new SpaceApiRunner(); private boolean mRefreshRequested; private boolean mOpen; private long mTime; private Callback<HackerSpace> mSpaceApiCallback = new Callback<HackerSpace>() { @Override public void success(HackerSpace hackerSpace, Response response) { State state = hackerSpace.getState(); updateState(state.getOpen(), state.getLastchange()); mSpaceApiHandler.postDelayed(mSpaceApiRunner, mPollingFrequency); mRefreshRequested = false; } @Override public void failure(RetrofitError error) { mSpaceApiHandler.postDelayed(mSpaceApiRunner, mPollingFrequency); mRefreshRequested = false; } }; public SpaceApiModel(SpaceApi spaceApi, String spaceName, long pollingFrequency) { mSpaceApi = spaceApi; mSpaceName = spaceName; mPollingFrequency = pollingFrequency; mEventBus.register(this); mRefreshRequested = false; refreshState(); } private void updateState(boolean open, double lastChange) { mOpen = open; long currentTimeSeconds = System.currentTimeMillis() / 1000L; double minutesSinceLastChange = (currentTimeSeconds - lastChange) / 60; mTime = Double.valueOf(minutesSinceLastChange).longValue(); mEventBus.post(new SpaceApiStateChangedEvent(mOpen, mTime)); } private void refreshState() { if (!mRefreshRequested) { mRefreshRequested = true; mSpaceApiHandler.removeCallbacks(mSpaceApiRunner); mSpaceApi.getSpace(mSpaceName, mSpaceApiCallback); } } public boolean getOpen() { return mOpen; } public long getTime() { return mTime; } public void setPollingFrequency(long pollingFrequency) { mPollingFrequency = pollingFrequency; refreshState(); } private class SpaceApiRunner implements Runnable { @Override public void run() { mSpaceApi.getSpace(mSpaceName, mSpaceApiCallback); } } @SuppressWarnings("unused") public void onEvent(SpaceApiStatePushedEvent event) { DoorState doorState = event.getDoorState(); boolean open = doorState.state == DoorState.State.open; updateState(open, doorState.time); } }