android/Bootstrap/src/org/libreoffice/kit/Document.java                        
       |    4 
 android/Bootstrap/src/org/libreoffice/kit/Office.java                          
       |    4 
 android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java          
       |   18 ++
 android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitShell.java       
       |    1 
 android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java      
       |   64 +++++-----
 
android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java 
      |   14 ++
 
android/experimental/LOAndroid3/src/java/org/libreoffice/LibreOfficeMainActivity.java
 |   19 +-
 android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java 
       |    4 
 android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java     
       |    2 
 desktop/source/lib/lokandroid.cxx                                              
       |   50 ++++++-
 10 files changed, 129 insertions(+), 51 deletions(-)

New commits:
commit 2897374fdad4fdb2daab273c2cf6f85e5ae49ec1
Author: Tomaž Vajngerl <tomaz.vajng...@collabora.com>
Date:   Mon Sep 22 22:37:11 2014 +0200

    android: cleanly load/close a document when activity starts/stops
    
    Change-Id: I2206a2b6818c030ba756f2b4d014a20d46f4106e

diff --git 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java
index 746ceb5..4aa32cb 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java
@@ -12,17 +12,24 @@ public class LOEvent {
     public static final int VIEWPORT = 3;
     public static final int DRAW = 4;
     public static final int CHANGE_PART = 5;
+    public static final int LOAD = 6;
+
     public int mType;
-    ViewportMetrics viewportMetrics;
     private ViewportMetrics mViewportMetrics;
     private String mTypeString;
     private int mPartIndex;
+    private String mFilename;
 
     public LOEvent(int type, int widthPixels, int heightPixels, int tileWidth, 
int tileHeight) {
         mType = type;
         mTypeString = "Size Changed: " + widthPixels + " " + heightPixels;
     }
 
+    public LOEvent(int type, String filename) {
+        mType = type;
+        mFilename = filename;
+    }
+
     public LOEvent(int type, IntSize tileSize) {
         mType = type;
         mTypeString = "Tile size";
@@ -65,6 +72,10 @@ public class LOEvent {
         return new LOEvent(CHANGE_PART, part);
     }
 
+    public static LOEvent load(String inputFile) {
+        return new LOEvent(LOAD, inputFile);
+    }
+
     public String getTypeString() {
         return mTypeString;
     }
@@ -76,4 +87,9 @@ public class LOEvent {
     public int getPartIndex() {
         return mPartIndex;
     }
+
+    public String getFilename() {
+        return mFilename;
+    }
+
 }
diff --git 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitShell.java 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitShell.java
index 0d44d66..fbf8675 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitShell.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitShell.java
@@ -38,4 +38,5 @@ public class LOKitShell {
     public static Handler getMainHandler() {
         return LibreOfficeMainActivity.mAppContext.mMainHandler;
     }
+
 }
diff --git 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
index bc08b98..25a1705 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
@@ -22,21 +22,19 @@ public class LOKitThread extends Thread {
     private LibreOfficeMainActivity mApplication;
     private TileProvider mTileProvider;
     private ViewportMetrics mViewportMetrics;
-    private String mInputFile;
     private Rect mOldRect;
     private boolean mCheckboardImageSet = false;
 
-    LOKitThread(String inputFile) {
-        mInputFile = inputFile;
+    public LOKitThread() {
     }
 
-    RectF normlizeRect(ImmutableViewportMetrics metrics) {
+    private RectF normlizeRect(ImmutableViewportMetrics metrics) {
         RectF rect = metrics.getViewport();
         float zoomFactor = metrics.zoomFactor;
         return new RectF(rect.left / zoomFactor, rect.top / zoomFactor, 
rect.right / zoomFactor, rect.bottom / zoomFactor);
     }
 
-    Rect roundToTileSize(RectF input, int tileSize) {
+    private Rect roundToTileSize(RectF input, int tileSize) {
         int minX = (Math.round(input.left)    / tileSize) * tileSize;
         int minY = (Math.round(input.top)     / tileSize) * tileSize;
         int maxX = ((Math.round(input.right)  / tileSize) + 1) * tileSize;
@@ -44,7 +42,7 @@ public class LOKitThread extends Thread {
         return new Rect(minX, minY, maxX, maxY);
     }
 
-    Rect inflate(Rect rect, int inflateSize) {
+    private Rect inflate(Rect rect, int inflateSize) {
         Rect newRect = new Rect(rect);
         newRect.left -= inflateSize;
         newRect.left = newRect.left < 0 ? 0 : newRect.left;
@@ -130,41 +128,49 @@ public class LOKitThread extends Thread {
         LOKitShell.sendEvent(LOEvent.draw(new Rect()));
     }
 
-    private boolean initialize() {
-        mApplication = LibreOfficeMainActivity.mAppContext;
-        mTileProvider = new 
LOKitTileProvider(mApplication.getLayerController(), mInputFile);
+    private boolean load(String filename) {
+        if (mApplication == null) {
+            mApplication = LibreOfficeMainActivity.mAppContext;
+        }
+        if (mTileProvider != null) {
+            mTileProvider.close();
+        }
+        mTileProvider = new 
LOKitTileProvider(mApplication.getLayerController(), filename);
         boolean isReady = mTileProvider.isReady();
-        if (isReady)
-        {
-            if (!mCheckboardImageSet) {
-                Log.i(LOGTAG, "Generate thumbnail!");
-                Bitmap bitmap = mTileProvider.thumbnail();
-                Log.i(LOGTAG, "Done generate thumbnail!");
-                if (bitmap != null) {
-                    Log.i(LOGTAG, "Setting checkboard image!");
-                    
mApplication.getLayerController().getView().changeCheckerboardBitmap(bitmap);
-                    Log.i(LOGTAG, "Done setting checkboard image!!");
-                    mCheckboardImageSet = true;
-                }
-            }
+        if (isReady) {
+            updateCheckbardImage();
         }
         return isReady;
     }
 
+    private void updateCheckbardImage() {
+        if (!mCheckboardImageSet) {
+            Log.i(LOGTAG, "Generate thumbnail!");
+            Bitmap bitmap = mTileProvider.thumbnail();
+            Log.i(LOGTAG, "Done generate thumbnail!");
+            if (bitmap != null) {
+                Log.i(LOGTAG, "Setting checkboard image!");
+                
mApplication.getLayerController().getView().changeCheckerboardBitmap(bitmap);
+                Log.i(LOGTAG, "Done setting checkboard image!!");
+                mCheckboardImageSet = true;
+            }
+        }
+    }
+
     public void run() {
-        if (initialize()) {
-            try {
-                boolean drawn = false;
-                while (true) {
-                    processEvent(mEventQueue.take());
-                }
-            } catch (InterruptedException ex) {
+        try {
+            while (true) {
+                processEvent(mEventQueue.take());
             }
+        } catch (InterruptedException ex) {
         }
     }
 
     private void processEvent(LOEvent event) throws InterruptedException {
         switch (event.mType) {
+            case LOEvent.LOAD:
+                load(event.getFilename());
+                break;
             case LOEvent.VIEWPORT:
                 mViewportMetrics = event.getViewport();
                 draw();
diff --git 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
index f13dd8a..8a07641 100644
--- 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
+++ 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
@@ -21,6 +21,7 @@ public class LOKitTileProvider implements TileProvider {
     private final LayerController mLayerController;
     private final double mTileWidth;
     private final double mTileHeight;
+    private final String mInputFile;
 
     private double mDPI;
     private double mWidthTwip;
@@ -37,6 +38,7 @@ public class LOKitTileProvider implements TileProvider {
 
         mOffice = new Office(LibreOfficeKit.getLibreOfficeKitHandle());
 
+        mInputFile = input;
         mDocument = mOffice.documentLoad(input);
 
         if (checkDocument()) {
@@ -110,7 +112,11 @@ public class LOKitTileProvider implements TileProvider {
         ByteBuffer buffer = ByteBuffer.allocateDirect(TILE_SIZE * TILE_SIZE * 
4);
         Bitmap bitmap = Bitmap.createBitmap(TILE_SIZE, TILE_SIZE, 
Bitmap.Config.ARGB_8888);
 
-        mDocument.paintTile(buffer, TILE_SIZE, TILE_SIZE, (int) pixelToTwip(x, 
mDPI), (int) pixelToTwip(y, mDPI), (int) mTileWidth, (int) mTileHeight);
+        if (mDocument != null) {
+            mDocument.paintTile(buffer, TILE_SIZE, TILE_SIZE, (int) 
pixelToTwip(x, mDPI), (int) pixelToTwip(y, mDPI), (int) mTileWidth, (int) 
mTileHeight);
+        } else {
+            Log.e(LOGTAG, "Document is null!!");
+        }
 
         bitmap.copyPixelsFromBuffer(buffer);
 
@@ -147,6 +153,12 @@ public class LOKitTileProvider implements TileProvider {
     }
 
     @Override
+    public void close() {
+        Log.i(LOGTAG, "Document destroyed: " + mInputFile);
+        mDocument.destroy();
+    }
+
+    @Override
     public void changePart(int partIndex) {
         mDocument.setPart(partIndex);
     }
diff --git 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/LibreOfficeMainActivity.java
 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/LibreOfficeMainActivity.java
index 3438e6a..9f9c7ac 100644
--- 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/LibreOfficeMainActivity.java
+++ 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/LibreOfficeMainActivity.java
@@ -116,22 +116,19 @@ public class LibreOfficeMainActivity extends Activity {
             mDrawerList.setOnItemClickListener(new 
DocumentPartClickListener());
         }
 
-        if (mLayerController == null) {
-            mLayerController = new LayerController(this);
-
-            Log.e(LOGTAG, "### Creating GeckoSoftwareLayerClient");
-            mLayerClient = new GeckoLayerClient(this);
-            Log.e(LOGTAG, "### Done creating GeckoSoftwareLayerClient");
-
-            mLayerController.setLayerClient(mLayerClient);
-            mGeckoLayout.addView(mLayerController.getView(), 0);
-        }
+        mLayerController = new LayerController(this);
+        mLayerClient = new GeckoLayerClient(this);
+        mLayerController.setLayerClient(mLayerClient);
+        mGeckoLayout.addView(mLayerController.getView(), 0);
 
         if (sLOKitThread == null) {
-            sLOKitThread = new LOKitThread(inputFile);
+            sLOKitThread = new LOKitThread();
             sLOKitThread.start();
         }
 
+        sLOKitThread.mEventQueue.clear();
+        LOKitShell.sendEvent(LOEvent.load(inputFile));
+
         Log.w(LOGTAG, "UI almost up");
     }
 
diff --git 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java
 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java
index 2a89e77..aa8957a 100644
--- 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java
+++ 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java
@@ -67,6 +67,10 @@ public class MockTileProvider implements TileProvider {
     }
 
     @Override
+    public void close() {
+    }
+
+    @Override
     public void changePart(int partIndex) {
 
     }
diff --git 
a/android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java 
b/android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java
index 4202d28..40fa512 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java
@@ -17,4 +17,6 @@ public interface TileProvider {
     void changePart(int partIndex);
 
     Bitmap thumbnail();
+
+    void close();
 }
commit 18c052d6d659001657ccf1ff0c7c7cff64658f44
Author: Tomaž Vajngerl <tomaz.vajng...@collabora.com>
Date:   Mon Sep 22 22:34:26 2014 +0200

    LOKit: add "destroy" and "saveAs" to android JNI
    
    Change-Id: I08542b736e49cb9262323e9fe6188b1976d47935

diff --git a/android/Bootstrap/src/org/libreoffice/kit/Document.java 
b/android/Bootstrap/src/org/libreoffice/kit/Document.java
index d0d30f1..d8d5286 100644
--- a/android/Bootstrap/src/org/libreoffice/kit/Document.java
+++ b/android/Bootstrap/src/org/libreoffice/kit/Document.java
@@ -24,6 +24,8 @@ public class Document {
         this.handle = handle;
     }
 
+    public native void destroy();
+
     public native int getPart();
 
     public native void setPart(int partIndex);
@@ -40,6 +42,8 @@ public class Document {
 
     private native int getDocumentTypeNative();
 
+    private native void saveAs(String url, String format, String options);
+
     private native void paintTileNative(ByteBuffer buffer, int canvasWidth, 
int canvasHeight, int tilePositionX, int tilePositionY, int tileWidth, int 
tileHeight);
 
     public int getDocumentType() {
diff --git a/android/Bootstrap/src/org/libreoffice/kit/Office.java 
b/android/Bootstrap/src/org/libreoffice/kit/Office.java
index a680735..d603066 100644
--- a/android/Bootstrap/src/org/libreoffice/kit/Office.java
+++ b/android/Bootstrap/src/org/libreoffice/kit/Office.java
@@ -9,8 +9,6 @@
 
 package org.libreoffice.kit;
 
-import android.util.Log;
-
 public class Office {
 
     private long handle;
@@ -31,4 +29,6 @@ public class Office {
         }
         return document;
     }
+
+    public native void destroy();
 }
diff --git a/desktop/source/lib/lokandroid.cxx 
b/desktop/source/lib/lokandroid.cxx
index 16e7217..bc9a8b0 100644
--- a/desktop/source/lib/lokandroid.cxx
+++ b/desktop/source/lib/lokandroid.cxx
@@ -41,6 +41,17 @@ void setHandle(JNIEnv* pEnv, jobject aObject, T* aType)
     pEnv->SetLongField(aObject, getHandleField(pEnv, aObject), aHandle);
 }
 
+const char* copyJavaString(JNIEnv* pEnv, jstring aJavaString)
+{
+    const char* pClone = NULL;
+
+    const char* pTemp = pEnv->GetStringUTFChars(aJavaString, NULL);
+    pClone = strdup(pTemp);
+    pEnv->ReleaseStringUTFChars(aJavaString, pTemp);
+
+    return pClone;
+}
+
 extern "C" SAL_JNI_EXPORT jstring JNICALL 
Java_org_libreoffice_kit_Office_getError(JNIEnv* pEnv, jobject aObject)
 {
     LibreOfficeKit* pLibreOfficeKit = getHandle<LibreOfficeKit>(pEnv, aObject);
@@ -53,21 +64,29 @@ extern "C" SAL_JNI_EXPORT void JNICALL 
Java_org_libreoffice_kit_Office_initializ
     pEnv->SetLongField(aObject, getHandleField(pEnv, aObject), aLokHandle);
 }
 
-extern "C" SAL_JNI_EXPORT jlong JNICALL 
Java_org_libreoffice_kit_Office_documentLoadNative(JNIEnv* pEnv, jobject 
aObject, jstring documentPath)
+extern "C" SAL_JNI_EXPORT void JNICALL 
Java_org_libreoffice_kit_Office_destroy(JNIEnv* pEnv, jobject aObject)
 {
-    const char* aCloneDocumentPath;
-
-    const char* aCharDocumentPath = pEnv->GetStringUTFChars(documentPath, 
NULL);
-    aCloneDocumentPath = strdup(aCharDocumentPath);
-    pEnv->ReleaseStringUTFChars(documentPath, aCharDocumentPath);
+    LibreOfficeKit* pLibreOfficeKit = getHandle<LibreOfficeKit>(pEnv, aObject);
+    pLibreOfficeKit->pClass->destroy(pLibreOfficeKit);
+}
 
+extern "C" SAL_JNI_EXPORT jlong JNICALL 
Java_org_libreoffice_kit_Office_documentLoadNative(JNIEnv* pEnv, jobject 
aObject, jstring documentPath)
+{
+    const char* aCloneDocumentPath = copyJavaString(pEnv, documentPath);
     LibreOfficeKit* pLibreOfficeKit = getHandle<LibreOfficeKit>(pEnv, aObject);
 
     LibreOfficeKitDocument* pDocument = 
pLibreOfficeKit->pClass->documentLoad(pLibreOfficeKit, aCloneDocumentPath);
-    return (jlong) (intptr_t) pDocument;
+    return (jlong) pDocument;
 }
 
 /* Document */
+extern "C" SAL_JNI_EXPORT void JNICALL 
Java_org_libreoffice_kit_Document_destroy
+    (JNIEnv* pEnv, jobject aObject)
+{
+    LibreOfficeKitDocument* pDocument = 
getHandle<LibreOfficeKitDocument>(pEnv, aObject);
+    pDocument->pClass->destroy(pDocument);
+}
+
 extern "C" SAL_JNI_EXPORT void JNICALL 
Java_org_libreoffice_kit_Document_setPart
     (JNIEnv* pEnv, jobject aObject, jint aPart)
 {
@@ -145,4 +164,21 @@ extern "C" SAL_JNI_EXPORT jlong JNICALL 
Java_org_libreoffice_kit_Document_getDoc
     return nWidth;
 }
 
+extern "C" SAL_JNI_EXPORT jint JNICALL 
Java_org_libreoffice_kit_Office_saveAs(JNIEnv* pEnv, jobject aObject, jstring 
sUrl, jstring sFormat, jstring sOptions)
+{
+    LibreOfficeKitDocument* pDocument = 
getHandle<LibreOfficeKitDocument>(pEnv, aObject);
+
+    const char* pUrl = pEnv->GetStringUTFChars(sUrl, NULL);
+    const char* pFormat = pEnv->GetStringUTFChars(sFormat, NULL);
+    const char* pOptions = pEnv->GetStringUTFChars(sOptions, NULL);
+
+    int result = pDocument->pClass->saveAs(pDocument, pUrl, pFormat, pOptions);
+
+    pEnv->ReleaseStringUTFChars(sUrl, pUrl);
+    pEnv->ReleaseStringUTFChars(sFormat, pFormat);
+    pEnv->ReleaseStringUTFChars(sOptions, pOptions);
+
+    return result;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to