1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 19:42:17 +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:
Vasiliy Bout 2010-09-01 10:01:19 +00:00
parent af4852e1b0
commit 943f7cb314
15 changed files with 99 additions and 32 deletions

View file

@ -16,7 +16,7 @@ NP: оповещение об изменениях в namespace'ах проис
DONE сделать DTD для xml-ей, как в OPDS, вместо существующего
DONE перенести xml на сервер
DONE кэширование каталога
** сделать кнопку "Обновить список каталогов" -- форсировать обновление кэша
DONE сделать кнопку "Обновить список каталогов" -- форсировать обновление кэша
** умное обновление каталогов согласно ID и UPDATED:
** добавлять новые
** пересоздавать измененные

View file

@ -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" />

View file

@ -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" />

View file

@ -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"/>

View file

@ -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" />

View file

@ -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" />

View file

@ -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="Внутренняя ошибка сервера" />

View file

@ -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ộ " />

View file

@ -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="内部服务器出错" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -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));
}
}
});

View file

@ -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);
}
}

View file

@ -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();

View file

@ -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();

View file

@ -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 {
oldCache = new File(dirFile, "_" + fileName);
oldCache.delete();
if (!catalogsFile.renameTo(oldCache)) {
catalogsFile.delete();
oldCache = null;
}
break;
}
} else {
/* FALLTHROUGH */
case CACHE_CLEAR:
oldCache = new File(dirFile, "_" + fileName);
oldCache.delete();
if (!catalogsFile.renameTo(oldCache)) {
catalogsFile.delete();
oldCache = null;
}
break;
case CACHE_LOAD:
goodCache = true;
break;
default:
throw new IllegalArgumentException("Invalid cacheMode value (" + cacheMode
+ ") in OPDSLinkReader.loadOPDSLinks method");
}
}