mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-05 02:39:23 +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:
parent
e688b18c59
commit
31f8e71bed
8 changed files with 133 additions and 39 deletions
|
@ -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+)
|
||||||
** сделать кнопку
|
** сделать кнопку
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
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;
|
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();
|
||||||
}
|
}
|
||||||
|
if (currentNode instanceof NetworkCatalogTree) {
|
||||||
|
Log.w("FBREADER", "remove node: " + currentNode.getName());
|
||||||
toRemove.add(currentNode);
|
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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue