android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java | 205 +++------- 1 file changed, 69 insertions(+), 136 deletions(-)
New commits: commit 9031cd89e35be17fb4e6150f5100defca36dfafc Author: Iain Billett <[email protected]> Date: Fri Aug 10 01:17:23 2012 +0100 Some minor bug fixes and code clean-up. Change-Id: I857407ac46ce51be5ee3eab26e9af75afc612a41 diff --git a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java index b7a41ad..edfb13b 100644 --- a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java +++ b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java @@ -160,7 +160,6 @@ public class DocumentLoader flipper.setOutAnimation(outToLeft); documentViewer.nextPage(); - //((PageViewer)flipper.getChildAt((flipper.getDisplayedChild() + PAGECACHE_PLUSMINUS) % PAGECACHE_SIZE)).display(((PageViewer)flipper.getCurrentView()).currentPageNumber + PAGECACHE_PLUSMINUS); return true; } else if (event2.getX() - event1.getX() > 120) { if (((PageViewer)flipper.getCurrentView()).currentPageNumber == 0) @@ -177,9 +176,6 @@ public class DocumentLoader flipper.setOutAnimation(outToRight); documentViewer.prevPage(); - - //((PageViewer)flipper.getChildAt((flipper.getDisplayedChild() + PAGECACHE_SIZE - PAGECACHE_PLUSMINUS) % PAGECACHE_SIZE)).display(((PageViewer)flipper.getCurrentView()).currentPageNumber - PAGECACHE_PLUSMINUS); - return true; } return false; @@ -670,7 +666,6 @@ public class DocumentLoader progressView = new ProgressBar( DocumentLoader.this, null, android.R.attr.progressBarStyleHorizontal); progressView.setProgress( 10 ); - //flipper = new ViewFlipper(DocumentLoader.this); ViewFlipper flipper = (ViewFlipper)findViewById( R.id.page_flipper ); flipper.addView( waitView , 0 , matchParent); flipper.showNext(); @@ -752,30 +747,10 @@ public class DocumentLoader Log.i(TAG, "onPostExecute: " + result); if (result == -1) return; - //flipper = new ViewFlipper(this); - //flipper = (ViewFlipper)findViewById( R.id.page_flipper ); - //matchParent = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - //flipper.removeViewAt( 0 ); documentViewer = new DocumentViewer( (ViewFlipper)findViewById( R.id.page_flipper ) ); - //documentViewer.open(0); - - //currentPage = 0; - //openPageWithPrefetching( currentPage ); - - /* - //open method? set current page = 0? - 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 < result.intValue() ; i++ ){ ThumbnailView thumb = new ThumbnailView( i , (int)(120.0f / Math.sqrt(2) ) , 120 ); final int pos = i; @@ -783,9 +758,6 @@ public class DocumentLoader @Override public void onClick(View v) { - // TODO Auto-generated method stub - Log.d("nav" , Integer.toString( pos ) ); - //openPageWithPrefetching( pos ); documentViewer.open( pos ); } }); @@ -799,11 +771,9 @@ public class DocumentLoader private String TAG = "DocumentViewer"; private int currentPage; private ViewFlipper viewFlipper; - //int pageCount; private int lastPage; private final int firstPage = 0; - private final int CACHE_PLUSMINUS = 2; - private final int CACHE_SIZE = 2*CACHE_PLUSMINUS + 1; + private final int CACHE_SIZE = 5; private ViewGroup.LayoutParams matchParent = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); @@ -811,13 +781,12 @@ public class DocumentLoader private ArrayList<PageViewer> pageViews = new ArrayList<PageViewer>(); public DocumentViewer(ViewFlipper viewFlipper ){ - //Log.i( TAG , "[ " + Integer.toString( rangeStart ) + " , " + Integer.toString( rangeEnd ) + " ]" ); 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( lastPage, this.CACHE_SIZE) ; i++){//perhaps loading backwards is best? LRU -> end not start? + 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()) ); } commit 5db8fb7c1fb67571d370be22de0eb249d32b8faf Author: Iain Billett <[email protected]> Date: Fri Aug 10 00:45:00 2012 +0100 Added a static loading page. Change-Id: I20a9972c52e39a821e42851f5f075fb870ea0447 diff --git a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java index b483511..b7a41ad 100644 --- a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java +++ b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java @@ -671,9 +671,9 @@ public class DocumentLoader progressView.setProgress( 10 ); //flipper = new ViewFlipper(DocumentLoader.this); - //flipper = (ViewFlipper)findViewById( R.id.page_flipper ); - //flipper.addView( waitView , 0 , matchParent); - //flipper.showNext(); + ViewFlipper flipper = (ViewFlipper)findViewById( R.id.page_flipper ); + flipper.addView( waitView , 0 , matchParent); + flipper.showNext(); currentPage = 0; } commit 2b5828e374ac985fc172d35a266668ee63622058 Author: Iain Billett <[email protected]> Date: Fri Aug 10 00:31:52 2012 +0100 Complete internal rework of DocumentViewer. Change-Id: If080c114d38fa39d50a22127def217ad59f262fd diff --git a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java index c470375..b483511 100644 --- a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java +++ b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java @@ -92,6 +92,7 @@ import com.sun.star.view.XRenderable; import java.io.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.ArrayList; import org.libreoffice.android.Bootstrap; import org.libreoffice.ui.LibreOfficeUIActivity; @@ -126,8 +127,6 @@ public class DocumentLoader ViewGroup.LayoutParams matchParent; - ViewFlipper flipper; - DocumentViewer documentViewer; Bundle extras; @@ -145,6 +144,7 @@ public class DocumentLoader float velocityY) { Log.i(TAG, "onFling: " + event1 + " " + event2); + ViewFlipper flipper = documentViewer.getFlipper(); if (event1.getX() - event2.getX() > 120) { if (((PageViewer)flipper.getCurrentView()).currentPageNumber == pageCount-1) return false; @@ -280,7 +280,7 @@ public class DocumentLoader // 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; @@ -757,7 +757,7 @@ public class DocumentLoader //matchParent = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); //flipper.removeViewAt( 0 ); documentViewer = new DocumentViewer( (ViewFlipper)findViewById( R.id.page_flipper ) ); - documentViewer.open(0); + //documentViewer.open(0); //currentPage = 0; //openPageWithPrefetching( currentPage ); @@ -796,6 +796,7 @@ public class DocumentLoader class DocumentViewer { + private String TAG = "DocumentViewer"; private int currentPage; private ViewFlipper viewFlipper; //int pageCount; @@ -806,128 +807,91 @@ public class DocumentLoader 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 ){ + //Log.i( TAG , "[ " + Integer.toString( rangeStart ) + " , " + Integer.toString( rangeEnd ) + " ]" ); this.currentPage = 0; this.viewFlipper = viewFlipper; this.lastPage = pageCount-1; - //viewFlipper.removeAllViews(); - //Not doing this here doesn't sit right can have uninit viewFlipper + Log.i( TAG , "pages [0," + Integer.toString( lastPage) + "]" ); viewFlipper.removeAllViews(); - //need to pre-fetch - for( int i = 0 ; i < this.CACHE_PLUSMINUS + 1 ; i++ ){//Load 0 + cache+- next pages - if( i > lastPage) - break; - viewFlipper.addView( new PageViewer( i , viewFlipper.getWidth() , viewFlipper.getHeight()) , i ); + for( int i = 0 ; i < Math.min( lastPage, 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 DocumentViewer(ViewFlipper viewFlipper, int n ){ - this.currentPage = n; - this.viewFlipper = viewFlipper; - this.lastPage = pageCount-1; - //viewFlipper.removeAllViews(); - //need to pre-fetch - int pos = 0; - for(int i = n - this.CACHE_PLUSMINUS ; i < n + this.CACHE_PLUSMINUS ; i++, pos++ ){ - if( i < firstPage || i > lastPage) - continue;//Perhaps should continue on < and break on > but this seems neater - viewFlipper.addView( new PageViewer( i , viewFlipper.getWidth() , viewFlipper.getHeight()) , pos ); - } + public void nextPage(){ + open( currentPage + 1 ); } - public void nextPage(){ - if( this.currentPage == lastPage ){ + 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; } - this.currentPage++; - if( !( this.currentPage + this.CACHE_PLUSMINUS > lastPage) ){//don't remove view's if there are no more to add - viewFlipper.removeViewAt( 0 ); - viewFlipper.addView( - new PageViewer( this.currentPage + this.CACHE_PLUSMINUS, viewFlipper.getWidth() , viewFlipper.getHeight()) - , this.CACHE_SIZE -1 ); + if( newPage > lastPage || newPage < firstPage ){ + Log.i( TAG , "Page " + Integer.toString( newPage ) + " is out of Bounds [0," + Integer.toString(lastPage) + "]" ); + return; } - viewFlipper.showNext(); + 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; } - public void prevPage(){ - if( this.currentPage == firstPage ){ - return; - } - this.currentPage--; - if( !( this.currentPage - this.CACHE_PLUSMINUS < 0) ){//don't remove view's if there are no more to add - viewFlipper.removeViewAt( CACHE_SIZE - 1 ); - viewFlipper.addView( - new PageViewer( this.currentPage - this.CACHE_PLUSMINUS , viewFlipper.getWidth() , viewFlipper.getHeight()) - , 0 ); + 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 ); } - viewFlipper.showPrevious(); } - public void open( int newPage ){ - int diff = newPage - this.currentPage; - Log.i( TAG , "open( N )"); - Log.i( TAG , "current page : " + Integer.toString( this.currentPage) ); - Log.i( TAG , "opening : " + Integer.toString( newPage ) + " of " + Integer.toString( pageCount ) ); - //diff = 0 -> do nothing - //abs(diff) >= cachesize -> fill as in constructor - //if curr > n : new_low foreach in cache ? # < new_low remove : from >n_upper add to end - //else : upbound foreach in cache ? # >= upbound remove ; add to start - if( diff == 0 ) + private void preFetch( int page ){ + if( page == currentPage ){ + Log.i( TAG , "Page " + Integer.toString( page ) + " is the current page" ); return; - if( Math.abs(diff) >= CACHE_SIZE ){ - int pos = 0; - viewFlipper.removeAllViews(); - for(int i = newPage - this.CACHE_PLUSMINUS ; i < newPage + this.CACHE_PLUSMINUS ; i++, pos++ ){ - if( i < firstPage || i > lastPage) - continue;//Perhaps should continue on < and break on > but this seems neater - viewFlipper.addView( new PageViewer( i , viewFlipper.getWidth() , viewFlipper.getHeight()) , pos ); - } } - - if( diff > 0 ){ // new > curr - int lowerBound = newPage - this.CACHE_PLUSMINUS;// of the new range - int pos = 0; - for(int i = 0 ; i < this.CACHE_SIZE ; i++ ){ - if( i >= viewFlipper.getChildCount() ) - break; - PageViewer page = (PageViewer)viewFlipper.getChildAt( i ); - if( page.getPage() < lowerBound ) - viewFlipper.removeViewAt( i ); - } - //for others add to end. - int numberRecycled = viewFlipper.getChildCount(); - for(int i = lowerBound ; i < newPage + this.CACHE_PLUSMINUS ; i++, pos++ ){ - if( pos < numberRecycled) - continue; - if( i < firstPage || i > lastPage) - continue; - viewFlipper.addView( new PageViewer( i , viewFlipper.getWidth() , viewFlipper.getHeight()), pos , matchParent ); - } + if( page > lastPage || page < firstPage ){ + Log.i( TAG , "Cannot pre-fetch: " + Integer.toString( page ) + " is out of Bounds [0," + Integer.toString(lastPage) + "]" ); + return; } - - if( diff < 0 ){ // new < curr - //FIXME The first 5 thumbnails are forwards only. - int upperBound = newPage + this.CACHE_PLUSMINUS; - int pos = 0; - for(int i = 0 ; i < this.CACHE_SIZE ; i++ ){ - if( i >= viewFlipper.getChildCount() ) - break; - PageViewer page = (PageViewer)viewFlipper.getChildAt( i ); - if( page.getPage() > upperBound ) - viewFlipper.removeViewAt( i ); - } - int numberRecycled = viewFlipper.getChildCount(); - for(int i = newPage - this.CACHE_PLUSMINUS ; i < upperBound ; i++, pos++ ){ - if( this.CACHE_SIZE - pos < numberRecycled) - continue; - if( i < firstPage || i > lastPage) - continue; - viewFlipper.addView( new PageViewer( i , viewFlipper.getWidth() , viewFlipper.getHeight()), 0 , matchParent ); - } + 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; } - viewFlipper.setDisplayedChild( this.CACHE_PLUSMINUS ); -// viewFlipper.showNext(); } public ViewFlipper getFlipper(){ _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
