From c33d802c6d36c51fbff99322352513e57254516c Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 21 Nov 2010 18:28:43 +0000 Subject: [PATCH] NG Library view: recent books list (very slow at this moment) ZLAndroidLibrary.createImage() method has gone --- AndroidManifest.xml | 3 + AndroidManifest.xml.pattern | 3 + .../android/fbreader/LibraryTabActivity.java | 2 +- .../fbreader/library/LibraryBaseActivity.java | 49 ++++++----- .../library/LibraryRecentActivity.java} | 25 ++---- .../library/LibraryTopLevelActivity.java | 84 +++++++++++++++++-- .../network/AddCustomCatalogItemTree.java | 10 +-- .../fbreader/network/NetworkBaseActivity.java | 6 ++ .../fbreader/network/SearchItemTree.java | 10 +-- .../android/fbreader/tree/ZLAndroidTree.java | 24 ++++++ .../fbreader/bookmodel/BookModel.java | 2 +- .../fbreader/formats/PluginCollection.java | 2 +- .../geometerplus/fbreader/library/Book.java | 2 +- .../fbreader/library/BookTree.java | 17 ++++ .../fbreader/library/Library.java | 11 ++- .../ui/android/library/ZLAndroidLibrary.java | 6 -- 16 files changed, 189 insertions(+), 67 deletions(-) rename src/org/geometerplus/{zlibrary/ui/android/image/ZLAndroidResourceBasedImageData.java => android/fbreader/library/LibraryRecentActivity.java} (51%) create mode 100644 src/org/geometerplus/android/fbreader/tree/ZLAndroidTree.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d6bed874c..9402b7ffb 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -80,6 +80,9 @@ + + + diff --git a/AndroidManifest.xml.pattern b/AndroidManifest.xml.pattern index ec8668f21..42aa2575e 100644 --- a/AndroidManifest.xml.pattern +++ b/AndroidManifest.xml.pattern @@ -80,6 +80,9 @@ + + + diff --git a/src/org/geometerplus/android/fbreader/LibraryTabActivity.java b/src/org/geometerplus/android/fbreader/LibraryTabActivity.java index 16ca1e491..acf919438 100644 --- a/src/org/geometerplus/android/fbreader/LibraryTabActivity.java +++ b/src/org/geometerplus/android/fbreader/LibraryTabActivity.java @@ -98,7 +98,7 @@ public class LibraryTabActivity extends TabActivity implements MenuItem.OnMenuIt } }; System.err.println("before"); - action.run(); + action.run(); //AndroidUtil.wait("loadingBookList", action, this); System.err.println("after"); diff --git a/src/org/geometerplus/android/fbreader/library/LibraryBaseActivity.java b/src/org/geometerplus/android/fbreader/library/LibraryBaseActivity.java index cc49aca5d..9441638b3 100644 --- a/src/org/geometerplus/android/fbreader/library/LibraryBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/library/LibraryBaseActivity.java @@ -22,16 +22,23 @@ package org.geometerplus.android.fbreader.library; import java.util.List; import android.app.ListActivity; +import android.graphics.Bitmap; import android.os.Bundle; import android.view.*; import android.widget.*; import org.geometerplus.zlibrary.core.resources.ZLResource; +import org.geometerplus.zlibrary.core.image.ZLImage; + +import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageData; +import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageManager; import org.geometerplus.fbreader.tree.FBTree; import org.geometerplus.zlibrary.ui.android.R; +import org.geometerplus.android.fbreader.tree.ZLAndroidTree; + public class LibraryBaseActivity extends ListActivity { protected final ZLResource myResource = ZLResource.resource("libraryView"); @@ -42,6 +49,7 @@ public class LibraryBaseActivity extends ListActivity { @Override public void onListItemClick(ListView listView, View view, int position, long rowId) { + FBTree tree = ((LibraryAdapter)getListAdapter()).getItem(position); } protected final class LibraryAdapter extends BaseAdapter { @@ -90,30 +98,27 @@ public class LibraryBaseActivity extends ListActivity { coverView.getLayoutParams().height = myCoverHeight; coverView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); coverView.requestLayout(); - coverView.setImageResource(R.drawable.fbreader); - //setupCover(coverView, tree, myCoverWidth, myCoverWidth); + if (tree instanceof ZLAndroidTree) { + coverView.setImageResource(((ZLAndroidTree)tree).getCoverResourceId()); + } else { + Bitmap coverBitmap = null; + ZLImage cover = tree.getCover(); + if (cover != null) { + final ZLAndroidImageData data = + ((ZLAndroidImageManager)ZLAndroidImageManager.Instance()).getImageData(cover); + if (data != null) { + coverBitmap = data.getBitmap(2 * myCoverWidth, 2 * myCoverHeight); + } + } + if (coverBitmap != null) { + coverView.setImageBitmap(coverBitmap); + } else { + coverView.setImageResource(R.drawable.fbreader); + } + } + return view; } } - - /* - private void setupCover(final ImageView coverView, FBTree tree, int width, int height) { - Bitmap coverBitmap = null; - ZLImage cover = tree.getCover(); - if (cover != null) { - ZLAndroidImageData data = null; - final ZLAndroidImageManager mgr = (ZLAndroidImageManager) ZLAndroidImageManager.Instance(); - data = mgr.getImageData(cover); - if (data != null) { - coverBitmap = data.getBitmap(2 * width, 2 * height); - } - } - if (coverBitmap != null) { - coverView.setImageBitmap(coverBitmap); - } else { - coverView.setImageResource(R.drawable.fbreader); - } - } - */ } diff --git a/src/org/geometerplus/zlibrary/ui/android/image/ZLAndroidResourceBasedImageData.java b/src/org/geometerplus/android/fbreader/library/LibraryRecentActivity.java similarity index 51% rename from src/org/geometerplus/zlibrary/ui/android/image/ZLAndroidResourceBasedImageData.java rename to src/org/geometerplus/android/fbreader/library/LibraryRecentActivity.java index f50093d85..d38a8529c 100644 --- a/src/org/geometerplus/zlibrary/ui/android/image/ZLAndroidResourceBasedImageData.java +++ b/src/org/geometerplus/android/fbreader/library/LibraryRecentActivity.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Geometer Plus + * Copyright (C) 2010 Geometer Plus * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,24 +17,17 @@ * 02110-1301, USA. */ -package org.geometerplus.zlibrary.ui.android.image; +package org.geometerplus.android.fbreader.library; -import org.geometerplus.zlibrary.core.image.ZLImage; +import android.os.Bundle; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.content.res.Resources; +import org.geometerplus.fbreader.library.Library; -public final class ZLAndroidResourceBasedImageData extends ZLAndroidImageData implements ZLImage { - private final Resources myResources; - private final int myId; +public class LibraryRecentActivity extends LibraryBaseActivity { + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); - public ZLAndroidResourceBasedImageData(Resources resources, int id) { - myResources = resources; - myId = id; - } - - protected Bitmap decodeWithOptions(BitmapFactory.Options options) { - return BitmapFactory.decodeResource(myResources, myId, options); + setListAdapter(new LibraryAdapter(new Library().recentBooks().subTrees())); } } diff --git a/src/org/geometerplus/android/fbreader/library/LibraryTopLevelActivity.java b/src/org/geometerplus/android/fbreader/library/LibraryTopLevelActivity.java index 25f7d5b6c..3f261d172 100644 --- a/src/org/geometerplus/android/fbreader/library/LibraryTopLevelActivity.java +++ b/src/org/geometerplus/android/fbreader/library/LibraryTopLevelActivity.java @@ -21,31 +21,93 @@ package org.geometerplus.android.fbreader.library; import java.util.ArrayList; +import android.content.Intent; import android.os.Bundle; +import android.view.View; +import android.widget.ListView; import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.fbreader.tree.FBTree; +import org.geometerplus.zlibrary.ui.android.R; + +import org.geometerplus.android.fbreader.SQLiteBooksDatabase; +import org.geometerplus.android.fbreader.tree.ZLAndroidTree; + public class LibraryTopLevelActivity extends LibraryBaseActivity { @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + + if (SQLiteBooksDatabase.Instance() == null) { + new SQLiteBooksDatabase("LIBRARY_NG"); + } + final ArrayList items = new ArrayList(); - items.add(new TopLevelTree(myResource.getResource("searchResults"))); - items.add(new TopLevelTree(myResource.getResource("recent"))); - items.add(new TopLevelTree(myResource.getResource("byAuthor"))); - items.add(new TopLevelTree(myResource.getResource("byTag"))); - items.add(new TopLevelTree(myResource.getResource("fileTree"))); + items.add(new TopLevelTree( + myResource.getResource("searchResults"), + R.drawable.ic_tab_library_results, + new Runnable() { + public void run() { + } + } + )); + items.add(new TopLevelTree( + myResource.getResource("recent"), + R.drawable.ic_tab_library_recent, + new Runnable() { + public void run() { + startActivity(new Intent( + LibraryTopLevelActivity.this, + LibraryRecentActivity.class + )); + } + } + )); + items.add(new TopLevelTree( + myResource.getResource("byAuthor"), + R.drawable.ic_tab_library_author, + new Runnable() { + public void run() { + } + } + )); + items.add(new TopLevelTree( + myResource.getResource("byTag"), + R.drawable.ic_tab_library_tag, + new Runnable() { + public void run() { + } + } + )); + items.add(new TopLevelTree( + myResource.getResource("fileTree"), + R.drawable.fbreader, + new Runnable() { + public void run() { + } + } + )); setListAdapter(new LibraryAdapter(items)); } + + @Override + public void onListItemClick(ListView listView, View view, int position, long rowId) { + TopLevelTree tree = (TopLevelTree)((LibraryAdapter)getListAdapter()).getItem(position); + tree.getAction().run(); + } } -class TopLevelTree extends FBTree { +class TopLevelTree extends FBTree implements ZLAndroidTree { private final ZLResource myResource; + private final int myCoverResourceId; + private final Runnable myAction; - public TopLevelTree(ZLResource resource) { + public TopLevelTree(ZLResource resource, int coverResourceId, Runnable action) { myResource = resource; + myCoverResourceId = coverResourceId; + myAction = action; } @Override @@ -57,4 +119,12 @@ class TopLevelTree extends FBTree { public String getSummary() { return myResource.getResource("summary").getValue(); } + + public int getCoverResourceId() { + return myCoverResourceId; + } + + public Runnable getAction() { + return myAction; + } } diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java index 5e0dd9033..cfe7ed621 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java +++ b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java @@ -22,15 +22,14 @@ package org.geometerplus.android.fbreader.network; import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.zlibrary.core.resources.ZLResource; -import org.geometerplus.zlibrary.ui.android.library.ZLAndroidLibrary; import org.geometerplus.zlibrary.ui.android.R; import org.geometerplus.fbreader.network.NetworkLibraryItem; import org.geometerplus.fbreader.network.NetworkTree; +import org.geometerplus.android.fbreader.tree.ZLAndroidTree; -public class AddCustomCatalogItemTree extends NetworkTree { - +public class AddCustomCatalogItemTree extends NetworkTree implements ZLAndroidTree { public AddCustomCatalogItemTree() { super(1); } @@ -50,8 +49,7 @@ public class AddCustomCatalogItemTree extends NetworkTree { return null; } - @Override - protected ZLImage createCover() { - return ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).createImage(R.drawable.ic_list_plus); + public int getCoverResourceId() { + return R.drawable.ic_list_plus; } } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java index 91b464dff..25cf7b0e0 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java @@ -48,6 +48,7 @@ import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.NetworkImage; import org.geometerplus.fbreader.network.tree.NetworkBookTree; +import org.geometerplus.android.fbreader.tree.ZLAndroidTree; abstract class NetworkBaseActivity extends ListActivity implements NetworkView.EventListener, View.OnCreateContextMenuListener { @@ -113,6 +114,11 @@ abstract class NetworkBaseActivity extends ListActivity private HashSet myAwaitedCovers = new HashSet(); private void setupCover(final ImageView coverView, NetworkTree tree, int width, int height) { + if (tree instanceof ZLAndroidTree) { + coverView.setImageResource(((ZLAndroidTree)tree).getCoverResourceId()); + return; + } + Bitmap coverBitmap = null; ZLImage cover = tree.getCover(); if (cover != null) { diff --git a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java b/src/org/geometerplus/android/fbreader/network/SearchItemTree.java index 30db7d777..c8dce6a22 100644 --- a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java +++ b/src/org/geometerplus/android/fbreader/network/SearchItemTree.java @@ -30,10 +30,11 @@ import org.geometerplus.fbreader.tree.FBTree; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.tree.NetworkAuthorTree; -import org.geometerplus.zlibrary.ui.android.library.ZLAndroidLibrary; import org.geometerplus.zlibrary.ui.android.R; -public class SearchItemTree extends NetworkTree { +import org.geometerplus.android.fbreader.tree.ZLAndroidTree; + +public class SearchItemTree extends NetworkTree implements ZLAndroidTree { private SearchResult myResult; @@ -51,9 +52,8 @@ public class SearchItemTree extends NetworkTree { return ZLResource.resource("networkView").getResource("searchSummary").getValue(); } - @Override - protected ZLImage createCover() { - return ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).createImage(R.drawable.ic_list_searchresult); + public int getCoverResourceId() { + return R.drawable.ic_list_searchresult; } public void setSearchResult(SearchResult result) { diff --git a/src/org/geometerplus/android/fbreader/tree/ZLAndroidTree.java b/src/org/geometerplus/android/fbreader/tree/ZLAndroidTree.java new file mode 100644 index 000000000..15320fca1 --- /dev/null +++ b/src/org/geometerplus/android/fbreader/tree/ZLAndroidTree.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2010 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.fbreader.tree; + +public interface ZLAndroidTree { + int getCoverResourceId(); +} diff --git a/src/org/geometerplus/fbreader/bookmodel/BookModel.java b/src/org/geometerplus/fbreader/bookmodel/BookModel.java index e1b83bf75..1c11627dd 100644 --- a/src/org/geometerplus/fbreader/bookmodel/BookModel.java +++ b/src/org/geometerplus/fbreader/bookmodel/BookModel.java @@ -31,7 +31,7 @@ import org.geometerplus.fbreader.Paths; public final class BookModel { public static BookModel createModel(Book book) { - FormatPlugin plugin = PluginCollection.instance().getPlugin(book.File); + FormatPlugin plugin = PluginCollection.Instance().getPlugin(book.File); if (plugin == null) { return null; } diff --git a/src/org/geometerplus/fbreader/formats/PluginCollection.java b/src/org/geometerplus/fbreader/formats/PluginCollection.java index c1592a502..3082835b0 100644 --- a/src/org/geometerplus/fbreader/formats/PluginCollection.java +++ b/src/org/geometerplus/fbreader/formats/PluginCollection.java @@ -36,7 +36,7 @@ public class PluginCollection { public ZLStringOption DefaultEncodingOption; public ZLBooleanOption LanguageAutoDetectOption; - public static PluginCollection instance() { + public static PluginCollection Instance() { if (ourInstance == null) { ourInstance = new PluginCollection(); ourInstance.myPlugins.add(new FB2Plugin()); diff --git a/src/org/geometerplus/fbreader/library/Book.java b/src/org/geometerplus/fbreader/library/Book.java index 566a148ea..e6c85e3d3 100644 --- a/src/org/geometerplus/fbreader/library/Book.java +++ b/src/org/geometerplus/fbreader/library/Book.java @@ -116,7 +116,7 @@ public class Book { } boolean readMetaInfo() { - final FormatPlugin plugin = PluginCollection.instance().getPlugin(File); + final FormatPlugin plugin = PluginCollection.Instance().getPlugin(File); if ((plugin == null) || !plugin.readMetaInfo(this)) { return false; } diff --git a/src/org/geometerplus/fbreader/library/BookTree.java b/src/org/geometerplus/fbreader/library/BookTree.java index 7e6ffa5cd..d2c45b60e 100644 --- a/src/org/geometerplus/fbreader/library/BookTree.java +++ b/src/org/geometerplus/fbreader/library/BookTree.java @@ -19,6 +19,11 @@ package org.geometerplus.fbreader.library; +import org.geometerplus.zlibrary.core.image.ZLImage; + +import org.geometerplus.fbreader.formats.PluginCollection; +import org.geometerplus.fbreader.formats.FormatPlugin; + public class BookTree extends LibraryTree { public final Book Book; private final boolean myShowAuthors; @@ -29,10 +34,12 @@ public class BookTree extends LibraryTree { myShowAuthors = showAuthors; } + @Override public String getName() { return Book.getTitle(); } + @Override public String getSummary() { if (!myShowAuthors) { return super.getSummary(); @@ -50,4 +57,14 @@ public class BookTree extends LibraryTree { } return builder.toString(); } + + @Override + protected ZLImage createCover() { + final FormatPlugin plugin = PluginCollection.Instance().getPlugin(Book.File); + if (plugin != null) { + return plugin.readCover(Book); + } + + return null; + } } diff --git a/src/org/geometerplus/fbreader/library/Library.java b/src/org/geometerplus/fbreader/library/Library.java index d08ac839e..8c0ae6671 100644 --- a/src/org/geometerplus/fbreader/library/Library.java +++ b/src/org/geometerplus/fbreader/library/Library.java @@ -254,6 +254,7 @@ public final class Library { } final BooksDatabase db = BooksDatabase.Instance(); + myRecentBooks.clear(); for (long id : db.loadRecentBookIds()) { Book book = bookById.get(id); if (book != null) { @@ -293,7 +294,15 @@ public final class Library { } public LibraryTree recentBooks() { - synchronize(); + if (!myRecentBooks.hasChildren()) { + final BooksDatabase db = BooksDatabase.Instance(); + for (long id : db.loadRecentBookIds()) { + Book book = Book.getById(id); + if (book != null) { + myRecentBooks.createBookSubTree(book, true); + } + } + } return myRecentBooks; } diff --git a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidLibrary.java b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidLibrary.java index dcd0f0450..8b132c2ce 100644 --- a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidLibrary.java +++ b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidLibrary.java @@ -34,12 +34,10 @@ import org.geometerplus.zlibrary.core.library.ZLibrary; import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.filesystem.ZLResourceFile; import org.geometerplus.zlibrary.core.network.ZLNetworkException; -import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.zlibrary.ui.android.R; import org.geometerplus.zlibrary.ui.android.view.ZLAndroidWidget; import org.geometerplus.zlibrary.ui.android.dialogs.ZLAndroidDialogManager; -import org.geometerplus.zlibrary.ui.android.image.ZLAndroidResourceBasedImageData; import org.geometerplus.android.fbreader.network.BookDownloader; import org.geometerplus.android.fbreader.network.BookDownloaderService; @@ -108,10 +106,6 @@ public final class ZLAndroidLibrary extends ZLibrary { return new AndroidAssetsFile((AndroidAssetsFile)parent, name); } - public ZLImage createImage(int drawableId) { - return new ZLAndroidResourceBasedImageData(myApplication.getResources(), drawableId); - } - @Override public String getVersionName() { try {