From 6a030381607aaf7b44529c4d5a6552749305c3d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Tue, 28 Feb 2012 11:57:48 +0100 Subject: Run SameService in a separate process. --- same-android/AndroidManifest.xml | 2 +- .../src/main/java/com/orbekk/same/SameService.java | 26 ++++++++++++++-------- .../java/com/orbekk/same/VariableTestActivity.java | 26 +++++++++++++++------- .../orbekk/same/android/ClientInterfaceBridge.java | 17 ++++++++------ same/src/main/java/com/orbekk/same/Client.java | 4 +++- .../java/com/orbekk/util/DelayedOperation.java | 12 ++++++++++ 6 files changed, 61 insertions(+), 26 deletions(-) diff --git a/same-android/AndroidManifest.xml b/same-android/AndroidManifest.xml index dcd28b2..6331a1c 100644 --- a/same-android/AndroidManifest.xml +++ b/same-android/AndroidManifest.xml @@ -23,7 +23,7 @@ - + \ No newline at end of file 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 3a487d0..b7ba0ca 100644 --- a/same-android/src/main/java/com/orbekk/same/SameService.java +++ b/same-android/src/main/java/com/orbekk/same/SameService.java @@ -17,6 +17,7 @@ import android.os.RemoteException; import android.widget.Toast; import com.orbekk.same.State.Component; +import com.orbekk.same.android.ComponentBundle; import com.orbekk.same.android.net.AndroidBroadcasterFactory; import com.orbekk.same.android.net.Broadcaster; import com.orbekk.same.config.Configuration; @@ -32,14 +33,19 @@ public class SameService extends Service { /** * arg1: Operation number. - * obj: Updated component. + * bundle: A Bundle created with ComponentBundle */ public final static int SET_STATE = 7; + + /** + * bundle: A Bundle created with ComponentBundle. + */ public final static int UPDATED_STATE_CALLBACK = 8; /** * arg1: Operation number. - * obj: Operation status. + * arg2: Status code. + * obj: Status message. */ public final static int OPERATION_STATUS_CALLBACK = 9; @@ -127,9 +133,9 @@ public class SameService extends Service { case SET_STATE: logger.info("SET_STATE: oId: {}, comp: {}", message.arg1, message.obj); State.Component updatedComponent = - (State.Component)message.obj; + new ComponentBundle(message.getData()).getComponent(); int id = message.arg1; - logger.info("Running operation."); + logger.info("Running operation. Component: " + updatedComponent); DelayedOperation op = sameController.getClient().getInterface() .set(updatedComponent); logger.info("Operation finished. Sending callback."); @@ -152,7 +158,7 @@ public class SameService extends Service { ArrayList dropped = new ArrayList(); for (Messenger messenger : stateReceivers) { Message message = Message.obtain(null, UPDATED_STATE_CALLBACK); - message.obj = component; + message.setData(new ComponentBundle(component).getBundle()); try { messenger.send(message); } catch (RemoteException e) { @@ -170,8 +176,10 @@ public class SameService extends Service { op.waitFor(); synchronized (stateReceivers) { Message message = Message.obtain(null, - OPERATION_STATUS_CALLBACK, id); - message.obj = op.getStatus(); + OPERATION_STATUS_CALLBACK); + message.arg1 = id; + message.arg2 = op.getStatus().getStatusCode(); + message.obj = op.getStatus().getMessage(); try { messenger.send(message); } catch (RemoteException e) { @@ -186,7 +194,7 @@ public class SameService extends Service { State state = sameController.getClient().getInterface().getState(); for (Component c : state.getComponents()) { Message message = Message.obtain(null, UPDATED_STATE_CALLBACK); - message.obj = c; + message.setData(new ComponentBundle(c).getBundle()); try { messenger.send(message); } catch (RemoteException e) { @@ -232,7 +240,7 @@ public class SameService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { logger.info("onStartCommand()"); - return START_STICKY; + return START_NOT_STICKY; } @Override diff --git a/same-android/src/main/java/com/orbekk/same/VariableTestActivity.java b/same-android/src/main/java/com/orbekk/same/VariableTestActivity.java index 1fffbad..3ae1a87 100644 --- a/same-android/src/main/java/com/orbekk/same/VariableTestActivity.java +++ b/same-android/src/main/java/com/orbekk/same/VariableTestActivity.java @@ -4,6 +4,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import android.app.Activity; +import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.EditText; @@ -27,6 +28,22 @@ public class VariableTestActivity extends Activity { } }; + private class UpdateVariableTask + extends AsyncTask { + @Override protected DelayedOperation.Status doInBackground(String... values) { + String value = values[0]; + return variable.set(value).getStatus(); + } + + @Override protected void onPostExecute(DelayedOperation.Status status) { + if (!status.isOk()) { + Toast.makeText(VariableTestActivity.this, + "Update failed: " + status, Toast.LENGTH_SHORT) + .show(); + } + } + } + private void displayVariable() { TextView tv = (TextView)findViewById(R.id.variable_text); if (variable.get() != null) { @@ -37,14 +54,7 @@ public class VariableTestActivity extends Activity { public void setVariable(View unused) { EditText et = (EditText)findViewById(R.id.set_variable_text); String newValue = et.getText().toString(); - logger.info("Setting variable."); - DelayedOperation op = variable.set(newValue); - logger.info("Waiting for delayed operation."); - if (!op.getStatus().isOk()) { - Toast.makeText(this, "Failed to update: " + op.getStatus(), - Toast.LENGTH_SHORT) - .show(); - } + new UpdateVariableTask().execute(newValue); } @Override public void onCreate(Bundle savedInstanceState) { 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 3b490bc..dfab773 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,13 +42,17 @@ public class ClientInterfaceBridge implements ClientInterface { } switch (message.what) { case SameService.UPDATED_STATE_CALLBACK: - State.Component component = (State.Component)message.obj; + State.Component component = + new ComponentBundle(message.getData()).getComponent(); updateState(component); break; case SameService.OPERATION_STATUS_CALLBACK: int operationNumber = message.arg1; + logger.info("Received callback for operation {}", operationNumber); + int statusCode = message.getData().getInt("statusCode"); + String statusMessage = message.getData().getString("statusMessage"); DelayedOperation.Status status = - (DelayedOperation.Status)message.obj; + new DelayedOperation.Status(statusCode, statusMessage); completeOperation(operationNumber, status); break; default: @@ -153,13 +157,12 @@ public class ClientInterfaceBridge implements ClientInterface { return op; } - Message message = Message.obtain(null, SameService.SET_STATE, - op.getIdentifier()); - // this has to be Parcelable. -// message.obj = component; + Message message = Message.obtain(null, SameService.SET_STATE); + message.arg1 = op.getIdentifier(); + message.setData(new ComponentBundle(component).getBundle()); message.replyTo = responseMessenger; try { - logger.info("Sending update to service."); + logger.info("Sending update to service. No state."); serviceMessenger.send(message); logger.info("Service finished update."); } catch (RemoteException e) { diff --git a/same/src/main/java/com/orbekk/same/Client.java b/same/src/main/java/com/orbekk/same/Client.java index b18f523..d035881 100644 --- a/same/src/main/java/com/orbekk/same/Client.java +++ b/same/src/main/java/com/orbekk/same/Client.java @@ -44,7 +44,9 @@ public class Client implements DiscoveryListener { boolean success = master.updateStateRequest( component.getName(), component.getData(), component.getRevision()); - if (!success) { + if (success) { + op.complete(DelayedOperation.Status.createOk()); + } else { op.complete(DelayedOperation.Status .createConflict("Conflict from master")); } diff --git a/same/src/main/java/com/orbekk/util/DelayedOperation.java b/same/src/main/java/com/orbekk/util/DelayedOperation.java index 21215e7..c423a7d 100644 --- a/same/src/main/java/com/orbekk/util/DelayedOperation.java +++ b/same/src/main/java/com/orbekk/util/DelayedOperation.java @@ -26,6 +26,18 @@ public class DelayedOperation { this.message = message; } + public boolean isOk() { + return status == OK; + } + + public int getStatusCode() { + return status; + } + + public String getMessage() { + return message; + } + @Override public String toString() { switch(status) { case OK: -- cgit v1.2.3