summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Ørbekk <kjetil.orbekk@gmail.com>2012-05-02 12:55:16 +0200
committerKjetil Ørbekk <kjetil.orbekk@gmail.com>2012-05-02 12:55:16 +0200
commit4bc0de6fd0c9dc1562ff91d1c21ed6e0d3731299 (patch)
tree4c59d75ab5685c94f96cfd166c2e875f680e1461
parent445a738b9ebfd93f65fecd68a5fbbe61b7951bf8 (diff)
Fix callback functionality in SameService.
Several bugs were fixed. - SameService sends messages to the correct replyTo handler. - SameService and ClientInterfaceBridge now agree on a message format. - Make ClientInterfaceBridge a little safer by using volatile and final variables.
-rw-r--r--same-android/src/main/java/com/orbekk/same/android/ClientInterfaceBridge.java15
-rw-r--r--same-android/src/main/java/com/orbekk/same/android/SameService.java9
2 files changed, 11 insertions, 13 deletions
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 892e9a5..6ae979c 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
@@ -42,16 +42,17 @@ import com.orbekk.util.DelayedOperation;
public class ClientInterfaceBridge implements ClientInterface {
private State state;
- private ArrayList<StateChangedListener> listeners =
+ private final ArrayList<StateChangedListener> listeners =
new ArrayList<StateChangedListener>();
- private Map<Integer, DelayedOperation> ongoingOperations =
+ private final Map<Integer, DelayedOperation> ongoingOperations =
new HashMap<Integer, DelayedOperation>();
/** This is used to queue operations until connected to the service. */
- private ArrayList<Message> pendingOperations = new ArrayList<Message>();
- private int nextOperationNumber = 0;
+ private final ArrayList<Message> pendingOperations = new ArrayList<Message>();
+ private volatile int nextOperationNumber = 0;
class ResponseHandler extends Handler {
@Override public synchronized void handleMessage(Message message) {
+ logger.info("ResponseHandler: Got here. Message: {}", message);
if (serviceMessenger == null) {
logger.warn("Ignoring message to disabled ResponseHandler.");
return;
@@ -79,9 +80,9 @@ public class ClientInterfaceBridge implements ClientInterface {
}
private Logger logger = LoggerFactory.getLogger(getClass());
- private Messenger serviceMessenger = null;
- private Messenger responseMessenger = new Messenger(new ResponseHandler());
- private Context context;
+ private volatile Messenger serviceMessenger = null;
+ private volatile Messenger responseMessenger = new Messenger(new ResponseHandler());
+ private volatile Context context;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
diff --git a/same-android/src/main/java/com/orbekk/same/android/SameService.java b/same-android/src/main/java/com/orbekk/same/android/SameService.java
index 18c13af..f369b3a 100644
--- a/same-android/src/main/java/com/orbekk/same/android/SameService.java
+++ b/same-android/src/main/java/com/orbekk/same/android/SameService.java
@@ -147,12 +147,9 @@ public class SameService extends Service {
State.Component updatedComponent =
new ComponentBundle(message.getData()).getComponent();
int id = message.arg1;
- logger.info("Running operation. Component: " + updatedComponent);
DelayedOperation op = sameController.getClient().getInterface()
.set(updatedComponent);
- logger.info("Operation finished. Sending callback.");
operationStatusCallback(op, id, message.replyTo);
- logger.info("Callback sent.");
break;
case KILL_MASTER:
logger.info("Kill master.");
@@ -193,10 +190,10 @@ public class SameService extends Service {
Message message = Message.obtain(null,
OPERATION_STATUS_CALLBACK);
message.arg1 = id;
- message.arg2 = op.getStatus().getStatusCode();
- message.obj = op.getStatus().getMessage();
+ message.getData().putInt("statusCode", op.getStatus().getStatusCode());
+ message.getData().putString("statusMessage", op.getStatus().getMessage());
try {
- messenger.send(message);
+ replyTo.send(message);
} catch (RemoteException e) {
logger.warn("Unable to send update result: " +
op.getStatus());