summaryrefslogtreecommitdiff
path: root/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
blob: 349de7b4a679f5cba08fe839f9bbeeed95831c2e (plain)
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();
    }
}