diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.com> | 2014-09-22 22:37:11 +0200 |
---|---|---|
committer | Tomaž Vajngerl <tomaz.vajngerl@collabora.com> | 2014-09-22 22:40:07 +0200 |
commit | 2897374fdad4fdb2daab273c2cf6f85e5ae49ec1 (patch) | |
tree | 72dd4f2a6281d2d3fc468d9159f4772392e4c354 | |
parent | 18c052d6d659001657ccf1ff0c7c7cff64658f44 (diff) |
android: cleanly load/close a document when activity starts/stops
Change-Id: I2206a2b6818c030ba756f2b4d014a20d46f4106e
7 files changed, 80 insertions, 42 deletions
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java index 746ceb598a45..4aa32cb7fbfa 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 0d44d66f0a2c..fbf8675f9cbf 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 bc08b9882b0f..25a1705d06c1 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 f13dd8ab8f79..8a07641d245e 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 3438e6aaedd4..9f9c7ac163a4 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 2a89e775309c..aa8957adac28 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 4202d28ad98e..40fa51208dc4 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(); } |