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 --- .../orbekk/same/android/ClientInterfaceBridge.java | 76 ++++++++++++++++------ 1 file changed, 57 insertions(+), 19 deletions(-) (limited to 'same-android/src/main/java/com/orbekk/same/android') diff --git a/same-android/src/main/java/com/orbekk/same/android/ClientInterfaceBridge.java b/same-android/src/main/java/com/orbekk/same/android/ClientInterfaceBridge.java index 4dde60c..3b490bc 100644 --- a/same-android/src/main/java/com/orbekk/same/android/ClientInterfaceBridge.java +++ b/same-android/src/main/java/com/orbekk/same/android/ClientInterfaceBridge.java @@ -1,6 +1,8 @@ package com.orbekk.same.android; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,11 +24,15 @@ import com.orbekk.same.State.Component; import com.orbekk.same.StateChangedListener; import com.orbekk.same.UpdateConflict; import com.orbekk.same.VariableFactory; +import com.orbekk.util.DelayedOperation; public class ClientInterfaceBridge implements ClientInterface { private State state; private ArrayList listeners = new ArrayList(); + private Map ongoingOperations = + new HashMap(); + private int nextOperationNumber = 0; class ResponseHandler extends Handler { @Override public void handleMessage(Message message) { @@ -35,10 +41,16 @@ public class ClientInterfaceBridge implements ClientInterface { return; } switch (message.what) { - case SameService.UPDATED_STATE_MESSAGE: + case SameService.UPDATED_STATE_CALLBACK: State.Component component = (State.Component)message.obj; updateState(component); break; + case SameService.OPERATION_STATUS_CALLBACK: + int operationNumber = message.arg1; + DelayedOperation.Status status = + (DelayedOperation.Status)message.obj; + completeOperation(operationNumber, status); + break; default: logger.warn("Received unknown message from service: {}", message); @@ -54,14 +66,16 @@ public class ClientInterfaceBridge implements ClientInterface { private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { - serviceMessenger = new Messenger(service); - Message message = Message.obtain(null, - SameService.ADD_STATE_RECEIVER); - message.replyTo = responseMessenger; - try { - serviceMessenger.send(message); - } catch (RemoteException e) { - e.printStackTrace(); + synchronized (ClientInterfaceBridge.this) { + serviceMessenger = new Messenger(service); + Message message = Message.obtain(null, + SameService.ADD_STATE_RECEIVER); + message.replyTo = responseMessenger; + try { + serviceMessenger.send(message); + } catch (RemoteException e) { + e.printStackTrace(); + } } } @@ -79,6 +93,22 @@ public class ClientInterfaceBridge implements ClientInterface { } } + private synchronized DelayedOperation createOperation() { + DelayedOperation op = new DelayedOperation(); + op.setIdentifier(nextOperationNumber); + nextOperationNumber += 1; + ongoingOperations.put(op.getIdentifier(), op); + return op; + } + + private synchronized void completeOperation(int operationNumber, + DelayedOperation.Status status) { + DelayedOperation op = ongoingOperations.remove(operationNumber); + if (op != null) { + op.complete(status); + } + } + public ClientInterfaceBridge(Context context) { this.context = context; } @@ -113,24 +143,32 @@ public class ClientInterfaceBridge implements ClientInterface { } @Override - public void set(String name, String data, long revision) throws UpdateConflict { - set(new Component(name, revision, data)); - } - - @Override - public void set(Component component) throws UpdateConflict { - Message message = Message.obtain(null, SameService.SET_STATE); - message.obj = component; + public DelayedOperation set(Component component) { + DelayedOperation op = createOperation(); if (serviceMessenger == null) { logger.warn("Not connected to service. Ignore update: {}", component); - return; + completeOperation(op.getIdentifier(), + DelayedOperation.Status.createError( + "Not connected to service.")); + return op; } + + Message message = Message.obtain(null, SameService.SET_STATE, + op.getIdentifier()); + // this has to be Parcelable. +// message.obj = component; + message.replyTo = responseMessenger; try { + logger.info("Sending update to service."); serviceMessenger.send(message); + logger.info("Service finished update."); } catch (RemoteException e) { e.printStackTrace(); - throw new UpdateConflict(e.getMessage()); + completeOperation(op.getIdentifier(), + DelayedOperation.Status.createError( + "Error contacting service: " + e.getMessage())); } + return op; } @Override -- cgit v1.2.3