1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-04 18:29:23 +02:00

fixed adding catalog from external plugin

This commit is contained in:
Nikolay Pultsin 2014-10-31 22:11:56 +02:00
parent 53ec85193b
commit b826f322bd
4 changed files with 106 additions and 74 deletions

View file

@ -22,22 +22,24 @@ package org.geometerplus.android.fbreader.network;
import java.util.*;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.*;
import android.net.Uri;
import android.os.Bundle;
import android.view.*;
import android.widget.*;
import org.geometerplus.zlibrary.core.network.ZLNetworkException;
import org.geometerplus.zlibrary.core.network.ZLNetworkManager;
import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.core.util.MimeType;
import org.geometerplus.zlibrary.core.util.ZLBoolean3;
import org.geometerplus.zlibrary.ui.android.network.SQLiteCookieDatabase;
import org.geometerplus.fbreader.network.NetworkLibrary;
import org.geometerplus.fbreader.network.NetworkTree;
import org.geometerplus.fbreader.network.*;
import org.geometerplus.fbreader.network.opds.OPDSCustomNetworkLink;
import org.geometerplus.fbreader.network.tree.*;
import org.geometerplus.fbreader.network.urlInfo.*;
import org.geometerplus.fbreader.tree.FBTree;
import org.geometerplus.android.fbreader.api.FBReaderIntents;
@ -95,7 +97,7 @@ public abstract class NetworkLibraryActivity extends TreeActivity<NetworkTree> i
Util.initLibrary(NetworkLibraryActivity.this, myNetworkContext, new Runnable() {
public void run() {
NetworkLibrary.Instance().runBackgroundUpdate(false);
Util.requestCatalogPlugins(NetworkLibraryActivity.this);
requestCatalogPlugins();
if (intent != null) {
openTreeByIntent(intent);
}
@ -151,19 +153,28 @@ public abstract class NetworkLibraryActivity extends TreeActivity<NetworkTree> i
private boolean openTreeByIntent(Intent intent) {
if (FBReaderIntents.Action.OPEN_NETWORK_CATALOG.equals(intent.getAction())) {
final Uri uri = intent.getData();
if (uri != null) {
if (uri == null) {
return false;
}
final String id = uri.toString();
addCustomLink(id, new Runnable() {
public void run() {
final NetworkLibrary library = NetworkLibrary.Instance();
library.setLinkActive(id, true);
library.synchronize();
onLibraryChanged(NetworkLibrary.ChangeListener.Code.SomeCode, new Object[0]);
final NetworkTree tree = library.getCatalogTreeByUrl(id);
if (tree != null) {
checkAndRun(new OpenCatalogAction(this, myNetworkContext), tree);
checkAndRun(
new OpenCatalogAction(NetworkLibraryActivity.this, myNetworkContext),
tree
);
}
}
});
return true;
}
}
}
return false;
}
@ -509,4 +520,63 @@ public abstract class NetworkLibraryActivity extends TreeActivity<NetworkTree> i
public void onScrollStateChanged(AbsListView view, int state) {
}
private final BroadcastReceiver myCatalogInfoReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final List<String> urls =
getResultExtras(true).getStringArrayList("fbreader.catalog.ids");
if (urls == null || urls.isEmpty()) {
return;
}
for (String u : urls) {
addCustomLink(u, null);
}
}
};
private void addCustomLink(String url, final Runnable postAction) {
final NetworkLibrary library = NetworkLibrary.Instance();
if (library.getLinkByUrl(url) != null) {
if (postAction != null) {
runOnUiThread(postAction);
}
return;
}
final ICustomNetworkLink link = new OPDSCustomNetworkLink(
INetworkLink.INVALID_ID,
INetworkLink.Type.Custom,
null, null, null,
new UrlInfoCollection<UrlInfoWithDate>(new UrlInfoWithDate(
UrlInfo.Type.Catalog, url, MimeType.APP_ATOM_XML
))
);
final Runnable loader = new Runnable() {
public void run() {
try {
link.reloadInfo(myNetworkContext, false, false);
library.addCustomLink(link);
if (postAction != null) {
runOnUiThread(postAction);
}
} catch (ZLNetworkException e) {
e.printStackTrace();
}
}
};
new Thread(loader).start();
}
public void requestCatalogPlugins() {
sendOrderedBroadcast(
new Intent(Util.EXTRA_CATALOG_ACTION),
null,
myCatalogInfoReceiver,
null,
RESULT_OK,
null,
null
);
}
}

