diff options
author | Tor Lillqvist <tml@collabora.com> | 2014-12-16 20:43:52 +0200 |
---|---|---|
committer | Tor Lillqvist <tml@collabora.com> | 2014-12-16 20:44:50 +0200 |
commit | 1ab295ba09cf4c83c24f792f4ac5b9daaa1814cc (patch) | |
tree | b917bd0bb0be6caa3528d0686d7d6f1180e6bfce /android/experimental | |
parent | 1177f4dc061d945863a30d5c60123f2ec3d74cd4 (diff) |
org.libreoffice.android.DocumentLoader is not used for anything in LOAndroid3
Change-Id: Ib7d55a90935a9d2c42196b04119db1c5ea7f30f4
Diffstat (limited to 'android/experimental')
-rw-r--r-- | android/experimental/LOAndroid3/src/java/org/libreoffice/android/DocumentLoader.java | 1257 | ||||
-rw-r--r-- | android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java | 1 |
2 files changed, 0 insertions, 1258 deletions
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/android/DocumentLoader.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/android/DocumentLoader.java deleted file mode 100644 index 5efdcc070a27..000000000000 --- a/android/experimental/LOAndroid3/src/java/org/libreoffice/android/DocumentLoader.java +++ /dev/null @@ -1,1257 +0,0 @@ -// -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// -// This file is part of the LibreOffice project. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// This is just a testbed for ideas and implementations. (Still, it might turn -// out to be somewhat useful as such while waiting for "real" apps.) - -// Important points: - -// Everything that might take a long time should be done asynchronously: -// - loading the document (loadComponentFromURL()) -// - counting number of pages (getRendererCount()) -// - rendering a page (render()) - -// Unclear whether pages can be rendered in parallel. Probably best to -// serialize all the above in the same worker thread, for instance using -// AsyncTask.SERIAL_EXECUTOR. - -// While a page is loading ideally should display some animated spinner (but -// for now just a static "please wait" text). - -// Just three views are used for the pages: For the current page being viewed, -// the previous, and the next. This could be bumped higher, need to make the -// "3" into a parameter below. - -package org.libreoffice.android; - -import org.libreoffice.R; - -import android.app.Activity; -import android.graphics.PointF; -import android.graphics.Bitmap; -import android.graphics.Matrix; -import android.graphics.Color; -import android.graphics.BitmapFactory; -import android.graphics.BlurMaskFilter; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.os.AsyncTask; -import android.os.Bundle; -import android.util.FloatMath; -import android.util.Log; -import android.view.GestureDetector; -import android.view.Gravity; -import android.view.MotionEvent; -import android.view.View.OnTouchListener; -import android.view.ViewGroup; -import android.view.animation.Animation; -import android.view.animation.AnimationSet; -import android.view.animation.TranslateAnimation; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.TextView; -import android.widget.ImageView.ScaleType; -import android.widget.ViewFlipper; -import android.widget.ViewSwitcher; -import android.view.MenuItem; -import android.content.Intent; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.BaseAdapter; -import android.view.View.OnClickListener; -// Obsolete? -import android.widget.AdapterView.OnItemClickListener; -import android.widget.GridView; -import android.widget.AdapterView; -import android.widget.ProgressBar; - -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.LinearLayout.LayoutParams; -import android.graphics.BitmapFactory; - -import com.polites.android.GestureImageView; - -import com.sun.star.awt.Size; -import com.sun.star.awt.XBitmap; -import com.sun.star.awt.XControl; -import com.sun.star.awt.XDevice; -import com.sun.star.awt.XToolkitExperimental; -import com.sun.star.beans.PropertyValue; -import com.sun.star.frame.XComponentLoader; -import com.sun.star.frame.XController; -import com.sun.star.frame.XFrame; -import com.sun.star.frame.XModel; -import com.sun.star.lang.XEventListener; -import com.sun.star.lang.XMultiComponentFactory; -import com.sun.star.lang.XTypeProvider; -import com.sun.star.uno.Type; -import com.sun.star.uno.UnoRuntime; -import com.sun.star.uno.XComponentContext; -import com.sun.star.view.XRenderable; - -import java.io.*; -import java.nio.ByteBuffer; -import java.nio.IntBuffer; -import java.nio.ByteOrder; -import java.util.ArrayList; - -import org.libreoffice.android.Bootstrap; -import org.libreoffice.ui.LibreOfficeUIActivity; - -public class DocumentLoader - extends Activity -{ - private static final String TAG = "DocumentLoader"; - - // Size of a small virtual (bitmap) device used to find out page count and - // page sizes - private static final int SMALLSIZE = 128; - - // We pre-render this many pages preceding and succeeding the currently - // viewed one, i.e. the total number of rendered pages kept is - // PAGECACHE_PLUSMINUS*2+1. - private static int PAGECACHE_PLUSMINUS = 2; - private static int PAGECACHE_SIZE = PAGECACHE_PLUSMINUS*2 + 1; - - long timingOverhead; - XComponentContext context; - XMultiComponentFactory mcf; - XComponentLoader componentLoader; - XToolkitExperimental toolkit; - XDevice dummySmallDevice; - Object doc; - int pageCount; - int currentPage; - XRenderable renderable; - - GestureDetector gestureDetector; - ScaleListener scaleDetector; - - ViewGroup.LayoutParams matchParent; - - DocumentViewer documentViewer; - - Bundle extras; - - LinearLayout ll ; - LayoutInflater inflater ; - - class GestureListener - extends GestureDetector.SimpleOnGestureListener - { - @Override - public boolean onFling(MotionEvent event1, - MotionEvent event2, - float velocityX, - float velocityY) - { - Log.i(TAG, "onFling: " + event1 + " " + event2); - if (scaleDetector.inZoom()) - return false; - ViewFlipper flipper = documentViewer.getFlipper(); - if (event1.getX() - event2.getX() > 120) { - if (((PageViewer)flipper.getCurrentView()).currentPageNumber == pageCount-1) - return false; - scaleDetector.reset(); - documentViewer.nextPage(); - return true; - } else if (event2.getX() - event1.getX() > 120) { - if (((PageViewer)flipper.getCurrentView()).currentPageNumber == 0) - return false; - scaleDetector.reset(); - documentViewer.prevPage(); - return true; - } - return false; - } - - @Override - public boolean onSingleTapUp(MotionEvent event) { - if (getActionBar().isShowing()) { - getActionBar().hide(); - } else { - getActionBar().show(); - } - return true; - } - - @Override - public boolean onDoubleTap(MotionEvent event) { - LinearLayout ll = (LinearLayout)findViewById( R.id.navigator); - if (ll.isShown()) { - ll.setVisibility( View.GONE ); - } else { - ll.setVisibility( View.VISIBLE ); - } - return true; - } - - } - - class ScaleListener implements OnTouchListener - { - public ScaleListener() - { - reset(); - } - - public boolean onTouch(View v, MotionEvent event) - { - PageViewer pageViewer = (PageViewer)v; - ImageView view = (ImageView)pageViewer.getCurrentView(); - if (view.getScaleType() == ScaleType.FIT_CENTER) - { - origValues = new float[9]; - view.getImageMatrix().getValues(origValues); - matrix.setValues(origValues); - view.setScaleType(ScaleType.MATRIX); - } - - switch (event.getAction() & MotionEvent.ACTION_MASK) - { - case MotionEvent.ACTION_DOWN: - if (inZoom()) - { - savedMatrix.set(matrix); - start.set(event.getX(), event.getY()); - mode = DRAG; - } - break; - case MotionEvent.ACTION_POINTER_DOWN: - oldDist = spacing(event); - if (oldDist > 10f) { - savedMatrix.set(matrix); - midPoint(mid, event); - mode = ZOOM; - } - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_POINTER_UP: - mode = NONE; - float[] values = new float[9]; - view.getImageMatrix().getValues(values); - currentScaleX = values[Matrix.MSCALE_X]; - currentScaleY = values[Matrix.MSCALE_Y]; - if (currentScaleX < origValues[Matrix.MSCALE_X]) - matrix.setValues(origValues); - break; - case MotionEvent.ACTION_MOVE: - if (mode == DRAG) { - matrix.set(savedMatrix); - matrix.postTranslate(event.getX() - start.x, -1 * (event.getY() - start.y)); - } - else if (mode == ZOOM) { - float newDist = spacing(event); - if (newDist > 10f) { - matrix.set(savedMatrix); - float scale = newDist / oldDist; - matrix.postScale(scale, scale, mid.x, mid.y); - } - } - break; - } - - view.setImageMatrix(matrix); - return true; - } - - private float spacing(MotionEvent event) - { - float x = event.getX(0) - event.getX(1); - float y = event.getY(0) - event.getY(1); - return FloatMath.sqrt(x * x + y * y); - } - - private void midPoint(PointF point, MotionEvent event) - { - float x = event.getX(0) + event.getX(1); - float y = event.getY(0) + event.getY(1); - point.set(x / 2, y / 2); - } - - public void reset() - { - if (documentViewer != null) - { - PageViewer pageViewer = (PageViewer)documentViewer.viewFlipper.getCurrentView(); - ((ImageView)pageViewer.getCurrentView()).setScaleType(ScaleType.FIT_CENTER); - } - matrix = new Matrix(); - savedMatrix = new Matrix(); - mode = NONE; - start = new PointF(); - mid = new PointF(); - oldDist = 1f; - origValues = null; - currentScaleX = 0; - currentScaleY = 0; - } - - public boolean inZoom() - { - return origValues != null && origValues[Matrix.MSCALE_X] < currentScaleX; - } - - Matrix matrix; // Matrix of the current view - Matrix savedMatrix; // Matrix when the user started the touch. - - static final int NONE = 0; - static final int DRAG = 1; - static final int ZOOM = 2; - int mode; - - PointF start; - PointF mid; - float oldDist; - - float[] origValues; - float currentScaleX; - float currentScaleY; - } - - class MyXController - implements XController - { - - XFrame frame; - XModel model; - - public void attachFrame(XFrame frame) - { - Log.i(TAG, "attachFrame"); - this.frame = frame; - } - - public boolean attachModel(XModel model) - { - Log.i(TAG, "attachModel"); - this.model = model; - return true; - } - - public boolean suspend(boolean doSuspend) - { - Log.i(TAG, "suspend"); - return false; - } - - public Object getViewData() - { - Log.i(TAG, "getViewData"); - return null; - } - - public void restoreViewData(Object data) - { - Log.i(TAG, "restoreViewData"); - } - - public XModel getModel() - { - Log.i(TAG, "getModel"); - return model; - } - - public XFrame getFrame() - { - Log.i(TAG, "getFrame"); - return frame; - } - - public void dispose() - { - Log.i(TAG, "dispose"); - } - - public void addEventListener(XEventListener listener) - { - Log.i(TAG, "addEventListener"); - } - - public void removeEventListener(XEventListener listener) - { - Log.i(TAG, "removeEventListener"); - } - } - - ByteBuffer renderPage(int number) - { - try { - // Use dummySmallDevice with no scale of offset just to find out - // the paper size of this page. - Log.i( TAG , "Render( " + Integer.toString( number ) + " )"); - ViewFlipper flipper = documentViewer.getFlipper(); - if (renderable == null) { - Log.i( TAG , "no renderable"); - return null; - } - - PropertyValue renderProps[] = new PropertyValue[3]; - renderProps[0] = new PropertyValue(); - renderProps[0].Name = "IsPrinter"; - renderProps[0].Value = Boolean.TRUE; - renderProps[1] = new PropertyValue(); - renderProps[1].Name = "RenderDevice"; - renderProps[1].Value = dummySmallDevice; - renderProps[2] = new PropertyValue(); - renderProps[2].Name = "View"; - renderProps[2].Value = new MyXController(); - - // getRenderer returns a set of properties that include the PageSize - long t0 = System.currentTimeMillis(); - PropertyValue rendererProps[] = renderable.getRenderer(number, doc, renderProps); - long t1 = System.currentTimeMillis(); - Log.i(TAG, "getRenderer took " + ((t1-t0)-timingOverhead) + " ms"); - - int pageWidth = 0, pageHeight = 0; - for (int i = 0; i < rendererProps.length; i++) { - if (rendererProps[i].Name.equals("PageSize")) { - pageWidth = ((Size) rendererProps[i].Value).Width; - pageHeight = ((Size) rendererProps[i].Value).Height; - Log.i(TAG, "PageSize: " + pageWidth + "x" + pageHeight); - } - } - - // Create a new device with the correct scale and offset - ByteBuffer bb = ByteBuffer.allocateDirect(flipper.getWidth()*flipper.getHeight()*4); - long wrapped_bb = Bootstrap.new_byte_buffer_wrapper(bb); - - XDevice device; - if (pageWidth == 0) { - // Huh? - device = toolkit.createScreenCompatibleDeviceUsingBuffer(flipper.getWidth(), flipper.getHeight(), 1, 1, 0, 0, wrapped_bb); - } else { - - // Scale so that it fits our device which has a resolution of 96/in (see - // SvpSalGraphics::GetResolution()). The page size returned from getRenderer() is in 1/mm * 100. - - int scaleNumerator, scaleDenominator; - - // If the view has a wider aspect ratio than the page, fit - // height; otherwise, fit width - if ((double) flipper.getWidth() / flipper.getHeight() > (double) pageWidth / pageHeight) { - scaleNumerator = flipper.getHeight(); - scaleDenominator = pageHeight / 2540 * 96; - } else { - scaleNumerator = flipper.getWidth(); - scaleDenominator = pageWidth / 2540 * 96; - } - Log.i(TAG, "Scaling with " + scaleNumerator + "/" + scaleDenominator); - - device = toolkit.createScreenCompatibleDeviceUsingBuffer(flipper.getWidth(), flipper.getHeight(), - scaleNumerator, scaleDenominator, - 0, 0, - wrapped_bb); - } - - // Update the property that points to the device - renderProps[1].Value = device; - - t0 = System.currentTimeMillis(); - renderable.render(number, doc, renderProps); - t1 = System.currentTimeMillis(); - Log.i(TAG, "Rendering page " + number + " took " + ((t1-t0)-timingOverhead) + " ms"); - - Bootstrap.force_full_alpha_bb(bb, 0, flipper.getWidth() * flipper.getHeight() * 4); - - return bb; - } - catch (Exception e) { - e.printStackTrace(System.err); - finish(); - } - - return null; - } - - ByteBuffer renderPage(int number, int width , int height) - { - try { - // Use dummySmallDevice with no scale of offset just to find out - // the paper size of this page. - - if (renderable == null) { - Log.i( TAG , "no renderable to render page ( " + Integer.toString(number) + " )" ); - return null; - } - - PropertyValue renderProps[] = new PropertyValue[3]; - renderProps[0] = new PropertyValue(); - renderProps[0].Name = "IsPrinter"; - renderProps[0].Value = Boolean.TRUE; - renderProps[1] = new PropertyValue(); - renderProps[1].Name = "RenderDevice"; - renderProps[1].Value = dummySmallDevice; - renderProps[2] = new PropertyValue(); - renderProps[2].Name = "View"; - renderProps[2].Value = new MyXController(); - - // getRenderer returns a set of properties that include the PageSize - long t0 = System.currentTimeMillis(); - PropertyValue rendererProps[] = renderable.getRenderer(number, doc, renderProps); - long t1 = System.currentTimeMillis(); - Log.i(TAG, "w,h getRenderer took " + ((t1-t0)-timingOverhead) + " ms"); - - int pageWidth = 0, pageHeight = 0; - for (int i = 0; i < rendererProps.length; i++) { - if (rendererProps[i].Name.equals("PageSize")) { - pageWidth = ((Size) rendererProps[i].Value).Width; - pageHeight = ((Size) rendererProps[i].Value).Height; - Log.i(TAG, " w,h PageSize: " + pageWidth + "x" + pageHeight); - } - } - - // Create a new device with the correct scale and offset - ByteBuffer bb = ByteBuffer.allocateDirect(width*height*4); - long wrapped_bb = Bootstrap.new_byte_buffer_wrapper(bb); - - XDevice device; - if (pageWidth == 0) { - // Huh? - device = toolkit.createScreenCompatibleDeviceUsingBuffer(width, height, 1, 1, 0, 0, wrapped_bb); - } else { - - // Scale so that it fits our device which has a resolution of 96/in (see - // SvpSalGraphics::GetResolution()). The page size returned from getRenderer() is in 1/mm * 100. - - int scaleNumerator, scaleDenominator; - - // If the view has a wider aspect ratio than the page, fit - // height; otherwise, fit width - if ((double) width / height > (double) pageWidth / pageHeight) { - scaleNumerator = height; - scaleDenominator = pageHeight / 2540 * 96; - } else { - scaleNumerator = width; - scaleDenominator = pageWidth / 2540 * 96; - } - Log.i(TAG, "w,h Scaling with " + scaleNumerator + "/" + scaleDenominator); - - device = toolkit.createScreenCompatibleDeviceUsingBuffer(width, height, - scaleNumerator, scaleDenominator, - 0, 0, - wrapped_bb); - } - - // Update the property that points to the device - renderProps[1].Value = device; - - t0 = System.currentTimeMillis(); - renderable.render(number, doc, renderProps); - t1 = System.currentTimeMillis(); - Log.i(TAG, "w,h Rendering page " + number + " took " + ((t1-t0)-timingOverhead) + " ms"); - - Bootstrap.force_full_alpha_bb(bb, 0, width * height * 4); - - return bb; - } - catch (Exception e) { - e.printStackTrace(System.err); - finish(); - } - - return null; - } - - enum PageState { NONEXISTENT, LOADING, READY }; - - class PageViewer - extends ViewSwitcher - { - public int currentPageNumber = -1; - TextView waitView; - PageState state = PageState.NONEXISTENT; - Bitmap bm; - static final String TAG = "PAGE_VIEWER"; - int width ; - int height; - double zoomFactor; - - class PageLoadTask - extends AsyncTask<Integer, Void, Integer> - { - protected Integer doInBackground(Integer... params) - { - Log.i( PageViewer.TAG, "doInBackground: page " + params[0].toString() ); - int number = params[0]; - - if (number >= pageCount) - return -1; - - state = PageState.LOADING; - currentPageNumber = number; - ByteBuffer bb = renderPage(currentPageNumber, getZoomed(params[1]), getZoomed(params[2]));// - bm = Bitmap.createBitmap(getZoomed(width), getZoomed(height), Bitmap.Config.ARGB_8888); - bm.copyPixelsFromBuffer(bb); - - return currentPageNumber; - } - - int getZoomed(int in) - { - double zoomed = in * zoomFactor; - return (int)zoomed; - } - - protected void onPostExecute(Integer result) - { - Log.i(PageViewer.TAG, "onPostExecute: " + result); - if (result == -1) - return; - - ImageView imageView = new ImageView(DocumentLoader.this); - imageView.setImageBitmap(bm); - - imageView.setScaleY(-1); - - if (getChildCount() == 2) - removeViewAt(1); - addView(imageView, 1, matchParent); - showNext(); - state = PageState.READY; - } - } - - void display(int number) - { - Log.i(this.TAG, "PageViewer display(" + number + ")"); - Log.i(this.TAG, "IF"); - if (number >= 0){ - waitView = new TextView(DocumentLoader.this); - waitView.setText("Page " + (number+1) + ", wait..."); - addView(waitView, 0, matchParent); - } - Log.i(this.TAG, "ENDIF"); - currentPageNumber = number; - state = PageState.NONEXISTENT; - Log.i(this.TAG, "IF"); - if (getDisplayedChild() == 1) { - showPrevious(); - removeViewAt(1); - } - Log.i(TAG, "ENDIF"); - if (number >= 0) { - Log.i( this.TAG , "Loading " + Integer.toString( number ) + " on Async "); - new PageLoadTask().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, number , width , height); - }else{ - Log.i( this.TAG , "Bad computer, Bold!"); - } - } - - int getPage(){ - return this.currentPageNumber; - } - - PageViewer(int number , int width , int height) - { - super(DocumentLoader.this); - if( number < 0) - return; - this.width = width ; - this.height = height; - // Render in a bit better quality, so it makes sense to zoom. - zoomFactor = Math.sqrt(2); - waitView = new TextView(DocumentLoader.this); - waitView.setTextSize(24); - waitView.setGravity(Gravity.CENTER); - waitView.setBackgroundColor(Color.WHITE); - waitView.setTextColor(Color.BLACK); - - display(number); - } - } - - class ThumbnailView - extends ViewSwitcher - { - int currentPageNumber = -1; - TextView waitView; - View thumbnailView; - //PageState state = PageState.NONEXISTENT; - Bitmap bm; - final float scale; - final int widthInPx; - final int heightInPx; - final int defaultWidthPx = 120; - final int defaultHeightPx = 120; - final int thumbnailPaddingDp = 10; - - class ThumbLoadTask - extends AsyncTask<Integer, Void, Integer> - { - protected Integer doInBackground(Integer... params) - { - int number = params[0]; - - if (number >= pageCount) - return -1; - - //state = PageState.LOADING; - ByteBuffer bb = renderPage( number , widthInPx , heightInPx); - bm = Bitmap.createBitmap( widthInPx , heightInPx , Bitmap.Config.ARGB_8888); - bm.copyPixelsFromBuffer(bb); - - return number; - } - - protected void onPostExecute(Integer result) - { - Log.i(TAG, "onPostExecute: " + result); - if (result == -1) - return; - - //ImageView imageView = new ImageView(DocumentLoader.this); - - ImageView thumbImage = new ImageView(DocumentLoader.this);//(ImageView)findViewById( R.id.thumbnail ); - thumbImage.setImageBitmap(bm); - int paddingPx = (int) (thumbnailPaddingDp* scale + 0.5f); - thumbImage.setPadding( paddingPx , 0 , paddingPx , 0 ); - thumbImage.setScaleY(-1); - - Log.i( TAG, Integer.toString( thumbImage.getWidth() ) ); - if (getChildCount() == 1) - removeViewAt(0); - addView(thumbImage, matchParent); - showNext(); - //state = PageState.READY; - } - } - - void display(int number) - { - Log.i(TAG, "Thumbnail display(" + number + ")"); - if (number >= 0) - waitView.setText("Page " + (number+1) + ", wait..."); - //state = PageState.NONEXISTENT; - if (number >= 0) { - new ThumbLoadTask().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, number); - } - } - - Bitmap getBitmap(){ - return bm; - } - - ThumbnailView(int number , int widthInDp , int heightInDp) - { - super(DocumentLoader.this); - scale = getContext().getResources().getDisplayMetrics().density; - widthInPx = (int) (widthInDp * scale + 0.5f); - heightInPx = (int) (heightInDp* scale + 0.5f); - waitView = new TextView( DocumentLoader.this ); - thumbnailView = inflater.inflate( R.layout.navigation_grid_item , null); - - display(number); - - - } - - ThumbnailView(int number) - { - super(DocumentLoader.this); - scale = getContext().getResources().getDisplayMetrics().density; - widthInPx = defaultWidthPx; - heightInPx = defaultHeightPx; - waitView = new TextView( DocumentLoader.this ); - thumbnailView = inflater.inflate( R.layout.navigation_grid_item , null); - - display(number); - - - } - } - - class DocumentLoadTask - extends AsyncTask<String, Integer, Integer> - { - ProgressBar progressView; - - protected void onPreExecute (){//TODO have another go at putting in a progress bar (shouldn't waste time on it now) - matchParent = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - - TextView waitView = new TextView(DocumentLoader.this); - waitView.setTextSize(24); - waitView.setGravity(Gravity.CENTER); - waitView.setBackgroundColor(Color.WHITE); - waitView.setTextColor(Color.BLACK); - waitView.setText("Page " + (1) + ", wait..."); - - progressView = new ProgressBar( DocumentLoader.this, null, android.R.attr.progressBarStyleHorizontal); - progressView.setProgress( 10 ); - - ViewFlipper flipper = (ViewFlipper)findViewById( R.id.page_flipper ); - flipper.addView( waitView , 0 , matchParent); - flipper.showNext(); - currentPage = 0; - } - - protected Integer doInBackground(String... params) - { - try { - String url = params[0]; - Log.i(TAG, "Attempting to load " + url); - - PropertyValue loadProps[] = new PropertyValue[3]; - loadProps[0] = new PropertyValue(); - loadProps[0].Name = "Hidden"; - loadProps[0].Value = Boolean.TRUE; - loadProps[1] = new PropertyValue(); - loadProps[1].Name = "ReadOnly"; - loadProps[1].Value = Boolean.TRUE; - loadProps[2] = new PropertyValue(); - loadProps[2].Name = "Preview"; - loadProps[2].Value = Boolean.TRUE; - - long t0 = System.currentTimeMillis(); - doc = componentLoader.loadComponentFromURL(url, "_blank", 0, loadProps); - publishProgress( new Integer( 33 )); - long t1 = System.currentTimeMillis(); - Log.i(TAG, "Loading took " + ((t1-t0)-timingOverhead) + " ms => " + - (doc == null ? "null" : "have") + "document"); - - Object toolkitService = mcf.createInstanceWithContext - ("com.sun.star.awt.Toolkit", context); - toolkit = (XToolkitExperimental) UnoRuntime.queryInterface(XToolkitExperimental.class, toolkitService); - - renderable = (XRenderable) UnoRuntime.queryInterface(XRenderable.class, doc); - - // Set up dummySmallDevice and use it to find out the number - // of pages ("renderers"). - ByteBuffer smallbb = ByteBuffer.allocateDirect(SMALLSIZE*SMALLSIZE*4); - long wrapped_smallbb = Bootstrap.new_byte_buffer_wrapper(smallbb); - dummySmallDevice = toolkit.createScreenCompatibleDeviceUsingBuffer(SMALLSIZE, SMALLSIZE, 1, 1, 0, 0, wrapped_smallbb); - - PropertyValue renderProps[] = new PropertyValue[3]; - renderProps[0] = new PropertyValue(); - renderProps[0].Name = "IsPrinter"; - renderProps[0].Value = Boolean.TRUE; - renderProps[1] = new PropertyValue(); - renderProps[1].Name = "RenderDevice"; - renderProps[1].Value = dummySmallDevice; - renderProps[2] = new PropertyValue(); - renderProps[2].Name = "View"; - renderProps[2].Value = new MyXController(); - - if (renderable != null) - { - t0 = System.currentTimeMillis(); - pageCount = renderable.getRendererCount(doc, renderProps); - t1 = System.currentTimeMillis(); - Log.i(TAG, "getRendererCount: " + pageCount + ", took " + ((t1-t0)-timingOverhead) + " ms"); - } - else - { - pageCount = 1; // hack - Log.i(TAG, "no / null renderable interface!"); - } - } - catch (Exception e) { - e.printStackTrace(System.err); - finish(); - } - return new Integer( pageCount ); - } - - protected void onProgressUpdate(Integer progress){ - progressView.setProgress( progress.intValue() ); - } - - protected void onPostExecute(Integer result){ - Log.i(TAG, "onPostExecute: " + result); - if (result == -1) - return; - documentViewer = new DocumentViewer( (ViewFlipper)findViewById( R.id.page_flipper ) ); - ll = (LinearLayout)findViewById( R.id.navigator); - inflater = (LayoutInflater) getApplicationContext().getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - for( int i = 0; i < result.intValue() ; i++ ){ - ThumbnailView thumb = new ThumbnailView( i , (int)(120.0f / Math.sqrt(2) ) , 120 ); - final int pos = i; - thumb.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - documentViewer.open( pos ); - } - }); - ll.addView ( thumb ); - } - } - } - - class DocumentViewer - { - private String TAG = "DocumentViewer"; - private int currentPage; - private ViewFlipper viewFlipper; - private int lastPage; - private final int firstPage = 0; - private final int CACHE_SIZE = 5; - private ViewGroup.LayoutParams matchParent = new ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT); - private ArrayList<Integer> pageNumbers = new ArrayList<Integer>(); - private ArrayList<PageViewer> pageViews = new ArrayList<PageViewer>(); - - public DocumentViewer(ViewFlipper viewFlipper ){ - this.currentPage = 0; - this.viewFlipper = viewFlipper; - this.lastPage = pageCount-1; - Log.i( TAG , "pages [0," + Integer.toString( lastPage) + "]" ); - viewFlipper.removeAllViews(); - for( int i = 0 ; i < Math.min( Math.max(lastPage,1), this.CACHE_SIZE) ; i++){//perhaps loading backwards is best? LRU -> end not start? - pageNumbers.add( new Integer(i) ); - pageViews.add( new PageViewer( i , viewFlipper.getWidth() , viewFlipper.getHeight()) ); - } - viewFlipper.addView( pageViews.get(0) ); - viewFlipper.setDisplayedChild( 0 ); - } - - public void nextPage(){ - open( currentPage + 1 ); - } - - public void prevPage(){ - open( currentPage - 1 ); - } - - public void open( int newPage ){ - if( newPage == currentPage ){ - Log.i( TAG , "Page " + Integer.toString( newPage ) + " is the current page" ); - return; - } - if( newPage > lastPage || newPage < firstPage ){ - Log.i( TAG , "Page " + Integer.toString( newPage ) + " is out of Bounds [0," + Integer.toString(lastPage) + "]" ); - return; - } - if( newPage - currentPage > 0 ){ - setAnimationInFromRight(); - }else{ - setAnimationInFromLeft(); - } - viewFlipper.addView( fetch( newPage ) ); - viewFlipper.setDisplayedChild( 1 );//remove after so that transition has two pages. - viewFlipper.removeViewAt( 0 ); - preFetch( newPage - 1 ); - preFetch( newPage +1 ); - currentPage = newPage; - } - - private void setAnimationInFromRight(){//going forward - Animation inFromRight = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 1, Animation.RELATIVE_TO_SELF, 0, - Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); - inFromRight.setDuration(500); - viewFlipper.setInAnimation(inFromRight); - - Animation outToLeft = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -1, - Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); - outToLeft.setDuration(500); - viewFlipper.setOutAnimation(outToLeft); - } - - private void setAnimationInFromLeft(){ - Animation inFromLeft = new TranslateAnimation(Animation.RELATIVE_TO_SELF, -1, Animation.RELATIVE_TO_SELF, 0, - Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); - inFromLeft.setDuration(500); - viewFlipper.setInAnimation(inFromLeft); - - Animation outToRight = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1, - Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); - outToRight.setDuration(500); - viewFlipper.setOutAnimation(outToRight); - } - - private PageViewer fetch( int page ){ - int cacheIndex = pageNumbers.indexOf( page ); - if( cacheIndex != -1 ){ - //move item to most recently accessed position - pageNumbers.add( pageNumbers.get( cacheIndex ) ); - pageViews.add( pageViews.get( cacheIndex ) ); - pageNumbers.remove( cacheIndex ); - pageViews.remove( cacheIndex ); - return pageViews.get( pageViews.size() -1 ); - }else{ - pageNumbers.remove( 0 ); - pageViews.remove( 0 ); - pageNumbers.add( page ); - pageViews.add( new PageViewer( page , viewFlipper.getWidth() , viewFlipper.getHeight()) ); - return pageViews.get( pageViews.size() -1 ); - } - } - - private void preFetch( int page ){ - if( page == currentPage ){ - Log.i( TAG , "Page " + Integer.toString( page ) + " is the current page" ); - return; - } - if( page > lastPage || page < firstPage ){ - Log.i( TAG , "Cannot pre-fetch: " + Integer.toString( page ) + " is out of Bounds [0," + Integer.toString(lastPage) + "]" ); - return; - } - int cacheIndex = pageNumbers.indexOf( page ); - if( cacheIndex != -1 ){ - //move item to most recently accessed position - pageNumbers.add( pageNumbers.get( cacheIndex ) ); - pageViews.add( pageViews.get( cacheIndex ) ); - pageNumbers.remove( cacheIndex ); - pageViews.remove( cacheIndex ); - return ; - }else{ - pageNumbers.remove( 0 ); - pageViews.remove( 0 ); - pageNumbers.add( page ); - pageViews.add( new PageViewer( page , viewFlipper.getWidth() , viewFlipper.getHeight()) ); - return; - } - } - - public ViewFlipper getFlipper(){ - return viewFlipper; - } - } - - static void dumpUNOObject(String objectName, Object object) - { - Log.i(TAG, objectName + " is " + (object != null ? object.toString() : "null")); - - if (object == null) - return; - - XTypeProvider typeProvider = (XTypeProvider) - UnoRuntime.queryInterface(XTypeProvider.class, object); - if (typeProvider == null) - return; - - Type[] types = typeProvider.getTypes(); - if (types == null) - return; - - for (Type t : types) - Log.i(TAG, " " + t.getTypeName()); - } - - static void dumpBytes(String name, byte[] bytes, int offset) - { - if (bytes == null) { - Log.i(TAG, name + " is null"); - return; - } - Log.i(TAG, name + ":"); - - if (offset != 0) - Log.i(TAG, " (offset " + offset + ")"); - - for (int i = offset; i < Math.min(bytes.length, offset+160); i += 16) { - String s = ""; - for (int j = i; j < Math.min(bytes.length, i+16); j++) - s = s + String.format(" %02x", bytes[j]); - - Log.i(TAG, s); - } - } - - static void dumpBytes(String name, ByteBuffer bytes, int offset) - { - if (bytes == null) { - Log.i(TAG, name + " is null"); - return; - } - Log.i(TAG, name + ":"); - - if (offset != 0) - Log.i(TAG, " (offset " + offset + ")"); - - for (int i = offset; i < Math.min(bytes.limit(), offset+160); i += 16) { - String s = ""; - for (int j = i; j < Math.min(bytes.limit(), i+16); j++) - s = s + String.format(" %02x", bytes.get(j)); - - Log.i(TAG, s); - } - } - - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - extras = getIntent().getExtras(); - - gestureDetector = new GestureDetector(this, new GestureListener()); - scaleDetector = new ScaleListener(); - - try { - long t0 = System.currentTimeMillis(); - long t1 = System.currentTimeMillis(); - timingOverhead = t1 - t0; - - Bootstrap.setup(this); - - // Avoid all the old style OSL_TRACE calls especially in vcl - Bootstrap.putenv("SAL_LOG=+WARN+INFO-INFO.legacy.osl"); - - // Log.i(TAG, "Sleeping NOW"); - // Thread.sleep(20000); - - context = com.sun.star.comp.helper.Bootstrap.defaultBootstrap_InitialComponentContext(); - - Log.i(TAG, "context is" + (context!=null ? " not" : "") + " null"); - - mcf = context.getServiceManager(); - - Log.i(TAG, "mcf is" + (mcf!=null ? " not" : "") + " null"); - - String input = getIntent().getStringExtra("input"); - if (input == null) - input = "/assets/test1.odt"; - - // We need to fake up an argv, and the argv[0] even needs to - // point to some file name that we can pretend is the "program". - // setCommandArgs() will prefix argv[0] with the app's data - // directory. - - String[] argv = { "lo-document-loader", input }; - - Bootstrap.setCommandArgs(argv); - - Bootstrap.initVCL(); - - Object desktop = mcf.createInstanceWithContext - ("com.sun.star.frame.Desktop", context); - - Log.i(TAG, "desktop is" + (desktop!=null ? " not" : "") + " null"); - - componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop); - - Log.i(TAG, "componentLoader is" + (componentLoader!=null ? " not" : "") + " null"); - - setContentView( R.layout.document_viewer ); - // Load the wanted document - new DocumentLoadTask().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, "file://" + input); - - /* - //flipper = new ViewFlipper(this); - flipper = (ViewFlipper)findViewById( R.id.page_flipper ); - matchParent = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - - // should have document load task publish pageCount before this happens: Shouldn't try to pre-fetch - // non-existent pages && need to know how many navigation thumbnails to render. - // Should put these on another serial executor? - flipper.addView(new PageViewer(0), 0, matchParent); - for (int i = 0; i < PAGECACHE_PLUSMINUS; i++) - flipper.addView(new PageViewer(i+1), i+1, matchParent); - for (int i = 0; i < PAGECACHE_PLUSMINUS; i++) - flipper.addView(new PageViewer(-1), PAGECACHE_PLUSMINUS + i+1, matchParent); - - ll = (LinearLayout)findViewById( R.id.navigator); - inflater = (LayoutInflater) getApplicationContext().getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - - - - for( int i = 0; i < 2 ; i++ ){ - ThumbnailView thumb = new ThumbnailView( i , (int)(120.0f / Math.sqrt(2) ) , 120 ); - final int pos = i; - thumb.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - // TODO Auto-generated method stub - Log.d("nav" , Integer.toString( pos ) ); - - } - }); - ll.addView ( thumb ); - }*/ - - - } - catch (Exception e) { - e.printStackTrace(System.err); - finish(); - } - } - - protected void onDestroy() - { - super.onDestroy(); - - Bitmap bmpAlpha = ( (ThumbnailView)ll.getChildAt( 0 ) ).getBitmap(); - //For now use these 3 lines to turn the bitmap right way up. - Matrix m = new Matrix(); - m.preScale( 1.0f , -1.0f ); - Bitmap bmp = Bitmap.createBitmap( bmpAlpha, 0, 0, bmpAlpha.getWidth(), bmpAlpha.getHeight(), m, true); - - BlurMaskFilter blurFilter = new BlurMaskFilter( 3 , BlurMaskFilter.Blur.OUTER); - Paint shadowPaint = new Paint(); - shadowPaint.setMaskFilter(blurFilter); - - int[] offsetXY = new int[2]; - Bitmap shadowImage = bmp.extractAlpha(shadowPaint, offsetXY); - Bitmap shadowImage32 = shadowImage.copy(Bitmap.Config.ARGB_8888, true); - - ByteBuffer pxBuffer = ByteBuffer.allocate( shadowImage32.getByteCount() ); - IntBuffer intPxBuffer = IntBuffer.allocate( shadowImage32.getByteCount()/4 ); - shadowImage32.copyPixelsToBuffer( pxBuffer ); - for( int i = 0 ; i < shadowImage32.getByteCount()/4 ; i++ ){ - int pxA = (int)( pxBuffer.get( i*4 + 3) );//TODO make sure byte0 is A - intPxBuffer.put( i , Color.argb( (int)( pxA*0.25f) , 0 , 0 , 0 ) ); - } - shadowImage32.copyPixelsFromBuffer( intPxBuffer ); - - Canvas c = new Canvas(shadowImage32); - c.drawBitmap(bmp, -offsetXY[0], -offsetXY[1], null); - - File file = new File(extras.getString("input")); - Log.i(TAG ,"onDestroy " + extras.getString("input")); - File dir = file.getParentFile(); - File thumbnailFile = new File( dir , "." + file.getName().split("[.]")[0] + ".png"); - try { - Log.i( TAG , Integer.toString( shadowImage32.getWidth() - bmp.getWidth() ) ); - ByteArrayOutputStream bytes = new ByteArrayOutputStream(); - shadowImage32.compress(Bitmap.CompressFormat.PNG, 40, bytes); - thumbnailFile.createNewFile(); - FileOutputStream fo = new FileOutputStream( thumbnailFile ); - fo.write(bytes.toByteArray()); - } catch (IOException e) { - // TODO: handle exception - } - } - - @Override - public boolean onTouchEvent(MotionEvent event) - { - if (gestureDetector.onTouchEvent(event)) - return true; - if (scaleDetector.onTouch(documentViewer.viewFlipper.getCurrentView(), event)) - return true; - return false; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) - { - switch (item.getItemId()) { - case android.R.id.home: - // app icon in action bar clicked; go home - Intent intent = new Intent(this, LibreOfficeUIActivity.class); - intent.putExtras( extras ); - //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - -} - -// vim:set shiftwidth=4 softtabstop=4 expandtab: diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java index a9d17f87bea6..0920ab017fe6 100644 --- a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java +++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java @@ -10,7 +10,6 @@ package org.libreoffice.ui; import org.libreoffice.R; -import org.libreoffice.android.DocumentLoader; import org.libreoffice.android.Bootstrap; import java.io.File; |