mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-05 02:39:23 +02:00
Refresh catalogs
button
git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@1683 6a642e6f-84f6-412e-ac94-c4a38d5a04b0
This commit is contained in:
parent
af4852e1b0
commit
943f7cb314
15 changed files with 99 additions and 32 deletions
|
@ -16,7 +16,7 @@ NP: оповещение об изменениях в namespace'ах проис
|
|||
DONE сделать DTD для xml-ей, как в OPDS, вместо существующего
|
||||
DONE перенести xml на сервер
|
||||
DONE кэширование каталога
|
||||
** сделать кнопку "Обновить список каталогов" -- форсировать обновление кэша
|
||||
DONE сделать кнопку "Обновить список каталогов" -- форсировать обновление кэша
|
||||
** умное обновление каталогов согласно ID и UPDATED:
|
||||
** добавлять новые
|
||||
** пересоздавать измененные
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
<node name="signOut" value="Ausloggen (%s)"/>
|
||||
<node name="refillAccount" value="Account aufladen"/>
|
||||
<node name="addCustomCatalog" toBeTranslated="true" value="Add catalog"/>
|
||||
<node name="refreshCatalogsList" toBeTranslated="true" value="Refresh catalogs"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="networkBookView">
|
||||
|
@ -278,6 +279,7 @@
|
|||
<node name="purchaseBook" value="Buch wird gekauft. Bitte warten..." />
|
||||
<node name="registerUser" value="Neuer Account wird registriert. Bitte warten..." />
|
||||
<node name="loadingCatalogInfo" toBeTranslated="true" value="Loading catalog information. Please, wait..." />
|
||||
<node name="updatingCatalogsList" toBeTranslated="true" value="Updating catalogs list. Please, wait..."/>
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="internalError" value="Interner Server-Fehler" />
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
<node name="signOut" value="Sign out (%s)"/>
|
||||
<node name="refillAccount" value="Refill account"/>
|
||||
<node name="addCustomCatalog" value="Add catalog"/>
|
||||
<node name="refreshCatalogsList" value="Refresh catalogs"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="networkBookView">
|
||||
|
@ -277,6 +278,7 @@
|
|||
<node name="purchaseBook" value="Purchase book. Please, wait..." />
|
||||
<node name="registerUser" value="Registering new account. Please, wait..." />
|
||||
<node name="loadingCatalogInfo" value="Loading catalog information. Please, wait..." />
|
||||
<node name="updatingCatalogsList" value="Updating catalogs list. Please, wait..."/>
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="internalError" value="Internal server error" />
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
<node name="signOut" value="Déconnexion (%s)"/>
|
||||
<node name="refillAccount" value="Recréditer le compte"/>
|
||||
<node name="addCustomCatalog" toBeTranslated="true" value="Add catalog"/>
|
||||
<node name="refreshCatalogsList" toBeTranslated="true" value="Refresh catalogs"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="networkBookView">
|
||||
|
@ -278,6 +279,7 @@
|
|||
<node name="purchaseBook" value="Achat du livre. Veuillez patienter..."/>
|
||||
<node name="registerUser" value="Inscription en cours. Veuillez patienter..."/>
|
||||
<node name="loadingCatalogInfo" toBeTranslated="true" value="Loading catalog information. Please, wait..." />
|
||||
<node name="updatingCatalogsList" toBeTranslated="true" value="Updating catalogs list. Please, wait..."/>
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="internalError" value="Erreur interne du serveur"/>
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
<node name="signOut" value="Kijelentkezés (%s)"/>
|
||||
<node name="refillAccount" value="Számla feltöltése"/>
|
||||
<node name="addCustomCatalog" toBeTranslated="true" value="Add catalog"/>
|
||||
<node name="refreshCatalogsList" toBeTranslated="true" value="Refresh catalogs"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="networkBookView">
|
||||
|
@ -278,6 +279,7 @@
|
|||
<node name="purchaseBook" value="Könyv vásárlása. Kérjük, várjon..." />
|
||||
<node name="registerUser" value="Fiók létrehozása. Kérjük, várjon..." />
|
||||
<node name="loadingCatalogInfo" toBeTranslated="true" value="Loading catalog information. Please, wait..." />
|
||||
<node name="updatingCatalogsList" toBeTranslated="true" value="Updating catalogs list. Please, wait..."/>
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="internalError" value="Belső szerverhiba" />
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
<node name="signOut" value="Esci (%s)"/>
|
||||
<node name="refillAccount" value="Ricarica account"/>
|
||||
<node name="addCustomCatalog" value="Aggiungi catalogo"/>
|
||||
<node name="refreshCatalogsList" toBeTranslated="true" value="Refresh catalogs"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="networkBookView">
|
||||
|
@ -278,6 +279,7 @@
|
|||
<node name="purchaseBook" value="Acquisto libro. Attendere prego..." />
|
||||
<node name="registerUser" value="Registrazione nuovo account. Attendere prego..." />
|
||||
<node name="loadingCatalogInfo" toBeTranslated="true" value="Loading catalog information. Please, wait..." />
|
||||
<node name="updatingCatalogsList" toBeTranslated="true" value="Updating catalogs list. Please, wait..."/>
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="internalError" value="Errore Server Interno" />
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
<node name="signOut" value="Выйти (%s)"/>
|
||||
<node name="refillAccount" value="Пополнить счёт"/>
|
||||
<node name="addCustomCatalog" value="Добавить каталог"/>
|
||||
<node name="refreshCatalogsList" value="Обновить каталоги"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="networkBookView">
|
||||
|
@ -277,6 +278,7 @@
|
|||
<node name="purchaseBook" value="Идет покупка книги. Подождите, пожалуйста..." />
|
||||
<node name="registerUser" value="Регистрируем пользователя. Подождите, пожалуйста..." />
|
||||
<node name="loadingCatalogInfo" value="Загрузка информации из каталога. Подождите, пожалуйста..." />
|
||||
<node name="updatingCatalogsList" value="Обновляется список каталогов. Подождите, пожалуйста..."/>
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="internalError" value="Внутренняя ошибка сервера" />
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
<node name="signOut" value="Đăng xuất (%s)"/>
|
||||
<node name="refillAccount" value="Tái đầy tài khoản "/>
|
||||
<node name="addCustomCatalog" toBeTranslated="true" value="Add catalog"/>
|
||||
<node name="refreshCatalogsList" toBeTranslated="true" value="Refresh catalogs"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="networkBookView">
|
||||
|
@ -278,6 +279,7 @@
|
|||
<node name="purchaseBook" value="Mua sách. Xin chờ..." />
|
||||
<node name="registerUser" value="Đang đăng ký tài khoản. Xin chờ..." />
|
||||
<node name="loadingCatalogInfo" toBeTranslated="true" value="Loading catalog information. Please, wait..." />
|
||||
<node name="updatingCatalogsList" toBeTranslated="true" value="Updating catalogs list. Please, wait..."/>
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="internalError" value="Lỗi mạng nội bộ " />
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
<node name="signOut" value="退出 (%s)"/>
|
||||
<node name="refillAccount" toBeTranslated="true" value="Refill account"/>
|
||||
<node name="addCustomCatalog" toBeTranslated="true" value="Add catalog"/>
|
||||
<node name="refreshCatalogsList" toBeTranslated="true" value="Refresh catalogs"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="networkBookView">
|
||||
|
@ -278,6 +279,7 @@
|
|||
<node name="purchaseBook" value="书籍购买中. 请等待..." />
|
||||
<node name="registerUser" value="正在注册新账号,请稍等..." />
|
||||
<node name="loadingCatalogInfo" toBeTranslated="true" value="Loading catalog information. Please, wait..." />
|
||||
<node name="updatingCatalogsList" toBeTranslated="true" value="Updating catalogs list. Please, wait..."/>
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="internalError" value="内部服务器出错" />
|
||||
|
|
BIN
icons/menu/ic_menu_refresh.png
Normal file
BIN
icons/menu/ic_menu_refresh.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.4 KiB |
|
@ -46,7 +46,7 @@ public class LibraryInitializationService extends Service {
|
|||
final Handler handler = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
if (msg.what > 0) {
|
||||
if (msg.what > 0 && msg.obj == null) {
|
||||
view.finishBackgroundUpdate();
|
||||
}
|
||||
stopSelf();
|
||||
|
@ -55,11 +55,13 @@ public class LibraryInitializationService extends Service {
|
|||
|
||||
final Thread thread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
boolean result = false;
|
||||
int code = 0;
|
||||
String result = null;
|
||||
try {
|
||||
result = view.runBackgroundUpdate();
|
||||
result = view.runBackgroundUpdate(false);
|
||||
code = 1;
|
||||
} finally {
|
||||
handler.sendEmptyMessage(result ? 1 : 0);
|
||||
handler.sendMessage(handler.obtainMessage(code, result));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -165,11 +165,17 @@ public class NetworkLibraryActivity extends NetworkBaseActivity {
|
|||
return menu.add(0, index, Menu.NONE, label).setIcon(iconId);
|
||||
}
|
||||
|
||||
|
||||
private static final int MENU_SEARCH = 1;
|
||||
private static final int MENU_REFRESH = 2;
|
||||
private static final int MENU_ADD_CATALOG = 3;
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
super.onCreateOptionsMenu(menu);
|
||||
addMenuItem(menu, 1, "networkSearch", R.drawable.ic_menu_networksearch);
|
||||
addMenuItem(menu, 2, "addCustomCatalog", android.R.drawable.ic_menu_add);
|
||||
addMenuItem(menu, MENU_SEARCH, "networkSearch", R.drawable.ic_menu_networksearch);
|
||||
addMenuItem(menu, MENU_ADD_CATALOG, "addCustomCatalog", android.R.drawable.ic_menu_add);
|
||||
addMenuItem(menu, MENU_REFRESH, "refreshCatalogsList", R.drawable.ic_menu_refresh);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -177,18 +183,21 @@ public class NetworkLibraryActivity extends NetworkBaseActivity {
|
|||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
final boolean searchInProgress = NetworkView.Instance().containsItemsLoadingRunnable(NetworkSearchActivity.SEARCH_RUNNABLE_KEY);
|
||||
menu.findItem(1).setEnabled(!searchInProgress);
|
||||
menu.findItem(MENU_SEARCH).setEnabled(!searchInProgress);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case 1:
|
||||
case MENU_SEARCH:
|
||||
return onSearchRequested();
|
||||
case 2:
|
||||
case MENU_ADD_CATALOG:
|
||||
AddCustomCatalogItemActions.addCustomCatalog(this);
|
||||
return true;
|
||||
case MENU_REFRESH:
|
||||
refreshCatalogsList();
|
||||
return true;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
@ -208,4 +217,34 @@ public class NetworkLibraryActivity extends NetworkBaseActivity {
|
|||
public void onModelChanged() {
|
||||
getListView().invalidateViews();
|
||||
}
|
||||
|
||||
private void refreshCatalogsList() {
|
||||
final NetworkView view = NetworkView.Instance();
|
||||
|
||||
final Handler handler = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
if (msg.obj == null) {
|
||||
view.finishBackgroundUpdate();
|
||||
} else {
|
||||
final ZLResource dialogResource = ZLResource.resource("dialog");
|
||||
final ZLResource boxResource = dialogResource.getResource("networkError");
|
||||
final ZLResource buttonResource = dialogResource.getResource("button");
|
||||
new AlertDialog.Builder(NetworkLibraryActivity.this)
|
||||
.setTitle(boxResource.getResource("title").getValue())
|
||||
.setMessage((String) msg.obj)
|
||||
.setIcon(0)
|
||||
.setPositiveButton(buttonResource.getResource("ok").getValue(), null)
|
||||
.create().show();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
((ZLAndroidDialogManager)ZLAndroidDialogManager.Instance()).wait("updatingCatalogsList", new Runnable() {
|
||||
public void run() {
|
||||
final String result = view.runBackgroundUpdate(true);
|
||||
handler.sendMessage(handler.obtainMessage(0, result));
|
||||
}
|
||||
}, this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -80,12 +80,12 @@ class NetworkView {
|
|||
}
|
||||
|
||||
// This method must be called from background thread
|
||||
public boolean runBackgroundUpdate() {
|
||||
return NetworkLibrary.Instance().runBackgroundUpdate();
|
||||
public String runBackgroundUpdate(boolean clearCache) {
|
||||
return NetworkLibrary.Instance().runBackgroundUpdate(clearCache);
|
||||
}
|
||||
|
||||
// This method MUST be called from main thread
|
||||
// This method can be called only after runBackgroundUpdate method has returned true
|
||||
// This method has effect only when runBackgroundUpdate method has returned null
|
||||
public void finishBackgroundUpdate() {
|
||||
NetworkLibrary library = NetworkLibrary.Instance();
|
||||
library.finishBackgroundUpdate();
|
||||
|
|
|
@ -232,7 +232,7 @@ public class NetworkLibrary {
|
|||
public String initialize() {
|
||||
final LinksComparator comparator = new LinksComparator();
|
||||
|
||||
final String error = OPDSLinkReader.loadOPDSLinks(false, new OnNewLinkListener() {
|
||||
final String error = OPDSLinkReader.loadOPDSLinks(OPDSLinkReader.CACHE_LOAD, new OnNewLinkListener() {
|
||||
public void onNewLink(INetworkLink link) {
|
||||
addLinkInternal(myLoadedLinks, link, comparator);
|
||||
}
|
||||
|
@ -295,11 +295,12 @@ public class NetworkLibrary {
|
|||
private Object myBackgroundLock = new Object();
|
||||
|
||||
// This method must be called from background thread
|
||||
public boolean runBackgroundUpdate() {
|
||||
public String runBackgroundUpdate(boolean clearCache) {
|
||||
synchronized (myBackgroundLock) {
|
||||
myBackgroundLinks = new ArrayList<INetworkLink>();
|
||||
|
||||
final String error = OPDSLinkReader.loadOPDSLinks(true, new OnNewLinkListener() {
|
||||
final int cacheMode = clearCache ? OPDSLinkReader.CACHE_CLEAR : OPDSLinkReader.CACHE_UPDATE;
|
||||
final String error = OPDSLinkReader.loadOPDSLinks(cacheMode, new OnNewLinkListener() {
|
||||
public void onNewLink(INetworkLink link) {
|
||||
myBackgroundLinks.add(link);
|
||||
}
|
||||
|
@ -309,23 +310,21 @@ public class NetworkLibrary {
|
|||
myBackgroundLinks = null;
|
||||
}
|
||||
|
||||
if (myBackgroundLinks == null) {
|
||||
return false;
|
||||
} else {
|
||||
if (myBackgroundLinks != null) {
|
||||
Collections.sort(myBackgroundLinks, new LinksComparator());
|
||||
return true;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
// This method MUST be called from main thread
|
||||
// This method can be called only after runBackgroundUpdate method has returned true
|
||||
// This method has effect only when runBackgroundUpdate method has returned null.
|
||||
//
|
||||
// synchronize() method MUST be called after this method
|
||||
public void finishBackgroundUpdate() {
|
||||
synchronized (myBackgroundLock) {
|
||||
if (myBackgroundLinks == null) {
|
||||
throw new RuntimeException("Invalid state: that's impossible!!!");
|
||||
return;
|
||||
}
|
||||
synchronized (myLinks) {
|
||||
myLoadedLinks.clear();
|
||||
|
|
|
@ -49,8 +49,11 @@ public class OPDSLinkReader {
|
|||
return new OPDSCustomLink(ICustomNetworkLink.INVALID_ID, siteName, null, null, null, links);
|
||||
}
|
||||
|
||||
public static final int CACHE_LOAD = 0;
|
||||
public static final int CACHE_UPDATE = 1;
|
||||
public static final int CACHE_CLEAR = 2;
|
||||
|
||||
public static String loadOPDSLinks(boolean updateNotLoad, final NetworkLibrary.OnNewLinkListener listener) {
|
||||
public static String loadOPDSLinks(int cacheMode, final NetworkLibrary.OnNewLinkListener listener) {
|
||||
final File dirFile = new File(Paths.networkCacheDirectory());
|
||||
if (!dirFile.exists() && !dirFile.mkdirs()) {
|
||||
return NetworkErrors.errorMessage("cacheDirectoryError");
|
||||
|
@ -64,7 +67,8 @@ public class OPDSLinkReader {
|
|||
ATOMUpdated cacheUpdatedTime = null;
|
||||
final File catalogsFile = new File(dirFile, fileName);
|
||||
if (catalogsFile.exists()) {
|
||||
if (updateNotLoad) {
|
||||
switch (cacheMode) {
|
||||
case CACHE_UPDATE:
|
||||
try {
|
||||
final OPDSLinkXMLReader reader = new OPDSLinkXMLReader();
|
||||
reader.read(new FileInputStream(catalogsFile));
|
||||
|
@ -77,16 +81,23 @@ public class OPDSLinkReader {
|
|||
final long valid = 7 * 24 * 60 * 60 * 1000; // one week in milliseconds; FIXME: hardcoded const
|
||||
if (diff >= 0 && diff <= valid) {
|
||||
goodCache = true;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
case CACHE_CLEAR:
|
||||
oldCache = new File(dirFile, "_" + fileName);
|
||||
oldCache.delete();
|
||||
if (!catalogsFile.renameTo(oldCache)) {
|
||||
catalogsFile.delete();
|
||||
oldCache = null;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
case CACHE_LOAD:
|
||||
goodCache = true;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Invalid cacheMode value (" + cacheMode
|
||||
+ ") in OPDSLinkReader.loadOPDSLinks method");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue