[Libreoffice-commits] .: Branch 'feature/remote' - android/sdremote
Andrzej J.R. Hunt
ajrhunt at kemper.freedesktop.org
Tue Jul 10 11:25:36 PDT 2012
android/sdremote/AndroidManifest.xml | 1
android/sdremote/res/layout/testlayout.xml | 5
android/sdremote/src/org/libreoffice/impressremote/TestClient.java | 61 +++++++-
android/sdremote/src/org/libreoffice/impressremote/communication/Client.java | 16 +-
android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java | 15 +-
android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java | 25 ++-
android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java | 73 ++++++++++
android/sdremote/src/org/libreoffice/impressremote/communication/Transmitter.java | 1
8 files changed, 175 insertions(+), 22 deletions(-)
New commits:
commit 135f1e6a9c75412bab66d0071fe59aa07efd7e31
Author: Andrzej J. R. Hunt <andrzej at ahunt.org>
Date: Tue Jul 10 19:16:02 2012 +0100
Preview image and slide number receiving code added to Android client.
Change-Id: I40617d0523eaf7b9431694a0a4cd6d31ad92765e
diff --git a/android/sdremote/AndroidManifest.xml b/android/sdremote/AndroidManifest.xml
index e1c76d7..82cb1be 100644
--- a/android/sdremote/AndroidManifest.xml
+++ b/android/sdremote/AndroidManifest.xml
@@ -5,6 +5,7 @@
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
<application
android:icon="@drawable/ic_launcher"
diff --git a/android/sdremote/res/layout/testlayout.xml b/android/sdremote/res/layout/testlayout.xml
index 2e32325..8e7a4f1 100644
--- a/android/sdremote/res/layout/testlayout.xml
+++ b/android/sdremote/res/layout/testlayout.xml
@@ -25,4 +25,9 @@
android:layout_gravity="center_horizontal"
android:text="Previous" />
+ <ImageView
+ android:id="@+id/image_preview"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
</LinearLayout>
\ No newline at end of file
diff --git a/android/sdremote/src/org/libreoffice/impressremote/TestClient.java b/android/sdremote/src/org/libreoffice/impressremote/TestClient.java
index b3bd3b5..e275efb 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/TestClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/TestClient.java
@@ -1,18 +1,23 @@
package org.libreoffice.impressremote;
import org.libreoffice.impressremote.communication.CommunicationService;
-import org.libreoffice.impressremote.communication.Transmitter;
-
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
public class TestClient extends Activity {
@@ -20,27 +25,45 @@ public class TestClient extends Activity {
private CommunicationService mCommunicationService;
+ final Messenger mMessenger = new Messenger(new MessageHandler());
+
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testlayout);
setupUI();
+
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
doBindService();
+ }
+ // FIXME: move all necessary code to CommunicationService.onUnbind
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ doUnbindService();
+ stopService(new Intent(this, CommunicationService.class));
}
private ServiceConnection mConnection = new ServiceConnection() {
+ @Override
public void onServiceConnected(ComponentName aClassName,
IBinder aService) {
mCommunicationService = ((CommunicationService.CBinder) aService)
.getService();
mCommunicationService.connectTo(
- CommunicationService.Protocol.NETWORK, "128.232.128.144");
-
+ CommunicationService.Protocol.NETWORK, "10.0.2.2");
+ mCommunicationService.setActivityMessenger(mMessenger);
enableButtons(true);
}
+ @Override
public void onServiceDisconnected(ComponentName aClassName) {
mCommunicationService = null;
enableButtons(false);
@@ -54,6 +77,7 @@ public class TestClient extends Activity {
}
void doUnbindService() {
+ mCommunicationService.setActivityMessenger(null);
if (mIsBound) {
unbindService(mConnection);
mIsBound = false;
@@ -64,9 +88,15 @@ public class TestClient extends Activity {
private Button mButtonPrevious;
+ private ImageView mImageView;
+
+ private TextView mSlideLabel;
+
private void setupUI() {
mButtonNext = (Button) findViewById(R.id.button_next);
mButtonPrevious = (Button) findViewById(R.id.button_previous);
+ mImageView = (ImageView) findViewById(R.id.image_preview);
+ mSlideLabel = (TextView) findViewById(R.id.label_curSlide);
enableButtons(false);
@@ -96,4 +126,27 @@ public class TestClient extends Activity {
mButtonNext.setEnabled(aEnabled);
mButtonPrevious.setEnabled(aEnabled);
}
+
+ class MessageHandler extends Handler {
+ @Override
+ public void handleMessage(Message aMessage) {
+ Bundle aData = aMessage.getData();
+ switch (aMessage.what) {
+ case CommunicationService.MSG_SLIDE_CHANGED:
+ int newSlide = aData.getInt("slide_number");
+ mSlideLabel.setText("Slide " + newSlide);
+ // TODO: set slide;
+ break;
+ case CommunicationService.MSG_SLIDE_PREVIEW:
+ int slideNumber = aData.getInt("slide_number");
+ byte[] aPreviewImage = aData.getByteArray("preview_image");
+ Bitmap aBitmap = BitmapFactory.decodeByteArray(aPreviewImage,
+ 0, aPreviewImage.length);
+ mImageView.setImageBitmap(aBitmap);
+ // TODO: update
+ break;
+
+ }
+ }
+ }
}
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
index 5596644..7014d78 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
@@ -1,10 +1,7 @@
package org.libreoffice.impressremote.communication;
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
@@ -19,15 +16,22 @@ import org.json.JSONObject;
* methods.
*
* @author Andrzej J.R. Hunt
- *
*/
public abstract class Client {
- private static final String CHARSET = "UTF-16";
+ private static final String CHARSET = "UTF-8";
protected InputStream mInputStream;
protected OutputStream mOutputStream;
+ public abstract void closeConnection();
+
+ private Receiver mReceiver;
+
+ public void setReceiver(Receiver aReceiver) {
+ aReceiver = mReceiver;
+ }
+
private void listen() {
ByteArrayBuffer aBuffer = new ByteArrayBuffer(10);
byte aTemp;
@@ -65,7 +69,7 @@ public abstract class Client {
throw new Error("Specified network encoding [" + CHARSET
+ " not available.");
}
- parseCommand(aCommandString);
+ mReceiver.parseCommand(aCommandString);
}
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
index 7a9db40..eec69fc 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
@@ -4,6 +4,7 @@ import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
+import android.os.Messenger;
public class CommunicationService extends Service {
@@ -22,10 +23,19 @@ public class CommunicationService extends Service {
NETWORK, BLUETOOTH
};
+ public static final int MSG_SLIDE_CHANGED = 1;
+ public static final int MSG_SLIDE_PREVIEW = 2;
+
private Transmitter mTransmitter;
private Client mClient;
+ private Receiver mReceiver = new Receiver();
+
+ public void setActivityMessenger(Messenger aActivityMessenger) {
+ mReceiver.setActivityMessenger(aActivityMessenger);
+ }
+
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
@@ -35,7 +45,6 @@ public class CommunicationService extends Service {
@Override
public void onCreate() {
// TODO Create a notification (if configured).
-
}
@Override
@@ -45,7 +54,6 @@ public class CommunicationService extends Service {
public Transmitter getTransmitter() {
return mTransmitter;
-
}
public void connectTo(Protocol aProtocol, String address) {
@@ -53,6 +61,7 @@ public class CommunicationService extends Service {
case NETWORK:
mClient = new NetworkClient(address);
mTransmitter = new Transmitter(mClient);
+ mClient.setReceiver(mReceiver);
break;
}
@@ -60,7 +69,7 @@ public class CommunicationService extends Service {
}
public void disconnect() {
-
+ mClient.closeConnection();
}
}
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
index 1da1941..b51711d 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
@@ -4,26 +4,25 @@ import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
-import android.content.Context;
-import android.content.ServiceConnection;
-
/**
* Standard Network client. Connects to a server using Sockets.
*
* @author Andrzej J.R. Hunt
- *
*/
public class NetworkClient extends Client {
private static final int PORT = 1599;
+ private Socket mSocket;
+
public NetworkClient(String ipAddress) {
- Socket aSocket;
+ System.out.println("Attempting to open port.");
try {
- aSocket = new Socket(ipAddress, PORT);
- mInputStream = aSocket.getInputStream();
- mOutputStream = aSocket.getOutputStream();
+ mSocket = new Socket(ipAddress, PORT);
+ System.out.println("We seem to have opened.");
+ mInputStream = mSocket.getInputStream();
+ mOutputStream = mSocket.getOutputStream();
} catch (UnknownHostException e) {
// TODO Tell the user we have a problem
e.printStackTrace();
@@ -34,4 +33,14 @@ public class NetworkClient extends Client {
}
+ @Override
+ public void closeConnection() {
+ try {
+ mSocket.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
}
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java
new file mode 100644
index 0000000..b6a3c97
--- /dev/null
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java
@@ -0,0 +1,73 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+package org.libreoffice.impressremote.communication;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.os.Bundle;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.util.Base64;
+
+public class Receiver {
+
+ private Messenger mActivityMessenger;
+
+ public void setActivityMessenger(Messenger aActivityMessenger) {
+ mActivityMessenger = aActivityMessenger;
+ }
+
+ public void parseCommand(String aJSONCommandString) {
+ if (mActivityMessenger == null) {
+ return;
+ }
+ try {
+ JSONObject aJSONCommand = new JSONObject(aJSONCommandString);
+ String aInstruction = aJSONCommand.getString("command");
+ if (aInstruction.equals("slide_updated")) {
+ int aSlideNumber = aJSONCommand.getInt("slide_number");
+ Message aMessage = Message.obtain(null,
+ CommunicationService.MSG_SLIDE_CHANGED);
+ Bundle aData = new Bundle();
+ aData.putInt("slide_number", aSlideNumber);
+ aMessage.setData(aData);
+ try {
+ mActivityMessenger.send(aMessage);
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ } else if (aInstruction.equals("slide_preview")) {
+ int aSlideNumber = aJSONCommand.getInt("slide_number");
+ String aImageString = aJSONCommand.getString("image");
+ byte[] aImage = Base64.decode(aImageString, Base64.DEFAULT);
+ Message aMessage = Message.obtain(null,
+ CommunicationService.MSG_SLIDE_PREVIEW);
+ Bundle aData = new Bundle();
+ aData.putInt("slide_number", aSlideNumber);
+ aData.putByteArray("preview_image", aImage);
+ aMessage.setData(aData);
+ try {
+ mActivityMessenger.send(aMessage);
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ } catch (JSONException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Transmitter.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Transmitter.java
index 0e2da45..2861498 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/Transmitter.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Transmitter.java
@@ -7,7 +7,6 @@ import org.json.JSONObject;
* Interface to send commands to the server.
*
* @author Andrzej J.R. Hunt
- *
*/
public class Transmitter {
More information about the Libreoffice-commits
mailing list