summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Ørbekk <kjetil.orbekk@gmail.com>2012-02-26 22:44:45 +0100
committerKjetil Ørbekk <kjetil.orbekk@gmail.com>2012-02-26 22:44:45 +0100
commita13c54e093811a5a25cd456e2e68c70c2e39ef51 (patch)
treeac1dd0d3e8f2d14ad3458c0055e383a069dbe1b3
parent8672b318c3dc8b7e0cac47014e5bbb3527d0db87 (diff)
Add Variable.waitForChange() with lots of bugs.wait_code__bad
-rw-r--r--same-android/src/main/java/com/orbekk/same/GameView.java4
-rw-r--r--same-android/src/main/java/com/orbekk/same/android/ClientInterfaceBridge.java4
-rw-r--r--same/src/main/java/com/orbekk/same/Variable.java2
-rw-r--r--same/src/main/java/com/orbekk/same/VariableFactory.java28
4 files changed, 33 insertions, 5 deletions
diff --git a/same-android/src/main/java/com/orbekk/same/GameView.java b/same-android/src/main/java/com/orbekk/same/GameView.java
index 527d3da..43cda27 100644
--- a/same-android/src/main/java/com/orbekk/same/GameView.java
+++ b/same-android/src/main/java/com/orbekk/same/GameView.java
@@ -92,7 +92,9 @@ public class GameView extends SurfaceView implements SurfaceHolder.Callback {
newPlayer.posX = x / width;
newPlayer.posY = y / width;
try {
- player.set(newPlayer);
+ if (!player.waitingForUpdate()) {
+ player.set(newPlayer);
+ }
} catch (UpdateConflict e) {
Toast.makeText(context, "Failed to update position.",
Toast.LENGTH_SHORT).show();
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..aa4b0b6 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
@@ -88,7 +88,7 @@ public class ClientInterfaceBridge implements ClientInterface {
Intent intent = new Intent(context, SameService.class);
context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}
-
+
private void disconnectFromService() {
Message message = Message.obtain(null, SameService.REMOVE_STATE_RECEIVER);
message.obj = responseMessenger;
@@ -123,7 +123,7 @@ public class ClientInterfaceBridge implements ClientInterface {
message.obj = component;
if (serviceMessenger == null) {
logger.warn("Not connected to service. Ignore update: {}", component);
- return;
+ throw new UpdateConflict("Not connected to Android Service.");
}
try {
serviceMessenger.send(message);
diff --git a/same/src/main/java/com/orbekk/same/Variable.java b/same/src/main/java/com/orbekk/same/Variable.java
index b6d3b7f..f305f4b 100644
--- a/same/src/main/java/com/orbekk/same/Variable.java
+++ b/same/src/main/java/com/orbekk/same/Variable.java
@@ -13,5 +13,7 @@ public interface Variable<T> {
T get();
void set(T value) throws UpdateConflict;
void update();
+ void waitForChange();
+ boolean waitingForUpdate();
void setOnChangeListener(OnChangeListener<T> listener);
}
diff --git a/same/src/main/java/com/orbekk/same/VariableFactory.java b/same/src/main/java/com/orbekk/same/VariableFactory.java
index 8c786c0..3d80e28 100644
--- a/same/src/main/java/com/orbekk/same/VariableFactory.java
+++ b/same/src/main/java/com/orbekk/same/VariableFactory.java
@@ -25,6 +25,7 @@ public class VariableFactory {
T value;
long revision = 0;
OnChangeListener<T> listener = null;
+ boolean waitingForUpdate;
public VariableImpl(String identifier, TypeReference<T> type) {
this.identifier = identifier;
@@ -37,21 +38,25 @@ public class VariableFactory {
}
@Override
- public void set(T value) throws UpdateConflict {
+ public synchronized void set(T value) throws UpdateConflict {
try {
String serializedValue = mapper.writeValueAsString(value);
client.set(identifier, serializedValue, revision);
+ waitingForUpdate = true;
} catch (JsonGenerationException e) {
logger.warn("Failed to convert to JSON: {}", value);
logger.warn("Parse exception.", e);
+ waitingForUpdate = false;
throw new RuntimeException(e);
} catch (JsonMappingException e) {
logger.warn("Failed to convert to JSON: {}", value);
logger.warn("Parse exception.", e);
+ waitingForUpdate = false;
throw new RuntimeException(e);
} catch (IOException e) {
logger.warn("Failed to cornvert to JSON: {}", value);
logger.warn("Parse exception.", e);
+ waitingForUpdate = false;
throw new RuntimeException(e);
}
}
@@ -68,11 +73,30 @@ public class VariableFactory {
}
@Override
- public void stateChanged(Component component) {
+ public synchronized void waitForChange() {
+ while (waitingForUpdate) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ waitingForUpdate = false;
+ return;
+ }
+ }
+ }
+
+ @Override
+ public synchronized boolean waitingForUpdate() {
+ return waitingForUpdate;
+ }
+
+ @Override
+ public synchronized void stateChanged(Component component) {
if (component.getName().equals(identifier)) {
if (listener != null) {
listener.valueChanged(this);
}
+ waitingForUpdate = false;
+ notifyAll();
}
}
}