summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrzej J. R. Hunt <andrzej@ahunt.org>2012-07-20 12:02:54 +0200
committerMichael Meeks <michael.meeks@suse.com>2012-08-06 10:22:59 +0100
commit0aa7aa85a4cb0b0608afea6c69f61ed8426c8185 (patch)
tree48b7fc76bb69484d35297cc643470174093cb490
parent597924e78a7c34ed74aa642aafe9f3504a4c335d (diff)
Fixed a further bug in the Listener cycle. Refactored image storage.
Change-Id: I2b3f9e2c46dafde4bd488bc95675c04e8806c9a4
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/TestClient.java28
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java7
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java18
-rw-r--r--sd/source/ui/inc/Server.hxx2
-rw-r--r--sd/source/ui/remotecontrol/Listener.cxx19
-rw-r--r--sd/source/ui/remotecontrol/Listener.hxx2
-rw-r--r--sd/source/ui/remotecontrol/Server.cxx18
-rw-r--r--sd/source/ui/slideshow/slideshow.cxx2
-rw-r--r--sd/source/ui/slideshow/slideshowimpl.cxx4
9 files changed, 67 insertions, 33 deletions
diff --git a/android/sdremote/src/org/libreoffice/impressremote/TestClient.java b/android/sdremote/src/org/libreoffice/impressremote/TestClient.java
index 4d716adac2a9..627d885b4b76 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/TestClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/TestClient.java
@@ -1,7 +1,5 @@
package org.libreoffice.impressremote;
-import java.util.HashMap;
-
import org.libreoffice.impressremote.communication.CommunicationService;
import android.app.Activity;
import android.content.ComponentName;
@@ -23,11 +21,12 @@ import android.widget.TextView;
public class TestClient extends Activity {
- private HashMap<Integer, Bitmap> mPreviewImages = new HashMap<Integer, Bitmap>();
private boolean mCurrentPreviewImageMissing = false;
private boolean mIsBound = false;
+ private int mCurrentSlide = 0;
+
private CommunicationService mCommunicationService;
final Messenger mMessenger = new Messenger(new MessageHandler());
@@ -141,22 +140,17 @@ public class TestClient extends Activity {
case CommunicationService.MSG_SLIDE_CHANGED:
int newSlide = aData.getInt("slide_number");
mSlideLabel.setText("Slide " + newSlide);
- if (mPreviewImages.containsKey(newSlide)) {
- mImageView.setImageBitmap(mPreviewImages.get(newSlide));
- mCurrentPreviewImageMissing = false;
- } else {
- mCurrentPreviewImageMissing = true;
- }
- break;
+ mCurrentPreviewImageMissing = true;
+ // We continue on to try and update the image.
case CommunicationService.MSG_SLIDE_PREVIEW:
int aSlideNumber = aData.getInt("slide_number");
- byte[] aPreviewImage = aData.getByteArray("preview_image");
- Bitmap aBitmap = BitmapFactory.decodeByteArray(aPreviewImage,
- 0, aPreviewImage.length);
- mPreviewImages.put(aSlideNumber, aBitmap);
- if (mCurrentPreviewImageMissing) {
- mImageView.setImageBitmap(aBitmap);
- mCurrentPreviewImageMissing = false;
+ if ( mCurrentPreviewImageMissing ) {
+ Bitmap aImage = mCommunicationService
+ .getPreviewImage(aSlideNumber);
+ if (aImage != null) {
+ mImageView.setImageBitmap(aImage);
+ mCurrentPreviewImageMissing = false;
+ }
}
break;
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
index eec69fc38ec1..ab2794ad5564 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
@@ -2,6 +2,8 @@ package org.libreoffice.impressremote.communication;
import android.app.Service;
import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.Binder;
import android.os.IBinder;
import android.os.Messenger;
@@ -72,4 +74,9 @@ public class CommunicationService extends Service {
mClient.closeConnection();
}
+ public Bitmap getPreviewImage(int aSlide) {
+ return mReceiver.getPreviewImage(aSlide);
+ }
+
+
}
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java
index 8418cab550b5..05d26e0ac883 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java
@@ -10,22 +10,32 @@ package org.libreoffice.impressremote.communication;
import java.util.ArrayList;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Base64;
+import android.util.SparseArray;
public class Receiver {
private Messenger mActivityMessenger;
+ private SparseArray<byte[]> mPreviewImages = new SparseArray<byte[]>();
+
public void setActivityMessenger(Messenger aActivityMessenger) {
mActivityMessenger = aActivityMessenger;
}
+ public Bitmap getPreviewImage(int aSlide) {
+ byte[] aImage = mPreviewImages.get(aSlide);
+ return BitmapFactory.decodeByteArray(aImage, 0, aImage.length);
+ }
+
public void parseCommand(ArrayList<String> aCommand) {
- System.out.println("parsing " +aCommand.get(0));
+ System.out.println("parsing " + aCommand.get(0));
if (mActivityMessenger == null) {
return;
}
@@ -46,11 +56,15 @@ public class Receiver {
int aSlideNumber = Integer.parseInt(aCommand.get(1));
String aImageString = aCommand.get(2);
byte[] aImage = Base64.decode(aImageString, Base64.DEFAULT);
+
+ // Store image internally
+ mPreviewImages.put(aSlideNumber, aImage);
+
+ // Notify the frontend
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);
diff --git a/sd/source/ui/inc/Server.hxx b/sd/source/ui/inc/Server.hxx
index 065b1cdbc67b..f3595ad227f8 100644
--- a/sd/source/ui/inc/Server.hxx
+++ b/sd/source/ui/inc/Server.hxx
@@ -43,6 +43,7 @@ namespace sd
static void setup();
static void presentationStarted( const css::uno::Reference<
css::presentation::XSlideShowController > &rController );
+ static void presentationStopped();
void informListenerDestroyed();
private:
Server();
@@ -54,7 +55,6 @@ namespace sd
void execute();
static Transmitter *pTransmitter;
static rtl::Reference<Listener> mListener;
- static rtl::Reference<ImagePreparer> mPreparer;
};
}
diff --git a/sd/source/ui/remotecontrol/Listener.cxx b/sd/source/ui/remotecontrol/Listener.cxx
index 9607707b98df..1f55710fe41d 100644
--- a/sd/source/ui/remotecontrol/Listener.cxx
+++ b/sd/source/ui/remotecontrol/Listener.cxx
@@ -25,22 +25,31 @@ using rtl::OStringBuffer;
Listener::Listener( const ::rtl::Reference<Server>& rServer, sd::Transmitter *aTransmitter )
: ::cppu::WeakComponentImplHelper1< XSlideShowListener >( m_aMutex ),
mServer( rServer ),
- pTransmitter( NULL )
+ pTransmitter( NULL ),
+ mPreparer()
{
pTransmitter = aTransmitter;
+ fprintf( stderr, "Listener created %p\n", this );
}
Listener::~Listener()
{
+ fprintf( stderr, "Listener destroyed %p\n", this );
}
void Listener::init( const css::uno::Reference< css::presentation::XSlideShowController >& aController)
{
+ fprintf( stderr, "Initing\n" );
if ( aController.is() )
{
+ fprintf( stderr, "Is -- now copying refrerence.\n" );
mController = css::uno::Reference< css::presentation::XSlideShowController >( aController );
+ fprintf( stderr, "Registering listener\n" );
aController->addSlideShowListener( this );
fprintf( stderr, "Registered listener.\n" );
+
+ mPreparer.set( new ImagePreparer( aController, pTransmitter, mPreparer ) );
+ mPreparer->launch();
}
else
{
@@ -123,6 +132,13 @@ void SAL_CALL Listener::slideAnimationsEnded (void)
void SAL_CALL Listener::disposing (void)
{
+ fprintf( stderr, "disposing void\n" );
+ if ( mPreparer.is() )
+ {
+ delete mPreparer.get();
+ mPreparer = NULL;
+ }
+
pTransmitter = NULL;
if ( mController.is() )
{
@@ -136,6 +152,7 @@ void SAL_CALL Listener::disposing (
const css::lang::EventObject& rEvent)
throw (::com::sun::star::uno::RuntimeException)
{
+ fprintf( stderr, "disposing with Events\n" );
(void) rEvent;
dispose();
}
diff --git a/sd/source/ui/remotecontrol/Listener.hxx b/sd/source/ui/remotecontrol/Listener.hxx
index 09c04ea8a0b1..92a0b93ff7ea 100644
--- a/sd/source/ui/remotecontrol/Listener.hxx
+++ b/sd/source/ui/remotecontrol/Listener.hxx
@@ -21,6 +21,7 @@
#include "Server.hxx"
#include "Transmitter.hxx"
+#include "ImagePreparer.hxx"
namespace css = ::com::sun::star;
@@ -63,6 +64,7 @@ private:
rtl::Reference<Server> mServer;
sd::Transmitter *pTransmitter;
css::uno::Reference< css::presentation::XSlideShowController > mController;
+ rtl::Reference<sd::ImagePreparer> mPreparer;
};
}
#endif // _SD_IMPRESSREMOTE_LISTENER_HXX
diff --git a/sd/source/ui/remotecontrol/Server.cxx b/sd/source/ui/remotecontrol/Server.cxx
index ab6a212d56f4..0329e27ffb1f 100644
--- a/sd/source/ui/remotecontrol/Server.cxx
+++ b/sd/source/ui/remotecontrol/Server.cxx
@@ -93,13 +93,10 @@ void Server::listenThread()
}
}
// TODO: deal with transmision errors gracefully.
+ fprintf( stderr, "done with transmitting\n" );
mListener->disposing();
mListener = NULL;
- if ( mPreparer.is() )
- delete mPreparer.get();
- mPreparer = NULL;
-
delete pTransmitter;
pTransmitter = NULL;
fprintf( stderr, "Finished listening\n" );
@@ -140,18 +137,21 @@ void Server::presentationStarted( const css::uno::Reference<
{
mListener = rtl::Reference<Listener>( new Listener( spServer, pTransmitter ) );
mListener->init( rController );
-
- mPreparer = rtl::Reference<ImagePreparer>( new ImagePreparer( rController, pTransmitter ) );
- mPreparer->launch();
}
}
-
+void Server::presentationStopped()
+{
+ if ( mListener.is() )
+ {
+ mListener->disposing();
+ mListener = NULL;
+ }
+}
Server *sd::Server::spServer = NULL;
Transmitter *sd::Server::pTransmitter = NULL;
rtl::Reference<Listener> sd::Server::mListener = NULL;
-rtl::Reference<ImagePreparer> sd::Server::mPreparer = NULL;
void Server::setup()
{
diff --git a/sd/source/ui/slideshow/slideshow.cxx b/sd/source/ui/slideshow/slideshow.cxx
index 9551137519f7..c2fa430a672c 100644
--- a/sd/source/ui/slideshow/slideshow.cxx
+++ b/sd/source/ui/slideshow/slideshow.cxx
@@ -58,7 +58,6 @@
#include "sdattr.hrc"
#include "FactoryIds.hxx"
#include "ViewShell.hxx"
-#include "Server.hxx"
#include "SlideShowRestarter.hxx"
#include "DrawController.hxx"
#include <boost/bind.hpp>
@@ -1074,7 +1073,6 @@ void SlideShow::activate( ViewShellBase& rBase )
if( mxController.is() )
mxController->activate();
- Server::presentationStarted( mxController.get() );
}
// ---------------------------------------------------------
diff --git a/sd/source/ui/slideshow/slideshowimpl.cxx b/sd/source/ui/slideshow/slideshowimpl.cxx
index 1ae0ee6f5950..d904b41374d0 100644
--- a/sd/source/ui/slideshow/slideshowimpl.cxx
+++ b/sd/source/ui/slideshow/slideshowimpl.cxx
@@ -79,7 +79,7 @@
#include "canvas/elapsedtime.hxx"
#include "avmedia/mediawindow.hxx"
#include "svtools/colrdlg.hxx"
-
+#include "Server.hxx"
#include <boost/bind.hpp>
using ::rtl::OUString;
@@ -609,6 +609,7 @@ SlideshowImpl::~SlideshowImpl()
void SAL_CALL SlideshowImpl::disposing()
{
+ Server::presentationStopped();
if( mxShow.is() && mpDoc )
NotifyDocumentEvent( mpDoc, "OnEndPresentation" );
@@ -1508,6 +1509,7 @@ void SAL_CALL SlideshowImpl::resume() throw (RuntimeException)
comphelper::anyToString( cppu::getCaughtException() ),
RTL_TEXTENCODING_UTF8 )).getStr() );
}
+ Server::presentationStarted( this );
}
// ---------------------------------------------------------