From b826f322bd68cf85b146bb391b8d00b3bc8a8f53 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 31 Oct 2014 22:11:56 +0200 Subject: [PATCH] fixed adding catalog from external plugin --- .../network/NetworkLibraryActivity.java | 102 +++++++++++++++--- .../android/fbreader/network/Util.java | 59 +--------- .../action/RefreshRootCatalogAction.java | 6 +- .../fbreader/network/NetworkLibrary.java | 13 ++- 4 files changed, 106 insertions(+), 74 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index d3530d3b8..5dfba84c8 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -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 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,18 +153,27 @@ public abstract class NetworkLibraryActivity extends TreeActivity i private boolean openTreeByIntent(Intent intent) { if (FBReaderIntents.Action.OPEN_NETWORK_CATALOG.equals(intent.getAction())) { final Uri uri = intent.getData(); - if (uri != null) { - final String id = uri.toString(); - final NetworkLibrary library = NetworkLibrary.Instance(); - library.setLinkActive(id, true); - library.synchronize(); - - final NetworkTree tree = library.getCatalogTreeByUrl(id); - if (tree != null) { - checkAndRun(new OpenCatalogAction(this, myNetworkContext), tree); - return true; - } + 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(NetworkLibraryActivity.this, myNetworkContext), + tree + ); + } + } + }); + return true; } return false; } @@ -509,4 +520,63 @@ public abstract class NetworkLibraryActivity extends TreeActivity i public void onScrollStateChanged(AbsListView view, int state) { } + + private final BroadcastReceiver myCatalogInfoReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final List 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(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 + ); + } } diff --git a/src/org/geometerplus/android/fbreader/network/Util.java b/src/org/geometerplus/android/fbreader/network/Util.java index 02fa302ec..d1c59ca6b 100644 --- a/src/org/geometerplus/android/fbreader/network/Util.java +++ b/src/org/geometerplus/android/fbreader/network/Util.java @@ -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 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(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 - ); - } } diff --git a/src/org/geometerplus/android/fbreader/network/action/RefreshRootCatalogAction.java b/src/org/geometerplus/android/fbreader/network/action/RefreshRootCatalogAction.java index 45ce0825e..bebf0f2e3 100644 --- a/src/org/geometerplus/android/fbreader/network/action/RefreshRootCatalogAction.java +++ b/src/org/geometerplus/android/fbreader/network/action/RefreshRootCatalogAction.java @@ -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(); } } diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 382120d32..f7841cfc6 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -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) { - myLinks.add(link); + 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) {