1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 10:49:24 +02:00

Library updating changes

git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@1687 6a642e6f-84f6-412e-ac94-c4a38d5a04b0
This commit is contained in:
Vasiliy Bout 2010-09-02 19:41:35 +00:00
parent e688b18c59
commit 31f8e71bed
8 changed files with 133 additions and 39 deletions

View file

@ -17,10 +17,10 @@ NP: оповещение об изменениях в namespace'ах проис
DONE перенести xml на сервер DONE перенести xml на сервер
DONE кэширование каталога DONE кэширование каталога
DONE сделать кнопку "Обновить список каталогов" -- форсировать обновление кэша DONE сделать кнопку "Обновить список каталогов" -- форсировать обновление кэша
** умное обновление каталогов согласно ID и UPDATED: DONE умное обновление каталогов согласно ID и данным в Link'ах
** добавлять новые DONE добавлять новые
** пересоздавать измененные DONE пересоздавать измененные
** удалять только если нет детей DONE удалять только если нет детей
** Использовать default e-mail при регистрации новых пользователей в AuthenticationDialog (возможно только в Android 2.0+) ** Использовать default e-mail при регистрации новых пользователей в AuthenticationDialog (возможно только в Android 2.0+)
** сделать кнопку ** сделать кнопку

View file

@ -466,7 +466,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
private void removeCustomLink(ICustomNetworkLink link) { private void removeCustomLink(ICustomNetworkLink link) {
final NetworkLibrary library = NetworkLibrary.Instance(); final NetworkLibrary library = NetworkLibrary.Instance();
library.removeCustomLink(link); library.removeCustomLink(link);
library.invalidate(); library.updateChildren();
library.synchronize(); library.synchronize();
NetworkView.Instance().fireModelChanged(); NetworkView.Instance().fireModelChanged();
} }

View file

@ -80,7 +80,7 @@ abstract class NetworkDialog {
} }
final NetworkLibrary library = NetworkLibrary.Instance(); final NetworkLibrary library = NetworkLibrary.Instance();
if (message.arg1 != 0) { if (message.arg1 != 0) {
library.invalidate(); library.invalidateChildren();
} }
library.invalidateVisibility(); library.invalidateVisibility();
library.synchronize(); library.synchronize();

View file

@ -42,4 +42,11 @@ public interface ICustomNetworkLink extends INetworkLink {
void removeLink(String urlKey); void removeLink(String urlKey);
String reloadInfo(); String reloadInfo();
// returns true if next methods have changed link's data:
// setSiteName, setTitle, setSummary, setIcon, setLink, removeLink
boolean hasChanges();
// resets hasChanged() result
void resetChanges();
} }

View file

