From bc2d8fa1da02037d0b9a2361f394f19e494c8cec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Mon, 27 Feb 2012 18:16:37 +0100 Subject: Use DelayedOperation on Android. BUGZ --- .../src/main/java/com/orbekk/same/SameService.java | 58 ++++++++++++++++------ 1 file changed, 44 insertions(+), 14 deletions(-) (limited to 'same-android/src/main/java/com/orbekk/same/SameService.java') diff --git a/same-android/src/main/java/com/orbekk/same/SameService.java b/same-android/src/main/java/com/orbekk/same/SameService.java index 66406bd..3a487d0 100644 --- a/same-android/src/main/java/com/orbekk/same/SameService.java +++ b/same-android/src/main/java/com/orbekk/same/SameService.java @@ -20,16 +20,28 @@ import com.orbekk.same.State.Component; import com.orbekk.same.android.net.AndroidBroadcasterFactory; import com.orbekk.same.android.net.Broadcaster; import com.orbekk.same.config.Configuration; +import com.orbekk.util.DelayedOperation; public class SameService extends Service { public final static int DISPLAY_MESSAGE = 1; public final static int SEARCH_NETWORKS = 2; public final static int CREATE_NETWORK = 3; public final static int JOIN_NETWORK = 4; - public final static int UPDATED_STATE_MESSAGE = 5; - public final static int ADD_STATE_RECEIVER = 6; - public final static int REMOVE_STATE_RECEIVER = 7; - public final static int SET_STATE = 8; + public final static int ADD_STATE_RECEIVER = 5; + public final static int REMOVE_STATE_RECEIVER = 6; + + /** + * arg1: Operation number. + * obj: Updated component. + */ + public final static int SET_STATE = 7; + public final static int UPDATED_STATE_CALLBACK = 8; + + /** + * arg1: Operation number. + * obj: Operation status. + */ + public final static int OPERATION_STATUS_CALLBACK = 9; // TODO: Remove these and use messengers instead of broadcast intents. public final static String AVAILABLE_NETWORKS_UPDATE = @@ -113,19 +125,21 @@ public class SameService extends Service { stateReceivers.remove(droppedMessenger); break; case SET_STATE: - // TODO: We may get errors here and we need to inform the - // caller. Perhaps combine with some sort of callback. + logger.info("SET_STATE: oId: {}, comp: {}", message.arg1, message.obj); State.Component updatedComponent = (State.Component)message.obj; - try { - sameController.getClient().getInterface().set( - updatedComponent); - } catch (UpdateConflict e) { - logger.info("Update failed: {}", updatedComponent); - } + int id = message.arg1; + logger.info("Running operation."); + DelayedOperation op = sameController.getClient().getInterface() + .set(updatedComponent); + logger.info("Operation finished. Sending callback."); + operationStatusCallback(op, id, message.replyTo); + logger.info("Callback sent."); + break; default: super.handleMessage(message); } + logger.info("Finished handling message."); } } @@ -137,7 +151,7 @@ public class SameService extends Service { synchronized (stateReceivers) { ArrayList dropped = new ArrayList(); for (Messenger messenger : stateReceivers) { - Message message = Message.obtain(null, UPDATED_STATE_MESSAGE); + Message message = Message.obtain(null, UPDATED_STATE_CALLBACK); message.obj = component; try { messenger.send(message); @@ -152,10 +166,26 @@ public class SameService extends Service { } }; + private void operationStatusCallback(DelayedOperation op, int id, Messenger replyTo) { + op.waitFor(); + synchronized (stateReceivers) { + Message message = Message.obtain(null, + OPERATION_STATUS_CALLBACK, id); + message.obj = op.getStatus(); + try { + messenger.send(message); + } catch (RemoteException e) { + logger.warn("Unable to send update result: " + + op.getStatus()); + e.printStackTrace(); + } + } + } + private void sendAllState(Messenger messenger) { State state = sameController.getClient().getInterface().getState(); for (Component c : state.getComponents()) { - Message message = Message.obtain(null, UPDATED_STATE_MESSAGE); + Message message = Message.obtain(null, UPDATED_STATE_CALLBACK); message.obj = c; try { messenger.send(message); -- cgit v1.2.3