[Libreoffice-commits] core.git: 2 commits - android/Bootstrap android/experimental desktop/source
Tomaž Vajngerl
tomaz.vajngerl at collabora.com
Mon Sep 22 13:40:18 PDT 2014
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.vajngerl at 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.vajngerl at 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: */
More information about the Libreoffice-commits
mailing list