View file

@ -22,17 +22,17 @@ package org.geometerplus.android.fbreader.network;
import java.util.List;
import android.app.Activity;
import android.content.*;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import org.geometerplus.zlibrary.core.network.*;
import org.geometerplus.zlibrary.core.network.ZLNetworkContext;
import org.geometerplus.zlibrary.core.options.Config;
import org.geometerplus.zlibrary.core.util.MimeType;
import org.geometerplus.fbreader.network.*;
import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager;
import org.geometerplus.fbreader.network.opds.OPDSCustomNetworkLink;
import org.geometerplus.fbreader.network.urlInfo.*;
import org.geometerplus.fbreader.network.urlInfo.BookUrlInfo;
import org.geometerplus.fbreader.network.urlInfo.UrlInfo;
import org.geometerplus.android.util.UIUtil;
import org.geometerplus.android.util.PackageUtil;
@ -136,53 +136,4 @@ public abstract class Util implements UserRegistrationConstants {
);
}
}
private static final BroadcastReceiver catalogInfoReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final List<String> urls =
getResultExtras(true).getStringArrayList("fbreader.catalog.ids");
if (urls == null || urls.isEmpty()) {
return;
}
final NetworkLibrary library = NetworkLibrary.Instance();
for (String u : urls) {
if (library.getLinkByUrl(u) != null) {
continue;
}
final ICustomNetworkLink link = new OPDSCustomNetworkLink(
INetworkLink.INVALID_ID,
INetworkLink.Type.Custom,
null, null, null,
new UrlInfoCollection<UrlInfoWithDate>(new UrlInfoWithDate(
UrlInfo.Type.Catalog, u, MimeType.APP_ATOM_XML
))
);
final Runnable loader = new Runnable() {
public void run() {
try {
link.reloadInfo(new QuietNetworkContext(), false, false);
library.addCustomLink(link);
} catch (ZLNetworkException e) {
e.printStackTrace();
}
}
};
new Thread(loader).start();
}
}
};
public static void requestCatalogPlugins(Activity activity) {
activity.sendOrderedBroadcast(
new Intent(EXTRA_CATALOG_ACTION),
null,
catalogInfoReceiver,
null,
Activity.RESULT_OK,
null,
null
);
}
}

View file

@ -26,10 +26,10 @@ import org.geometerplus.fbreader.network.NetworkLibrary;
import org.geometerplus.zlibrary.ui.android.R;
import org.geometerplus.android.fbreader.network.Util;
import org.geometerplus.android.fbreader.network.NetworkLibraryActivity;
public class RefreshRootCatalogAction extends RootAction {
public RefreshRootCatalogAction(Activity activity) {
public RefreshRootCatalogAction(NetworkLibraryActivity activity) {
super(activity, ActionCode.REFRESH, "refreshCatalogsList", R.drawable.ic_menu_refresh);
}
@ -41,6 +41,6 @@ public class RefreshRootCatalogAction extends RootAction {
@Override
public void run(NetworkTree tree) {
NetworkLibrary.Instance().runBackgroundUpdate(true);
Util.requestCatalogPlugins(myActivity);
((NetworkLibraryActivity)myActivity).requestCatalogPlugins();
}
}

View file

@ -124,6 +124,7 @@ public class NetworkLibrary {
return;
}
setLinkActive(link.getUrl(UrlInfo.Type.Catalog), active);
myChildrenAreInvalid = true;
}
public void setLinkActive(String id, boolean active) {
@ -592,7 +593,16 @@ public class NetworkLibrary {
public void addCustomLink(ICustomNetworkLink link) {
final int id = link.getId();
if (id == ICustomNetworkLink.INVALID_ID) {
synchronized (myLinks) {
final INetworkLink existing = getLinkByUrl(link.getUrl(UrlInfo.Type.Catalog));
if (existing == null) {
myLinks.add(link);
} else {
setLinkActive(existing, true);
fireModelChangedEvent(ChangeListener.Code.SomeCode);
return;
}
}
} else {
synchronized (myLinks) {
for (int i = myLinks.size() - 1; i >= 0; --i) {
@ -606,6 +616,7 @@ public class NetworkLibrary {
}
NetworkDatabase.Instance().saveLink(link);
setLinkActive(link, true);
fireModelChangedEvent(ChangeListener.Code.SomeCode);
}
public void removeCustomLink(ICustomNetworkLink link) {