diff --git a/ChangeLog b/ChangeLog index a24794d63..bd1047a2e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ * opds:// URLs support has been implemented * Unexpected search call has been fixed * Ignore case comparison for zip entry names +* Fixed custom OPDS link search +* Periodical update of custom links information has been added ===== 0.99.13 (Feb 13, 2011) ===== * Fixed book/position forgetting bug diff --git a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java index b96637cdf..9880ed79c 100644 --- a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java +++ b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java @@ -85,7 +85,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { final String summary = cursor.getString(3); linksMap.clear(); - final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE url NOT NULL AND link_id = " + id, null); + final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE link_id = " + id, null); while (linksCursor.moveToNext()) { linksMap.put( linksCursor.getString(0), @@ -141,10 +141,10 @@ class SQLiteNetworkDatabase extends NetworkDatabase { link.setId((int) id); } else { id = link.getId(); - statement.bindLong(5, id); + statement.bindLong(4, id); statement.execute(); - final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE url NOT NULL AND link_id = " + link.getId(), null); + final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE link_id = " + link.getId(), null); while (linksCursor.moveToNext()) { linksMap.put( linksCursor.getString(0), diff --git a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java index c32a92af8..b99172214 100644 --- a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java @@ -37,6 +37,7 @@ public interface ICustomNetworkLink extends INetworkLink { void setUrl(String urlKey, String url); void removeUrl(String urlKey); + boolean isObsolete(long milliSeconds); void reloadInfo(boolean urlsOnly) throws ZLNetworkException; // returns true if next methods have changed link's data: diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 2580690e5..ef501b12c 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -244,6 +244,15 @@ public class NetworkLibrary { } } } + for (INetworkLink link : myLinks) { + if (link instanceof ICustomNetworkLink) { + final ICustomNetworkLink customLink = (ICustomNetworkLink)link; + if (customLink.isObsolete(12 * 60 * 60 * 1000)) { // 12 hours + customLink.reloadInfo(true); + NetworkDatabase.Instance().saveCustomLink(customLink); + } + } + } } } @@ -253,12 +262,11 @@ public class NetworkLibrary { // synchronize() method MUST be called after this method public void finishBackgroundUpdate() { synchronized (myBackgroundLock) { - if (myBackgroundLinks == null) { - return; - } synchronized (myLinks) { - removeAllLoadedLinks(); - myLinks.addAll(myBackgroundLinks); + if (myBackgroundLinks != null) { + removeAllLoadedLinks(); + myLinks.addAll(myBackgroundLinks); + } invalidateChildren(); } } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java index 582b29ba2..da09d6138 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java @@ -85,13 +85,29 @@ public class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLin myHasChanges = myHasChanges || oldUrl != null; } - public void reloadInfo(boolean urlsOnly) throws ZLNetworkException { + public boolean isObsolete(long milliSeconds) { + final long old = System.currentTimeMillis() - milliSeconds; + + final Date searchUpdateDate = getUrlInfo(URL_SEARCH).Updated; + if (searchUpdateDate == null || searchUpdateDate.getTime() < old) { + return true; + } + + final Date iconUpdateDate = getUrlInfo(URL_ICON).Updated; + if (iconUpdateDate == null || iconUpdateDate.getTime() < old) { + return true; + } + + return false; + } + + public void reloadInfo(final boolean urlsOnly) throws ZLNetworkException { final LinkedList opensearchDescriptionURLs = new LinkedList(); final List descriptions = Collections.synchronizedList(new LinkedList()); ZLNetworkException error = null; try { - ZLNetworkManager.Instance().perform(new ZLNetworkRequest(getUrlInfo(INetworkLink.URL_MAIN).URL) { + ZLNetworkManager.Instance().perform(new ZLNetworkRequest(getUrlInfo(URL_MAIN).URL) { @Override public void handleStream(URLConnection connection, InputStream inputStream) throws IOException, ZLNetworkException { final CatalogInfoReader info = new CatalogInfoReader(URL, OPDSCustomLink.this, opensearchDescriptionURLs); @@ -103,12 +119,14 @@ public class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLin if (info.Title == null) { throw new ZLNetworkException(NetworkException.ERROR_NO_REQUIRED_INFORMATION); } - myTitle = info.Title; setUrl(URL_ICON, info.Icon); - mySummary = info.Summary; if (info.DirectOpenSearchDescription != null) { descriptions.add(info.DirectOpenSearchDescription); } + if (!urlsOnly) { + myTitle = info.Title; + mySummary = info.Summary; + } } }); } catch (ZLNetworkException e) {