@ -21,6 +21,8 @@ package org.geometerplus.fbreader.network;
import java.util.*; import java.util.*;
import android.util.Log;
import org.geometerplus.zlibrary.core.util.ZLNetworkUtil; import org.geometerplus.zlibrary.core.util.ZLNetworkUtil;
import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.options.ZLStringOption;
import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest;
@ -184,24 +186,20 @@ public class NetworkLibrary {
} }
private static class LinksComparator implements Comparator<INetworkLink> { private static class LinksComparator implements Comparator<INetworkLink> {
private static String filterLinkTitle(String title) {
for (int index = 0; index < title.length(); ++index) {
final char ch = title.charAt(index);
if (ch < 128 && Character.isLetter(ch)) {
return title.substring(index);
}
}
return title;
}
public int compare(INetworkLink link1, INetworkLink link2) { public int compare(INetworkLink link1, INetworkLink link2) {
String title1 = link1.getTitle(); final String title1 = filterLinkTitle(link1.getTitle());
for (int index = 0; index < title1.length(); ++index) { final String title2 = filterLinkTitle(link2.getTitle());
final char ch = title1.charAt(index); return title1.compareToIgnoreCase(title2);
if (ch < 128 && Character.isLetter(ch)) {
title1 = title1.substring(index);
break;
}
}
String title2 = link2.getTitle();
for (int index = 0; index < title2.length(); ++index) {
final char ch = title2.charAt(index);
if (ch < 128 && Character.isLetter(ch)) {
title2 = title2.substring(index);
break;
}
}
return title1.compareTo(title2);
} }
} }
@ -220,6 +218,7 @@ public class NetworkLibrary {
private final RootTree myRootTree = new RootTree(); private final RootTree myRootTree = new RootTree();
private boolean myUpdateChildren = true; private boolean myUpdateChildren = true;
private boolean myInvalidateChildren;
private boolean myUpdateVisibility; private boolean myUpdateVisibility;
private NetworkLibrary() { private NetworkLibrary() {
@ -329,7 +328,7 @@ public class NetworkLibrary {
synchronized (myLinks) { synchronized (myLinks) {
myLoadedLinks.clear(); myLoadedLinks.clear();
myLoadedLinks.addAll(myBackgroundLinks); myLoadedLinks.addAll(myBackgroundLinks);
invalidate(); updateChildren();
} }
} }
} }
@ -347,7 +346,11 @@ public class NetworkLibrary {
return url; return url;
} }
public void invalidate() { public void invalidateChildren() {
myInvalidateChildren = true;
}
public void updateChildren() {
myUpdateChildren = true; myUpdateChildren = true;
} }
@ -355,7 +358,29 @@ public class NetworkLibrary {
myUpdateVisibility = true; myUpdateVisibility = true;
} }
private static boolean linksEqual(INetworkLink l1, INetworkLink l2) {
return l1 == l2 || l1.getSiteName().equals(l2.getSiteName());
}
private static boolean linkIsInvalid(INetworkLink link, INetworkLink nodeLink) {
if (link instanceof ICustomNetworkLink) {
if (link != nodeLink) {
throw new RuntimeException("Two equal custom links!!! That's impossible");
}
return ((ICustomNetworkLink) link).hasChanges();
}
return !link.equals(nodeLink);
}
private static void makeValid(INetworkLink link) {
if (link instanceof ICustomNetworkLink) {
((ICustomNetworkLink) link).resetChanges();
}
}
private void makeUpToDate() { private void makeUpToDate() {
Log.w("FBREADER", "makeUpToDate...");
final LinkedList<FBTree> toRemove = new LinkedList<FBTree>(); final LinkedList<FBTree> toRemove = new LinkedList<FBTree>();
ListIterator<FBTree> nodeIterator = myRootTree.subTrees().listIterator(); ListIterator<FBTree> nodeIterator = myRootTree.subTrees().listIterator();
@ -380,34 +405,49 @@ public class NetworkLibrary {
continue; continue;
} }
final INetworkLink nodeLink = ((NetworkCatalogTree) currentNode).Item.Link; final INetworkLink nodeLink = ((NetworkCatalogTree) currentNode).Item.Link;
if (nodeLink == link) { if (linksEqual(link, nodeLink)) {
if (link instanceof ICustomNetworkLink) { if (linkIsInvalid(link, nodeLink)) {
Log.w("FBREADER", "invalid link: " + link.getSiteName() + " /// " + link.getTitle());
toRemove.add(currentNode); toRemove.add(currentNode);
} else { } else {
Log.w("FBREADER", "link is ok: " + link.getSiteName() + " /// " + link.getTitle());
processed = true; processed = true;
} }
currentNode = null; currentNode = null;
++nodeCount; ++nodeCount;
break; break;
} else { } else {
boolean found = false; INetworkLink newNodeLink = null;
ListIterator<INetworkLink> jt = myLinks.listIterator(it); ListIterator<INetworkLink> jt = myLinks.listIterator(it);
while (jt.hasNext()) { while (jt.hasNext()) {
if (nodeLink == jt.next()) { final INetworkLink jlnk = jt.next();
found = true; if (linksEqual(nodeLink, jlnk)) {
newNodeLink = jlnk;
break; break;
} }
} }
if (!found) { if (newNodeLink == null) {
Log.w("FBREADER", "nodeLink not found: " + nodeLink.getSiteName() + " /// " + nodeLink.getTitle());
toRemove.add(currentNode); toRemove.add(currentNode);
currentNode = null; currentNode = null;
++nodeCount; ++nodeCount;
} else { } else {
break; if (linkIsInvalid(newNodeLink, nodeLink)) {
Log.w("FBREADER", "move nodeLink: " + nodeLink.getSiteName() + " /// " + nodeLink.getTitle());
Log.w("FBREADER", "new link will be: " + newNodeLink.getSiteName() + " /// " + newNodeLink.getTitle());
toRemove.add(currentNode);
currentNode = null;
++nodeCount;
} else {
Log.w("FBREADER", "need node for link: " + link.getSiteName() + " /// " + link.getTitle());
break;
}
} }
} }
} }
if (!processed) { if (!processed) {
Log.w("FBREADER", "create node for link: " + link.getSiteName() + " /// " + link.getTitle());
makeValid(link);
final int nextIndex = nodeIterator.nextIndex(); final int nextIndex = nodeIterator.nextIndex();
new NetworkCatalogRootTree(myRootTree, link, nodeCount++).Item.onDisplayItem(); new NetworkCatalogRootTree(myRootTree, link, nodeCount++).Item.onDisplayItem();
nodeIterator = myRootTree.subTrees().listIterator(nextIndex + 1); nodeIterator = myRootTree.subTrees().listIterator(nextIndex + 1);
@ -419,7 +459,10 @@ public class NetworkLibrary {
if (currentNode == null) { if (currentNode == null) {
currentNode = nodeIterator.next(); currentNode = nodeIterator.next();
} }
toRemove.add(currentNode); if (currentNode instanceof NetworkCatalogTree) {
Log.w("FBREADER", "remove node: " + currentNode.getName());
toRemove.add(currentNode);
}
currentNode = null; currentNode = null;
} }
@ -438,8 +481,14 @@ public class NetworkLibrary {
} }
public void synchronize() { public void synchronize() {
if (myUpdateChildren) { if (myUpdateChildren || myInvalidateChildren) {
if (myInvalidateChildren) {
final LinksComparator cmp = new LinksComparator();
//Collections.sort(myLoadedLinks, cmp); // this collection is always sorted
Collections.sort(myCustomLinks, cmp);
}
myUpdateChildren = false; myUpdateChildren = false;
myInvalidateChildren = false;
makeUpToDate(); makeUpToDate();
} }
if (myUpdateVisibility) { if (myUpdateVisibility) {

View file

@ -19,18 +19,38 @@
package org.geometerplus.fbreader.network.authentication; package org.geometerplus.fbreader.network.authentication;
import java.util.HashMap;
import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.options.ZLStringOption;
import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.*;
import org.geometerplus.fbreader.network.authentication.litres.LitResAuthenticationManager;
public abstract class NetworkAuthenticationManager { public abstract class NetworkAuthenticationManager {
private static final HashMap<String, NetworkAuthenticationManager> ourManagers = new HashMap<String, NetworkAuthenticationManager>();
public static NetworkAuthenticationManager createManager(INetworkLink link, String sslCertificate, Class<? extends NetworkAuthenticationManager> managerClass) {
NetworkAuthenticationManager mgr = ourManagers.get(link.getSiteName());
if (mgr == null) {
if (managerClass == LitResAuthenticationManager.class) {
mgr = new LitResAuthenticationManager(link, sslCertificate);
}
if (mgr != null) {
ourManagers.put(link.getSiteName(), mgr);
}
}
return mgr;
}
public final INetworkLink Link; public final INetworkLink Link;
public final ZLStringOption UserNameOption; public final ZLStringOption UserNameOption;
public final String SSLCertificate; public final String SSLCertificate;
public NetworkAuthenticationManager(INetworkLink link, String sslCertificate) { protected NetworkAuthenticationManager(INetworkLink link, String sslCertificate) {
Link = link; Link = link;
UserNameOption = new ZLStringOption(link.getSiteName(), "userName", ""); UserNameOption = new ZLStringOption(link.getSiteName(), "userName", "");
SSLCertificate = sslCertificate; SSLCertificate = sslCertificate;

View file

@ -26,6 +26,7 @@ import java.util.*;
import org.geometerplus.zlibrary.core.network.ZLNetworkManager; import org.geometerplus.zlibrary.core.network.ZLNetworkManager;
import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest;
import org.geometerplus.zlibrary.core.util.ZLMiscUtil;
import org.geometerplus.fbreader.network.ICustomNetworkLink; import org.geometerplus.fbreader.network.ICustomNetworkLink;
import org.geometerplus.fbreader.network.INetworkLink; import org.geometerplus.fbreader.network.INetworkLink;
@ -37,6 +38,8 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink {
private int myId; private int myId;
private SaveLinkListener myListener; private SaveLinkListener myListener;
private boolean myHasChanges;
OPDSCustomLink(int id, String siteName, String title, String summary, String icon, Map<String, String> links) { OPDSCustomLink(int id, String siteName, String title, String summary, String icon, Map<String, String> links) {
super(siteName, title, summary, icon, links, false); super(siteName, title, summary, icon, links, false);
myId = id; myId = id;
@ -62,19 +65,32 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink {
} }
} }
public boolean hasChanges() {
return myHasChanges;
}
public void resetChanges() {
myHasChanges = false;
}
public final void setIcon(String icon) { public final void setIcon(String icon) {
myHasChanges = myHasChanges || !ZLMiscUtil.equals(myIcon, icon);
myIcon = icon; myIcon = icon;
} }
public final void setSiteName(String name) { public final void setSiteName(String name) {
myHasChanges = myHasChanges || !ZLMiscUtil.equals(mySiteName, name);
mySiteName = name; mySiteName = name;
} }
public final void setSummary(String summary) { public final void setSummary(String summary) {
myHasChanges = myHasChanges || !ZLMiscUtil.equals(mySummary, summary);
mySummary = summary; mySummary = summary;
} }
public final void setTitle(String title) { public final void setTitle(String title) {
myHasChanges = myHasChanges || !ZLMiscUtil.equals(myTitle, title);
myTitle = title; myTitle = title;
} }
@ -82,12 +98,14 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink {
if (url == null) { if (url == null) {
removeLink(urlKey); removeLink(urlKey);
} else { } else {
myLinks.put(urlKey, url); final String oldUrl = myLinks.put(urlKey, url);
myHasChanges = myHasChanges || !url.equals(oldUrl);
} }
} }
public final void removeLink(String urlKey) { public final void removeLink(String urlKey) {
myLinks.remove(urlKey); final String oldUrl = myLinks.remove(urlKey);
myHasChanges = myHasChanges || oldUrl != null;
} }

View file

@ -188,9 +188,9 @@ class OPDSLinkXMLReader extends OPDSXMLReader {
NetworkAuthenticationManager authManager = null; NetworkAuthenticationManager authManager = null;
if (myAuthenticationType == "basic") { if (myAuthenticationType == "basic") {
//authManager = new BasicAuthenticationManager(opdsLink, sslCertificate); //authManager = NetworkAuthenticationManager.createManager(opdsLink, sslCertificate, BasicAuthenticationManager.class);
} else if (myAuthenticationType == "litres") { } else if (myAuthenticationType == "litres") {
authManager = new LitResAuthenticationManager(opdsLink, sslCertificate); authManager = NetworkAuthenticationManager.createManager(opdsLink, sslCertificate, LitResAuthenticationManager.class);
} }
opdsLink.setAuthenticationManager(authManager); opdsLink.setAuthenticationManager(authManager);