From 93e3df976bfd26fa504fc7f9d392e6ed30ef1b08 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 18 Dec 2010 13:26:37 +0000 Subject: [PATCH] work in progress --- .../android/fbreader/BookStatusActivity.java | 30 ++++++------- .../android/fbreader/library/FileManager.java | 6 +-- .../network/NetworkBookInfoActivity.java | 25 ----------- .../fbreader/formats/FormatPlugin.java | 2 +- .../fbreader/formats/fb2/FB2Plugin.java | 4 +- .../fbreader/formats/html/HtmlPlugin.java | 2 +- .../fbreader/formats/oeb/OEBPlugin.java | 4 +- .../formats/pdb/MobipocketPlugin.java | 11 +++-- .../formats/plucker/PluckerPlugin.java | 2 +- .../fbreader/library/BookTree.java | 7 +-- .../fbreader/library/Library.java | 43 +++++++++++++++++++ 11 files changed, 69 insertions(+), 67 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/BookStatusActivity.java b/src/org/geometerplus/android/fbreader/BookStatusActivity.java index 5afe8d2dd..b3608eb73 100644 --- a/src/org/geometerplus/android/fbreader/BookStatusActivity.java +++ b/src/org/geometerplus/android/fbreader/BookStatusActivity.java @@ -38,7 +38,6 @@ import android.widget.TextView; import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.image.ZLImage; -import org.geometerplus.zlibrary.core.image.ZLImageProxy; import org.geometerplus.zlibrary.core.image.ZLLoadableImage; import org.geometerplus.zlibrary.core.resources.ZLResource; @@ -49,10 +48,7 @@ import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageManager; import org.geometerplus.fbreader.bookmodel.BookModel; import org.geometerplus.fbreader.formats.FormatPlugin; import org.geometerplus.fbreader.formats.PluginCollection; -import org.geometerplus.fbreader.library.Author; -import org.geometerplus.fbreader.library.Book; -import org.geometerplus.fbreader.library.SeriesInfo; -import org.geometerplus.fbreader.library.Tag; +import org.geometerplus.fbreader.library.*; import org.geometerplus.android.fbreader.preferences.BookInfoActivity; @@ -61,6 +57,7 @@ public class BookStatusActivity extends Activity { private final ZLResource myResource = ZLResource.resource("bookInfo"); private Book myBook; + private ZLImage myImage; @Override protected void onCreate(Bundle savedInstanceState) { @@ -69,12 +66,15 @@ public class BookStatusActivity extends Activity { new org.geometerplus.zlibrary.ui.android.library.UncaughtExceptionHandler(this) ); + final String path = getIntent().getStringExtra(CURRENT_BOOK_PATH_KEY); + final ZLFile file = ZLFile.createFileByPath(path); + + myImage = Library.getCover(file); + if (SQLiteBooksDatabase.Instance() == null) { new SQLiteBooksDatabase(this, "LIBRARY"); } - final String path = getIntent().getStringExtra(CURRENT_BOOK_PATH_KEY); - final ZLFile file = ZLFile.createFileByPath(path); myBook = Book.getByFile(file); requestWindowFeature(Window.FEATURE_NO_TITLE); @@ -138,7 +138,7 @@ public class BookStatusActivity extends Activity { } private void setupCover(Book book) { - final ImageView coverView = (ImageView) findViewById(R.id.book_cover); + final ImageView coverView = (ImageView)findViewById(R.id.book_cover); final int maxHeight = 250; // FIXME: hardcoded constant final int maxWidth = maxHeight * 3 / 4; @@ -146,21 +146,15 @@ public class BookStatusActivity extends Activity { coverView.setVisibility(View.GONE); coverView.setImageDrawable(null); - final FormatPlugin plugin = PluginCollection.Instance().getPlugin(book.File); - if (plugin == null) { + if (myImage == null) { return; } - final ZLImage image = plugin.readCover(book); - if (image == null) { - return; - } - - if (image instanceof ZLLoadableImage) { - ((ZLLoadableImage)image).synchronize(); + if (myImage instanceof ZLLoadableImage) { + ((ZLLoadableImage)myImage).synchronize(); } final ZLAndroidImageData data = - ((ZLAndroidImageManager)ZLAndroidImageManager.Instance()).getImageData(image); + ((ZLAndroidImageManager)ZLAndroidImageManager.Instance()).getImageData(myImage); if (data == null) { return; } diff --git a/src/org/geometerplus/android/fbreader/library/FileManager.java b/src/org/geometerplus/android/fbreader/library/FileManager.java index 8bae27c82..a3275ca53 100644 --- a/src/org/geometerplus/android/fbreader/library/FileManager.java +++ b/src/org/geometerplus/android/fbreader/library/FileManager.java @@ -268,11 +268,7 @@ public final class FileManager extends BaseActivity { public ZLImage getCover() { if (!myCoverIsInitialized) { myCoverIsInitialized = true; - final Book book = getBook(); - final FormatPlugin plugin = PluginCollection.Instance().getPlugin(myFile); - if (book != null && plugin != null) { - myCover = plugin.readCover(book); - } + myCover = Library.getCover(myFile); } return myCover; } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java index c61369de0..3e97677b5 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java @@ -24,10 +24,8 @@ import java.util.Set; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; -//import android.util.StringBuilderPrinter; import android.view.View; import android.widget.ImageView; -//import android.widget.LinearLayout; import android.widget.TextView; import android.content.Intent; import android.graphics.Bitmap; @@ -43,9 +41,7 @@ import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageData; import org.geometerplus.fbreader.network.*; - public class NetworkBookInfoActivity extends Activity implements NetworkView.EventListener { - private NetworkBookItem myBook; private final ZLResource myResource = ZLResource.resource("networkBookView"); @@ -79,27 +75,6 @@ public class NetworkBookInfoActivity extends Activity implements NetworkView.Eve setupInfo(); setupCover(); setupButtons(); - - /*LinearLayout layout = (LinearLayout) findViewById(R.id.network_book_cover).getParent(); - TextView detailsTitle = new TextView(this, null, android.R.attr.listSeparatorTextViewStyle); - TextView details = new TextView(this); - detailsTitle.setText("Debug Details"); - - StringBuilder builder = new StringBuilder(); - StringBuilderPrinter printer = new StringBuilderPrinter(builder); - - printer.println("Id = " + myBook.Id); - printer.println("Index = " + myBook.Index); - printer.println("Cover = " + myBook.Cover); - printer.println("References (" + myBook.myReferences.size() + "):"); - for (BookReference ref: myBook.myReferences) { - printer.println( ref.toString() ); - } - - details.setText(builder.toString()); - - layout.addView(detailsTitle); - layout.addView(details);*/ } @Override diff --git a/src/org/geometerplus/fbreader/formats/FormatPlugin.java b/src/org/geometerplus/fbreader/formats/FormatPlugin.java index 8b9d716aa..392b0d1ad 100644 --- a/src/org/geometerplus/fbreader/formats/FormatPlugin.java +++ b/src/org/geometerplus/fbreader/formats/FormatPlugin.java @@ -28,7 +28,7 @@ public abstract class FormatPlugin { public abstract boolean acceptsFile(ZLFile file); public abstract boolean readMetaInfo(Book book); public abstract boolean readModel(BookModel model); - public abstract ZLImage readCover(Book book); + public abstract ZLImage readCover(ZLFile file); /* public static void detectEncodingAndLanguage(Book book, InputStream stream) throws IOException { diff --git a/src/org/geometerplus/fbreader/formats/fb2/FB2Plugin.java b/src/org/geometerplus/fbreader/formats/fb2/FB2Plugin.java index 2855b9d37..20a503bf3 100644 --- a/src/org/geometerplus/fbreader/formats/fb2/FB2Plugin.java +++ b/src/org/geometerplus/fbreader/formats/fb2/FB2Plugin.java @@ -42,7 +42,7 @@ public class FB2Plugin extends FormatPlugin { } @Override - public ZLImage readCover(Book book) { - return new FB2CoverReader().readCover(book.File); + public ZLImage readCover(ZLFile file) { + return new FB2CoverReader().readCover(file); } } diff --git a/src/org/geometerplus/fbreader/formats/html/HtmlPlugin.java b/src/org/geometerplus/fbreader/formats/html/HtmlPlugin.java index 4bea8b8bd..4bb9b7e6e 100644 --- a/src/org/geometerplus/fbreader/formats/html/HtmlPlugin.java +++ b/src/org/geometerplus/fbreader/formats/html/HtmlPlugin.java @@ -50,7 +50,7 @@ public class HtmlPlugin extends FormatPlugin { } @Override - public ZLImage readCover(Book book) { + public ZLImage readCover(ZLFile file) { return null; } } diff --git a/src/org/geometerplus/fbreader/formats/oeb/OEBPlugin.java b/src/org/geometerplus/fbreader/formats/oeb/OEBPlugin.java index e294f413f..8bddb184c 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/OEBPlugin.java +++ b/src/org/geometerplus/fbreader/formats/oeb/OEBPlugin.java @@ -58,8 +58,8 @@ public class OEBPlugin extends FormatPlugin { } @Override - public ZLImage readCover(Book book) { - final ZLFile opfFile = getOpfFile(book.File); + public ZLImage readCover(ZLFile file) { + final ZLFile opfFile = getOpfFile(file); return (opfFile != null) ? new OEBCoverReader().readCover(opfFile) : null; } } diff --git a/src/org/geometerplus/fbreader/formats/pdb/MobipocketPlugin.java b/src/org/geometerplus/fbreader/formats/pdb/MobipocketPlugin.java index eac8ac6d3..24b397260 100644 --- a/src/org/geometerplus/fbreader/formats/pdb/MobipocketPlugin.java +++ b/src/org/geometerplus/fbreader/formats/pdb/MobipocketPlugin.java @@ -133,10 +133,10 @@ public class MobipocketPlugin extends PdbPlugin { } @Override - public ZLImage readCover(Book book) { + public ZLImage readCover(ZLFile file) { InputStream stream = null; try { - stream = book.File.getInputStream(); + stream = file.getInputStream(); final PdbHeader header = new PdbHeader(stream); PdbUtil.skip(stream, header.Offsets[0] + 16 - header.length()); if (PdbUtil.readInt(stream) != 0x4D4F4249) /* "MOBI" */ { @@ -202,11 +202,10 @@ public class MobipocketPlugin extends PdbPlugin { coverIndex = thumbIndex; } - final ZLFile file = book.File; - final MobipocketStream mpStream = new MobipocketStream(file); - // TODO: implement - /*int index = pbStream.firstImageLocationIndex(file.path()); + /*final MobipocketStream mpStream = new MobipocketStream(file); + + int index = pbStream.firstImageLocationIndex(file.path()); if (index >= 0) { std::pair imageLocation = pbStream.imageLocation(pbStream.header(), index + coverIndex); if ((imageLocation.first > 0) && (imageLocation.second > 0)) { diff --git a/src/org/geometerplus/fbreader/formats/plucker/PluckerPlugin.java b/src/org/geometerplus/fbreader/formats/plucker/PluckerPlugin.java index a850d6a57..793a1770e 100644 --- a/src/org/geometerplus/fbreader/formats/plucker/PluckerPlugin.java +++ b/src/org/geometerplus/fbreader/formats/plucker/PluckerPlugin.java @@ -57,7 +57,7 @@ public class PluckerPlugin extends PdbPlugin { } @Override - public ZLImage readCover(Book book) { + public ZLImage readCover(ZLFile file) { return null; } } diff --git a/src/org/geometerplus/fbreader/library/BookTree.java b/src/org/geometerplus/fbreader/library/BookTree.java index d2c45b60e..d619897f2 100644 --- a/src/org/geometerplus/fbreader/library/BookTree.java +++ b/src/org/geometerplus/fbreader/library/BookTree.java @@ -60,11 +60,6 @@ public class BookTree extends LibraryTree { @Override protected ZLImage createCover() { - final FormatPlugin plugin = PluginCollection.Instance().getPlugin(Book.File); - if (plugin != null) { - return plugin.readCover(Book); - } - - return null; + return Library.getCover(Book.File); } } diff --git a/src/org/geometerplus/fbreader/library/Library.java b/src/org/geometerplus/fbreader/library/Library.java index f2858c14f..a261632ef 100644 --- a/src/org/geometerplus/fbreader/library/Library.java +++ b/src/org/geometerplus/fbreader/library/Library.java @@ -21,10 +21,14 @@ package org.geometerplus.fbreader.library; import java.io.File; import java.util.*; +//import java.lang.ref.WeakReference; import org.geometerplus.zlibrary.core.filesystem.*; +import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.zlibrary.core.util.ZLMiscUtil; +import org.geometerplus.fbreader.formats.FormatPlugin; +import org.geometerplus.fbreader.formats.PluginCollection; import org.geometerplus.fbreader.Paths; public final class Library { @@ -425,4 +429,43 @@ public final class Library { book.File.getPhysicalFile().delete(); } } + + /* + private static final HashMap> ourCoverMap = + new HashMap>(); + private static final WeakReference NULL_IMAGE = new WeakReference(null); + */ + + public static ZLImage getCover(ZLFile file) { + final FormatPlugin plugin = PluginCollection.Instance().getPlugin(file); + if (plugin != null) { + return plugin.readCover(file); + } + return null; + /* + synchronized(ourCoverMap) { + final String path = file.getPath(); + final WeakReference ref = ourCoverMap.get(path); + if (ref == NULL_IMAGE) { + return null; + } else if (ref != null) { + final ZLImage image = ref.get(); + if (image != null) { + return image; + } + } + ZLImage image = null; + final FormatPlugin plugin = PluginCollection.Instance().getPlugin(file); + if (plugin != null) { + image = plugin.readCover(file); + } + if (image == null) { + ourCoverMap.put(path, NULL_IMAGE); + } else { + ourCoverMap.put(path, new WeakReference(image)); + } + return image; + } + */ + } }