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