1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
package org.libreoffice;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.DisplayMetrics;
import android.util.Log;
import org.mozilla.gecko.gfx.GeckoLayerClient;
import org.mozilla.gecko.gfx.ViewportMetrics;
import java.util.concurrent.LinkedBlockingQueue;
public class LOKitThread extends Thread {
private static final String LOGTAG = LOKitThread.class.getSimpleName();
public LinkedBlockingQueue<LOEvent> mEventQueue = new LinkedBlockingQueue<LOEvent>();
private LibreOfficeMainActivity mApplication;
private TileProvider mTileProvider;
private ViewportMetrics mViewportMetrics;
private boolean mCheckboardImageSet = false;
public LOKitThread() {
TileProviderFactory.initialize();
}
private boolean draw() throws InterruptedException {
int pageWidth = mTileProvider.getPageWidth();
int pageHeight = mTileProvider.getPageHeight();
RectF rect = new RectF(0, 0, pageWidth, pageHeight);
DisplayMetrics displayMetrics = LibreOfficeMainActivity.mAppContext.getResources().getDisplayMetrics();
mViewportMetrics = new ViewportMetrics(displayMetrics);
mViewportMetrics.setPageRect(rect, rect);
GeckoLayerClient layerClient = mApplication.getLayerClient();
layerClient.beginDrawing();
layerClient.reevaluateTiles();
layerClient.endDrawing(mViewportMetrics);
return true;
}
private void changePart(int partIndex) throws InterruptedException {
mTileProvider.changePart(partIndex);
GeckoLayerClient layerClient = mApplication.getLayerClient();
updateCheckbardImage();
LOKitShell.sendEvent(LOEvent.draw(new Rect()));
}
private boolean load(String filename) {
if (mApplication == null) {
mApplication = LibreOfficeMainActivity.mAppContext;
}
if (mTileProvider != null) {
mTileProvider.close();
}
GeckoLayerClient layerClient = mApplication.getLayerClient();
mTileProvider = TileProviderFactory.create(mApplication.getLayerController(), filename);
layerClient.setTileProvider(mTileProvider);
boolean isReady = mTileProvider.isReady();
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, mTileProvider.getPageWidth(), mTileProvider.getPageHeight());
Log.i(LOGTAG, "Done setting checkboard image!!");
mCheckboardImageSet = true;
}
}
}
public void run() {
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();
break;
case LOEvent.DRAW:
draw();
break;
case LOEvent.SIZE_CHANGED:
break;
case LOEvent.CHANGE_PART:
changePart(event.getPartIndex());
break;
}
}
public void queueEvent(LOEvent event) {
Log.i(LOGTAG, "Event: " + event.getTypeString());
mEventQueue.add(event);
}
public void clearQueue() {
mEventQueue.clear();
}
}
|