diff --git a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java index fe46e8d5a..f7ca1ab61 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java +++ b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java @@ -464,4 +464,16 @@ public class BookCollectionShadow extends AbstractBookCollection implements Serv // method from ServiceConnection interface public synchronized void onServiceDisconnected(ComponentName name) { } + + @Override + public synchronized void saveCovers() { + if (myInterface == null) { + return; + } + try { + myInterface.saveCovers(); + } catch (RemoteException e) { + e.printStackTrace(); + } + } } diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl index 354e308f8..17f37f3a8 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl @@ -48,4 +48,6 @@ interface LibraryInterface { String getHighlightingStyle(in int styleId); List highlightingStyles(); void saveHighlightingStyle(in String style); + + void saveCovers(); } diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java index d438c4b36..b8f59f592 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java @@ -273,6 +273,10 @@ public class LibraryService extends Service { public void saveHighlightingStyle(String style) { myCollection.saveHighlightingStyle(SerializerUtil.deserializeStyle(style)); } + + public void saveCovers() { + myCollection.saveCovers(); + } } private volatile LibraryImplementation myLibrary; diff --git a/src/org/geometerplus/fbreader/book/BookCollection.java b/src/org/geometerplus/fbreader/book/BookCollection.java index 9b16badf2..7820d5f8e 100644 --- a/src/org/geometerplus/fbreader/book/BookCollection.java +++ b/src/org/geometerplus/fbreader/book/BookCollection.java @@ -20,16 +20,27 @@ package org.geometerplus.fbreader.book; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; import java.util.*; import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.filesystem.ZLPhysicalFile; +import org.geometerplus.zlibrary.core.image.ZLImage; +import org.geometerplus.zlibrary.core.image.ZLLoadableImage; import org.geometerplus.zlibrary.text.view.ZLTextPosition; +import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageData; +import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageManager; import org.geometerplus.fbreader.bookmodel.BookReadingException; import org.geometerplus.fbreader.formats.*; +import android.graphics.Bitmap; +import android.os.Environment; + public class BookCollection extends AbstractBookCollection { private final BooksDatabase myDatabase; public final List BookDirectories; @@ -680,4 +691,59 @@ public class BookCollection extends AbstractBookCollection { myDatabase.saveStyle(style); fireBookEvent(BookEvent.BookmarkStyleChanged, null); } + + @Override + public void saveCovers() { + for (BookQuery query = new BookQuery(new Filter.Empty(), 20); ; query = query.next()) { + final List partOfBooks = books(query); + if (partOfBooks.isEmpty()) { + break; + } + for (Book b : partOfBooks) { + saveCover(b); + } + } + } + + private void saveCover(Book b) { + final ZLImage image = BookUtil.getCover(b); + + if (image == null) { + return; + } + if (image instanceof ZLLoadableImage) { + final ZLLoadableImage loadableImage = (ZLLoadableImage)image; + if (!loadableImage.isSynchronized()) { + loadableImage.synchronize(); + } + } + final ZLAndroidImageData data = + ((ZLAndroidImageManager)ZLAndroidImageManager.Instance()).getImageData(image); + if (data == null) { + return; + } + + final Bitmap coverBitmap = data.getFullSizeBitmap(); + if (coverBitmap == null) { + return; + } + + String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); + + File myPath = new File(extStorageDirectory, "/FBReaderJ/Covers"); + myPath.mkdirs(); + + OutputStream outStream = null; + File file = new File(myPath, b.getId() + ".PNG"); + try { + outStream = new FileOutputStream(file); + coverBitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); + outStream.flush(); + outStream.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/src/org/geometerplus/fbreader/book/IBookCollection.java b/src/org/geometerplus/fbreader/book/IBookCollection.java index 905307b78..92b7982de 100644 --- a/src/org/geometerplus/fbreader/book/IBookCollection.java +++ b/src/org/geometerplus/fbreader/book/IBookCollection.java @@ -86,4 +86,6 @@ public interface IBookCollection { HighlightingStyle getHighlightingStyle(int styleId); List highlightingStyles(); void saveHighlightingStyle(HighlightingStyle style); + + void saveCovers(); } diff --git a/third-party/AmbilWarna/.project b/third-party/AmbilWarna/.project new file mode 100644 index 000000000..288216edf --- /dev/null +++ b/third-party/AmbilWarna/.project @@ -0,0 +1,33 @@ + + + AmbilWarna + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/third-party/AmbilWarna/project.properties b/third-party/AmbilWarna/project.properties index ce256fda4..6fdb0df8a 100644 --- a/third-party/AmbilWarna/project.properties +++ b/third-party/AmbilWarna/project.properties @@ -11,4 +11,4 @@ android.library=true # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=android-11 +target=android-14