From a13c54e093811a5a25cd456e2e68c70c2e39ef51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Sun, 26 Feb 2012 22:44:45 +0100 Subject: Add Variable.waitForChange() with lots of bugs. --- .../src/main/java/com/orbekk/same/GameView.java | 4 +++- .../orbekk/same/android/ClientInterfaceBridge.java | 4 ++-- same/src/main/java/com/orbekk/same/Variable.java | 2 ++ .../main/java/com/orbekk/same/VariableFactory.java | 28 ++++++++++++++++++++-- 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 get(); void set(T value) throws UpdateConflict; void update(); + void waitForChange(); + boolean waitingForUpdate(); void setOnChangeListener(OnChangeListener 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 listener = null; + boolean waitingForUpdate; public VariableImpl(String identifier, TypeReference 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(); } } } -- cgit v1.2.3