From ae2b7765980151070c31a20bbfbe0275d3e678f4 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 23 Jan 2011 23:28:35 +0000 Subject: [PATCH 01/71] add/remove to/from basket actions (titles only) --- assets/resources/application/en.xml | 2 ++ .../android/fbreader/network/NetworkBookActions.java | 6 +++++- .../android/fbreader/network/NetworkBookInfoActivity.java | 6 ++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index 98c6f211f..d1dc84307 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -56,6 +56,8 @@ + + diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java index cff6a0021..138e3a0fe 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java @@ -60,8 +60,11 @@ class NetworkBookActions extends NetworkTreeActions { public static final int BUY_DIRECTLY_ITEM_ID = 6; public static final int BUY_IN_BROWSER_ITEM_ID = 7; public static final int SHOW_BOOK_ACTIVITY_ITEM_ID = 8; - public static final int SHOW_BOOKS_ITEM_ID = 9; + public static final int ADD_BOOK_TO_BASKET = 10; + public static final int REMOVE_BOOK_FROM_BASKET = 11; + public static final int ADD_CATALOG_TO_FAVORITES = 12; + public static final int REMOVE_CATALOG_FROM_FAVORITES = 13; private static boolean useFullReferences(NetworkBookItem book) { return book.reference(BookReference.Type.DOWNLOAD_FULL) != null || @@ -184,6 +187,7 @@ class NetworkBookActions extends NetworkTreeActions { final String price = ((BuyBookReference) reference).Price; actions.add(new Action(id, "buy", price)); } + actions.add(new Action(ADD_BOOK_TO_BASKET, "addToBasket")); } return actions; } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java index 2f5124f06..aed12e8a9 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java @@ -228,9 +228,11 @@ public class NetworkBookInfoActivity extends Activity implements NetworkView.Eve }; final Set actions = NetworkBookActions.getContextMenuActions(myBook, myConnection); - final boolean skipSecondButton = actions.size() < buttons.length && (actions.size() % 2) == 1; + final boolean skipSecondButton = + actions.size() < buttons.length && + actions.size() % 2 == 1; int buttonNumber = 0; - for (final NetworkBookActions.Action a: actions) { + for (final NetworkBookActions.Action a : actions) { if (skipSecondButton && buttonNumber == 1) { ++buttonNumber; } From 2cd733b8102456f920ea31b250df5e7e057e03c3 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 28 Jan 2011 04:21:43 +0000 Subject: [PATCH 02/71] more experiments with basket --- icons/fbreader.png | Bin 23890 -> 1885 bytes icons/library/ic_list_library_basket.png | Bin 0 -> 3230 bytes .../library/ic_list_library_basket_empty.png | Bin 0 -> 2864 bytes .../android/fbreader/network/BasketTree.java | 57 ++++++++++++++++++ .../network/NetworkLibraryActivity.java | 10 +-- 5 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 icons/library/ic_list_library_basket.png create mode 100644 icons/library/ic_list_library_basket_empty.png create mode 100644 src/org/geometerplus/android/fbreader/network/BasketTree.java diff --git a/icons/fbreader.png b/icons/fbreader.png index 149e037e3d19e358344f68d522469f4ea182d3d9..44bfd85abe0c4ba6a87fa98f057b752fbc8b1aa8 100644 GIT binary patch delta 1870 zcmV-U2eJ6lx&hq|A&F2rZLYho(l?*l*3@qs`D8uoelPD=(*0g*L!KkAz)4)pw ziV4L`+Uu|Mq&%{*7My-VH9} z0a#f?ND{DbJqOk}eDV1YFpT4td63EuAOlYs0T9bT_nyWBEj1rhdn*GThkvQvW{Ous zbRHlw3GnwcLJ>?)jKlycP0)iM@1v}g3qYA@W4-_Vr=QeR+4gyzmOV~uvN3HXktYD5 zXL$SvAilijLN=UTX@)lZ=tf!KsisSSXxb1!EVsYu^lxvd+F!T9al~C|*bVV80)b#G zp>+hGqCG6hy70O(hWce|`EK=u1 zsL(ZWECVE_jpgLgCf~`U?;fc0Io{vsu^zHk#NL7!T15l_c{YQ{*+Pzs}sJ^}ivyVAS2$@ZC*TRCV*{<39s?0)N12^SOkFMWveS+zRU zP?Cc4rH0^iEhy_yJSbJXcu`y^cK+`co_4A_PKicB9VSNbD+=ZWFozNo%8$HjPBKxh z@ZgZeI){daJ_-hdBY(+cGR2w@z3$w(bA;&0>uXT5&Q)tx2oSLX=dD|}jqY>Te>+6Z06MX3rErydOA>312TN}V{iRtKL zwOYY$w+DD1xmYZKhy^()$}!!d(P+V?hf;tz;bvlhPMtahO@B>IB?IHci4(AO>()%0 zWTrwQs8WCow8L9fP1|g6?AWoA0kmz~Hi*Sys+S(B)?($jzirGH2o}K*>!gN`Mm3cw zHE7HLBn1ZDcjn9)%>fx49MqiRssSYK!z@;FfJiPz>O;4%WcHKz~M{bm4=D@=C2juEh#twE%?KC?+*G6L?Z}psp9zsf&~d6 z>82K==|M*z`do?f;_FG#j_Fc^?k9`5aN&aH6uW%+a(`CPne{>Bc;(8KRZh1MtC4c# z0=0BOv1|%TEjHJ+Gto!5PPQ@3T9Dv0N$czD)0|@Bd+1`jL$H?q{{FliZ?0TON%hVw z#j+_zFIt=x)1Zj`N~Xn&eVeWl#Y>kiX-+XAQp)*am`fBdUc4y#o6J_pXFC^H^~@)V zw3E&?Cx2UH%a#0Px{mJhpsQD}YECg>OGOtxNZfz^{CQbckjc^J+Hq{oJf@| z!J`2XZ&`=|p(#X<)#au=?KH1nzpgpO&YnH1pZy>L4h@ia%T=y3Rua*erdU27ppp=biigk8&!lOrz zpxjzn{g0v+KB?pYJ$Uc{9zJ{sv$M0X+wX_w=4N<%^JaYmq}I(xM@L~~WCWUb?0`TZ z0DsSymS8p*1h3Z%c8BBjv7oWBF&G~ohqkshXm4+S)lV#kfb&jcWBS~Kz*x*?sPcFq zva*tMelZ$X2taa$Ebb3<;N(d6&&|z2{gy4Ot{ul@azk~stobq@;bNa+t*x!Ej`Tco z9u9}W<#N61+q7vDa2&U0T&DSDLou>2VSkbIyq1<0c)qv@4yO|$kqFe))j>l;11u~o ztN|#~d=|qz(Jm2>$8&Db%V|EJ4>qE>*R2Dm+YKg@DGkp2{CvR+3xz^y(4oLL!6*eN zj`Cu7c=+DVojX4!PxzS4=E5Qk$~;;T5j7eCg@8OYH3btB6ZeR|yxw^=rB6Lq;(wtQ zrMbJi`zy47T_`mYk0F($5$m3wo_;zxIXQ9n?%f};>o=4cT<3Bz03sIW;z1(er-nZ# zX2inlsmNkTen8CeDZG3okl>4QIdcHUL!1Ec=HxK4KnH1sr@g&0LSwqWVlor_y7O^07*qo IM6N<$g3Ex1Hvj+t literal 23890 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 Y0BZli3n2XXbN~PV07*qoM6N<$f?~D&J^%m! diff --git a/icons/library/ic_list_library_basket.png b/icons/library/ic_list_library_basket.png new file mode 100644 index 0000000000000000000000000000000000000000..b06d3eb0bccc3976248b51cbe7ecd3a19d6a44da GIT binary patch literal 3230 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 Q3jhEB07*qoM6N<$f-}23bpQYW literal 0 HcmV?d00001 diff --git a/icons/library/ic_list_library_basket_empty.png b/icons/library/ic_list_library_basket_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..7c80bed83dfd72f6c3b4a7b9b00b952791a9e008 GIT binary patch literal 2864 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 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.fbreader.network; + +import java.util.*; + +import org.geometerplus.zlibrary.core.resources.ZLResource; + +import org.geometerplus.fbreader.tree.FBTree; +import org.geometerplus.fbreader.network.*; +import org.geometerplus.fbreader.network.tree.NetworkAuthorTree; + +import org.geometerplus.zlibrary.ui.android.R; + +import org.geometerplus.android.fbreader.tree.ZLAndroidTree; + +public class BasketTree extends NetworkTree implements ZLAndroidTree { + public BasketTree() { + super(1); + } + + @Override + public String getName() { + return ZLResource.resource("networkView").getResource("basket").getValue(); + } + + @Override + public String getSummary() { + return ZLResource.resource("networkView").getResource("basketSummary").getValue(); + } + + public int getCoverResourceId() { + return R.drawable.ic_list_library_basket; + } + + @Override + public NetworkLibraryItem getHoldedItem() { + return null; + } +} diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index e4b74009d..118b480c8 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -170,16 +170,18 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { if (!NetworkView.Instance().isInitialized()) { return 0; } - return myTree.subTrees().size() + 2; // subtrees + + return myTree.subTrees().size() + 3; // subtrees + + + } public final NetworkTree getItem(int position) { final int size = myTree.subTrees().size(); if (position == 0) { return NetworkView.Instance().getSearchItemTree(); - } else if (position > 0 && position <= size) { - return (NetworkTree)myTree.subTrees().get(position - 1); - } else if (position == size + 1) { + } else if (position == 1) { + return new BasketTree(); + } else if (position > 1 && position <= size + 1) { + return (NetworkTree)myTree.subTrees().get(position - 2); + } else if (position == size + 2) { return NetworkView.Instance().getAddCustomCatalogItemTree(); } return null; From c3a5977e9fcb90ea78972c7bb71d8689ad57c1cd Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 30 Jan 2011 21:10:05 +0000 Subject: [PATCH 03/71] another basket icon --- icons/library/ic_list_library_basket.png | Bin 3230 -> 3604 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/library/ic_list_library_basket.png b/icons/library/ic_list_library_basket.png index b06d3eb0bccc3976248b51cbe7ecd3a19d6a44da..a331a2e6cb7beeb13b150589d303d987a270f7d9 100644 GIT binary patch delta 3566 zcmV9C_*gGrv;Y}!p07W1IM+G4o3A}T%9?VVWil?~ zoR<}t-~VBVFM0{W^8`{Az+n%lF}`t254*Xel~q^g80QrgV@9nQBu9hOcV91SXxIy5bTQnbS z!=~-or*3N9RZ<)JNUB5NMkF9-9#6)&sl22rX2n;Tzf_?3Jp_upr8yS|ir3>Ihb-}j&3B{v zu;mYdBZ|N@`LJn!wj=<7Gg>MrkrWvTp+NBg1d6$#$&-8)0>w40?lqMl5vy0UCv1Lm zq@uP3CVE?B-CFep#eC;+A9Kz04r&rNZ!KQA9x6eE{_eQ1uu|_WgK3hmRcb(&PQL) zb#&Qo$V-84rPAiKwrA?XjHNb9GEGgBZ^@9lO4@h zA1Kmh)8Md_!HY$bM_$DyBE(9cV>Vc9Ae9*_j7PGbDGiPV-!(wUBA}=)qW*_yNh%w# zj-fn3;8k z!hhHcCwASCLQ)y0P}SpkMa&WrcyFNljC+}0>*^$kvtNP8p1hEZ5&+XgTdoHQ*Yu`o zjARM79hOL!-IP?x9H+>}5fGH@7%J14;<qwXTCmj&V9s9rJWQC8|@N?x*qTep{#9j;G|9etHj;?fXsN zHms*uV#`h;-%FBg?WG0BEeAkY{1h?Yh$~0EH{&?Dv{VrHtmM$RG_zz%atLTQrGJ)M zU5g|y)Sgck%y&|Ty(sh`I(o?g8WodBCji_<>l}QmW>Up5Qb_><(SN~&JWDqDC|<19 zR7$HBBHm1~I6FlEh*X>PioW5tG$300V%L!c##zQd5gl0b(fIvJ<%wRZM;=bb;K-Ey zDrp?_?9tO5$i^V`4$YIHWM|$zgnwMH>-{*0pIh!)&#JPXv13w#&Tj$ulL5dXiODz# z;KZ0J*Zr??&=p3~Yy!A^25@>cmt1FZ_2%A3VFTXi*s_5~p2lHg!yl^E_eXW2=j6W* zD%(%|IQ7;+b<@_{V&+hPOW&KF7`72O+LGvlVB||N2SR&+QyZS3Vc26UHj29}co=iF5 zOgA?~69K|-DzvA4lac$+%73I?8MmA6r)6xvFy|#3SW>$u*}OX@8pCz0L??Kq@pIwa z0N}?cPp5An=qzxhckowagMN4POUmv;dKmt=s4^);;imJXJw z$=ar4pzkNh_gIHOwkK=t4+tku*Obkc)&|YNC}&;g03_u-FtbzNMt|ipzFS+Bt-rOC zTQ_`u&!=j|=3XvTbU6L$t&g>hAwoS6m#!0o?0Cy8TesoB*^y*CJ?Gy3L@m3whr33a zrjDLgVb=Afkb1`mJ>Elhpg7XD>KFo?^wn(1RE#zUH#|!bsx@?)F;#Sd$7%rBjEHT9 zIer+MM8=Z9n+;{`&VPySjES2j_6lHXi7%I6J@BJn;Cv{a<4WlVrgg(8iq8q-#vgMpTfd{ET&`n)m zSU{ZAe3vKj3%y%JhQ3ABSI6-aTE0QH*Tzh9h=Yi3I<*k9D1T91sxsK1UmrTIH|B9C z2Lg|Qz&0H@V~NR+jxYs#bgdr_>8aVUM#}?TWH^kUL9r8b=E(#Qh^`SkVvatS8Ods` z%9T70GGZ?%nm&xQ67Exb@9eEzPk}Rkh8n8;yQ8Y=?sXi*YNF@%jjGyv*2i(n%)Udq zpX#Kx)9)NoHGg-n=j4jXW>J6U&UKsuJ3F7o+l|`sIHr(YdJ?MkC*$66GE;}KrUpk# z3X9a#(UPkygAqoQNySK#kunhJ*8@QWlIUtxc^q~?SzAJFL|kA_a6h2$7#t(Z4@!ajy9DgU~l} zEC5G_$qqP)H&};yH2|6QjOPeaRA`$a(!fL{+xgKwPx@*lvK7pc1$RG1_OKe+IxQvo zs+S^f_BV_b_PdK`uT}NS&_)dAim7tgpl1#qP2U!-N7HL`f~L*+`G9$2Uo(C!jS0R#lu2qB?P!PVH3BZ(PHP;{-T=KdReJ(0qT>T5W?!s;I7R z?~ZMlosZ&gke+rSJVp&)-q6(GA3Q&yC5+Z4Nq>yO6GZYZ9X0r6yZHaX21%9=rB<`N z5Qur?7jv;qkQs=1JMyd@>ywMMZkf(OAliH|m`7(HJ_c1s#qNY#CD`4C;P4NAu?p!EYfjORnq;Y0!1Mn9D6 zbAR?8T5n9StiAs+A-}nf(EZjk=?nbmfEOEK3S_M9p?VO?cs^R!qiv&`*rYM6bubNf za;X-T^X8D6Nv>o|YlD9A{^$BY>YC^mFt~jO5kc+MV_&h%MaZ`wPhT0|cK8X?!+P$wj&SrbX+Jv8L}_(?O`?CG7x21fo8Nv1Fb;*iuxk;`5gN z^P_Xs0nGU+=qb3VGt7(PEpsRBi+?1@3}qQ?(EsC8`4MNS-TZ%g4xYKl>vG<9s6#)* zxX)ZIjEv9vLl>s~!5{Xv&lA_zJ~|Pdm9#hF`m3sEZo-!1q~6w0&Fiw>cBoW8*6NE? zl<76cXZ*qMe`i%$RiI=l_TlM^yrIe)fVCbtJ2l59=RzIpkmsn%xNIsP?tcIXJAS;O zqu_0f`K?CDQEiq+;kz2?MRh&8`q z&%HX#KK;jTz2<|DJj@=^YkztJm^W|DMQMYk{ILJRjL&wyzK4CjXCM3a)-7z)wmvp~ zaf%)JYTSa+KOb1GK_aQ)#>9xH&U^0NdN?Uz;F&@%bJ^5$LiJvZX@|6qH|?_eHM)g^#?vhfNQCub(giQSa40( zane!!;#M(utq~&jyAR&ZYOAvaeJdO5%n4nNEd13q`4S?{7uXpDkO(G60!Y%ft()ep z*}A;Wcs^%jNdPoHoqr!9&fnJA%5H9JWHs1Obyb#iu4-cKO?6gMhUQBFkAGU6`URer zpo!T)kKfp}Qm;en(YjsjO{}YRnYC*}OG3q9Uj`uo-EhGJYgaCZeQ1iM!u(`z2g-vB zUBcPxj|J3l5bJhlm>jreRU=!wa#?Jn%%OD$03KWtaS%N(zGwRd2f^Dxd_OkP7it&I zMo4l{9{kz8Yv;XeaR0FwB>Usc6sT0jbiN(Me&l^-4AfZ-p*Xnxj!v~?0IHnDDgafU o3P2TrDgadgssOZvo_`B40F!E2hoLpx>Hq)$07*qoM6N<$f}%a?+yDRo delta 3189 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 Date: Mon, 31 Jan 2011 01:24:39 +0000 Subject: [PATCH 04/71] updated basket icon; basket moved inside litres branch --- assets/resources/application/en.xml | 2 ++ icons/library/ic_list_library_basket.png | Bin 3604 -> 2220 bytes .../android/fbreader/FBReader.java | 1 + .../android/fbreader/network/BasketTree.java | 2 +- .../network/NetworkCatalogActivity.java | 1 + .../network/NetworkLibraryActivity.java | 10 ++++------ 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index 16d905bb1..90c41e7fc 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -68,6 +68,8 @@ + + diff --git a/icons/library/ic_list_library_basket.png b/icons/library/ic_list_library_basket.png index a331a2e6cb7beeb13b150589d303d987a270f7d9..e5632d0a5ba5f0b72ba95b89430c6f46d1037f6b 100644 GIT binary patch literal 2220 zcmV;d2vhfoP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipN2 z6%qr&n-8J@00=BeL_t(&-tAd^Y!ufK|IORoTl;LE4{XQA2HO}MJD3;+19c#2i<$@m zO(=vCs*pmX5+!OYp(<+Cqzy{w2Oye~wEWSElz>EA1*njsDgu&LiIfyVP}7!xid-cnVsLvo0$V{({1|yCK~Jk^~S+UVqRwl z$;GzuZ3O^CxgRWoL_y?|D67*fn%Fwjee5ibS{Lp*uR&loq+^5XcQfHVL+zE!lJ~useCt#FvK6 z002gRD9d+%Sl5V6Ez%>y1&579P5M(}s$_d~!Oq2nRS&%q^b}g-~ z?8`Qdu8PDuCOvfc4Y_~9D2%D8AluGQ78-%KUYNFE)v4>{A;_Bs)M^1reb*>|Jmv~86MzGNiSQ>Q^pTy>A2_B3aUt4ulcj`N zS19^x5tl4mQGQAZ2+n%;B_rrGkKNr00I#2jl^MZ41sSJ>`W%H>%W5n4=A1@v6>U5o z8w>obP0>+8y!)O-K`BfY)pxA>~0u#0%J;)V|9aZMb6@Q#*`@A>V~A{pT(#5 zNz3~cQMFA3!+gO~>TlV=&bnUk$ckql1yO4{PQU%ZPqwb$K)cUB(Dra8)o%{s1EFjA zDW5KXaLVBP18omiqJFb~DXA(Z)cwE)p3x~79$8*r_0o{?a3HcX1qA@WQ`IwCEX#EO z0G0RLNtPSRFF(1FEY}e>=4sCu2mpcX9C9)D%Z}3_5P6CK5#Y@G2b0W9AS4N73E%>f z7>p+%0bo#GL@WXd%iEfqa7m#sGqGUGcg9s87?KBUR{|D!n?+y%L|Pl36T@p)FP%LS zA`Jwr&xZfm(pg#YqRrS)wD`}VqJop2HsmuO1*B`pSNStzMvDR76i_;AsCf_xGWkd@ zU*q}W1*#x4DPS&3l?n7uE$A9DgaBZD$En#2>>#3W(3e2(;S)*rg8`!aLkL8wsIICs zTs;y*FaXvVp_R`z*61O5002BA`+dWwe9aKo5x1gr)#_!#1EEOk*zqW|;j@Tm#Mg}X zvsL~x4e;3{0elh&izp%)Q5+pM2o)Drv+F(K+p z&cz`@Aj%JfL|gy~YeaFlpt;U9Mni%A`oe_z={eQoS8ilJ!h*zrHZbL-`&TcW6$K%0 z5CX7%^|IL`t)|+If!5FrFl1NG4aJqFTkZ3i6Iuj@dGhlYddeZl8-y~)ur`nS%n%U} zXhYtn65szvhYQdSBFtqG(1|Xn3l}d6Q9-T{62KyskVFa{jH|H>5fsUhHLc^D^5%gx zt>Zn-^0sdnh5@g(VoO11tOg=ELx@Bgz`Q!yT>D*51V$K|@vFS_q*s$>KA;Wv`)r^C z)7~?!=}rPTX9x*MLQX~C`Cl|5&@9l*yM|)GpdH!M`wt%xkw#@(2zSO{C;iKFDZ1|a z`iUi(r?!yU?9*?L~#mFmoh2uULpvef>7`RBL)p~;4h_rzNiQM+e2 z8W=v*oAlqkx2`;q?fR3w@#$KmO&fuy`M|`g(hqK#0i8Yl3w?vl-JT8&1Z->HPa2jz z1BMsPYpL-DTYs#(e`P}RbG;thzBV8>I^pY|&bh1l#bGz#?`L{i82E6<-j2fcuWlv3 zKaROe=F9vU&15O{cxOWdFU00009C_*gGrv;Y}!p07W1IM+G4 zo3A}T%9?VVWil?~oR<}t-~VBVFM0{W^8`{Az+n%lF}`t254*Xel~q^g80QrgV@9nQ zBu9hOcV91SXQ;Lrc`;tO?x+Ncl|XUP1d1=7Je%kyaueyg3+4SNtBe7K zv>^@9lO4@hA1Kmh)8Md_!HY$bM_$DyBE(9cV>Vc9Ae9*_j7PGbDGiPV-!(wUBA}=) zqW*_yNh%w#j-fn3;8k!q^KZcHNLdQW>XE)#G_Z%n}iJZ=m~(dzoJA>LiG>UxCP;ypW6%0MkTU zt_KO%^rmTyWC^z&mPnV~lvK$ar^v<;5R~i~D$|(axptnTB~CNamIcOsiuX=f+JuqV zvP9B&$u05{ixW{gFY2f9(jt&>Gn%)O3fdWbsP)cX#h1!_&JId*s-!m z5EgGB&XA!ca!}s}ZtxRtexwD=i!8OSgGi2XI#C_-bU!7kQ=aap@#%hBr`(RG-{*0pIh!)&#JPXv13w#&Tj$ulL5dX ziODz#;KZ0J*Zr??&=p3~Yy!A^25@>cmt1FZ_2%A3VFTXi*s_5~p2lHg!yl^E_eXW2 z=j6W*D%(%|IQ7;+b<@_{V&+hPOW&eVW zNkQDE!vK;169eT_Zri;7F=6h*sVl?zD^Pnu^C`e3LoIArBIISe`YSzlPa}Pd7b>lu zOgZ38H#bBR0m5)9w5NTOk^9feq+J=eo9?G&Y`-w)B^y{$yC>PaJ0=>#b*w}uc%|`k z;oJb=$0$#yZy@L_aHV(fS7d{Jcl1lj?n8PR1a%TIV%BFDKR?NW$(ieBe=_wotp1h` zmZ{0wremP*C&>3$hd{O`YwZsRCr{Uu&6d^%&A}*VUFQHKaCBpjUhrk5SOkKgY0${zNUiw}-n% znx>APR$j_6lHXi7%I6J@BJn;Cv{a<4WlVrgg(8iq8q-#vgMpTfd{ET&`n)m zSU{ZAe3vKj3%y%JhQ3ABSI6-aTE0QH*Tzh9h=Yi3I<*k9C{bOiGT5MBA3Cl#=5Z$n z0*`^fHXS)*iOG+SFa>*btsf5QsoAhb%L83xIEZG>Q?;KJ!cdzHNMwCg#NRp8<5b4(gK?IWMYE^k0c0gHMLTyA`U{2(|try9*AD`T@s2jyA z=1NGbhYhPJr?ImpYB%bv@Xp6+$w+M!G3zCiUGh>!1&w;E0{bH_Q*o~N^MlYgax4Hx zhRF^%i8ok>dNlx<^^E5TQdDT0A=1D^B-{DXJx}^-C9)OFkp*`@MfR{7**YyH`l^>A zZ}vBg752M}XRlTD%g{y)=8CCu*q~<)9!=jCu1C{rbb_YM`T2l(V_!3VE#skv8pb=@ z5S%*N=pv)<;J4Gkom5xoYun^YhKsVpS!|%Y8){2ygJkSUG)Io({|H{#njS0R#lu2qB?P!PVH3BZ(PHP;{-T=KdReJ(0qT>T5W?!s;I7R?~ZMl zosZ&gke+rSJVp&)-q6(GA3Q&yC5+Z4NsPi1MDi{jHTY$_`2WEMNtO?#RAaJ!?m}GrDz)997oeeT8pG&vZF;uuG>LPg<>y>r$d0=51}_so$!pfF!(0_~Smx(+qJ#)#L~w#fiU^8*vl zL`REggO-lGv1hPLdr^P0n3;i5V_`pJ%Eb1la$K0%LmzEuYkP}s+p?MaZ`wPhT z0|cK8X?!+P$wj&SrbX+Jv8L}_(?O`?CG7x21fo8Nv1Fb;*iuxk;`5gN^P_Xs0nGU+ z=qb3VGt7(PEpsRBizLVlWf^SH|Kn5n5of90{C|25p1H{Da^7~RLqEj0&s;5xjL-T* z7pDEeANID-6W7;1IuV_fv^V1VtEy*i!j|Kt-qujf>$2WWfsA={3h^{K4;k zXH{8Mpkylc;pvOKp~@S8wH`P-HOD6BLLKXn=cvlKY$_k_00=vNyrHAug}XjHF)t<| zplUK6TfMwy!8NmAMU{L9Y5%4SBqYPu&3?gv%$drv2*PCS9i0|{yEID^~>1S z{)gC)?(bo_j5~mMg|0|mDhND96#VI5f1vE?Pd$p&<~+UT#9W9qzhTe4I?O)($8Npm zgO5DS9?@%h1DH2&%|&U0ru?w~!i>*$zP^WjzGol%_SP+I)3!b~esPK&`D)yP(LWzp zu0bNH;l|66Kt&QF`p-@0*$aQ&!$#kJCtmaXg-NV=(R^8D{Y%0I&HADbc7ctJe!+US zZf5JcJL0}`6El#GMg(V0-$KDB#ccT?a=})DD8>PJeG_xRf@^*~KE>9xH&U^0NdN?U zz;F&@%bJ^5$LiJvZX@|6qH|?_eHM)g^#?vhfNQCub(giQSa40(ane!!;#M(utq~&j zyAR&ZYOAvaeJdO5%n4nNEd13q`4S?{7uXpDkO(G60!Y%ft()ep*}A;Wcs^%jNdPoH zogX63-`3g6ZfS1yNrXo{u6{A6wi%7Y7C!rAMO1=Mg5>vm_D z9JpmwBU`(2S!|=sp>+oU9$XS}5Irxx`vnKV+d+IkHqjSq7tTgVa!?-p*}ZG$y=-v* zu^1%#(); if (Util.isAccountRefillingSupported(NetworkCatalogActivity.this, rootTree.Item.Link)) { + mySpecialItems.add(new BasketTree()); mySpecialItems.add(new RefillAccountTree(rootTree)); } if (mySpecialItems.size() > 0) { diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index 118b480c8..2b99b140a 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -170,18 +170,16 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { if (!NetworkView.Instance().isInitialized()) { return 0; } - return myTree.subTrees().size() + 3; // subtrees + + + + return myTree.subTrees().size() + 2; // subtrees + + } public final NetworkTree getItem(int position) { final int size = myTree.subTrees().size(); if (position == 0) { return NetworkView.Instance().getSearchItemTree(); - } else if (position == 1) { - return new BasketTree(); - } else if (position > 1 && position <= size + 1) { - return (NetworkTree)myTree.subTrees().get(position - 2); - } else if (position == size + 2) { + } else if (position > 0 && position <= size) { + return (NetworkTree)myTree.subTrees().get(position - 1); + } else if (position == size + 1) { return NetworkView.Instance().getAddCustomCatalogItemTree(); } return null; From 97b9107ea45440124aad9fbaebde3e50153e1f49 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Feb 2011 19:42:01 +0000 Subject: [PATCH 05/71] "My books" item reorganising --- .../litres/LitResBookshelfItem.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java index 805bab7ad..a459b0d99 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java @@ -25,11 +25,30 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.*; +class SortedCatalogItem extends NetworkCatalogItem { + private final List myChildren = new LinkedList(); + + public SortedCatalogItem(NetworkCatalogItem parent, List children) { + //super(parent.Link, "by author", "books by author", "", Collections.emptyMap()); + super(parent.Link, "by author", "books by author", "", parent.URLByType); + myChildren.addAll(children); + } + + @Override + public void onDisplayItem() { + } + + @Override + public void loadChildren(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException { + for (NetworkLibraryItem child : myChildren) { + listener.onNewItem(Link, child); + } + } +} + public class LitResBookshelfItem extends NetworkCatalogItem { - private boolean myForceReload; - public LitResBookshelfItem(INetworkLink link, String title, String summary, String cover, Map urlByType) { super(link, title, summary, cover, urlByType); } @@ -49,7 +68,7 @@ public class LitResBookshelfItem extends NetworkCatalogItem { @Override public void loadChildren(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException { - LitResAuthenticationManager mgr = (LitResAuthenticationManager) Link.authenticationManager(); + final LitResAuthenticationManager mgr = (LitResAuthenticationManager) Link.authenticationManager(); // TODO: Maybe it's better to call isAuthorised(true) directly // and let exception fly through??? @@ -65,9 +84,15 @@ public class LitResBookshelfItem extends NetworkCatalogItem { // TODO: implement asynchronous loading LinkedList children = new LinkedList(); mgr.collectPurchasedBooks(children); - Collections.sort(children, new NetworkBookItemComparator()); - for (NetworkLibraryItem item: children) { - listener.onNewItem(Link, item); + if (children.size() <= 5) { + Collections.sort(children, new NetworkBookItemComparator()); + for (NetworkLibraryItem item : children) { + listener.onNewItem(Link, item); + } + } else { + listener.onNewItem(Link, new SortedCatalogItem(this, children)); + listener.onNewItem(Link, new SortedCatalogItem(this, children)); + listener.onNewItem(Link, new SortedCatalogItem(this, children)); } listener.commitItems(Link); } From 3bf2d0ef8bfad67d85678d3aa5f34d3730adc4fd Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Feb 2011 19:42:48 +0000 Subject: [PATCH 06/71] Some logical changes to the fbreader/network core Conflicts: TODO.SOAP --- TODO.SOAP | 8 ++++ .../fbreader/network/AbstractNetworkLink.java | 19 +++++---- .../fbreader/network/INetworkLink.java | 11 ++++- .../fbreader/network/NetworkCatalogItem.java | 40 ++++++++++++------- .../fbreader/network/NetworkLibrary.java | 2 +- .../network/NetworkOperationData.java | 12 ++++-- .../litres/LitResBookshelfItem.java | 10 +---- .../network/opds/OPDSCatalogItem.java | 26 +++++------- .../network/opds/OPDSNetworkLink.java | 5 +-- 9 files changed, 72 insertions(+), 61 deletions(-) create mode 100644 TODO.SOAP diff --git a/TODO.SOAP b/TODO.SOAP new file mode 100644 index 000000000..fb8279afd --- /dev/null +++ b/TODO.SOAP @@ -0,0 +1,8 @@ +* response parser: add namespaces processing +* return full result from response parser +* full SOAP types list: support in request and in parser + + +** коды возврата для работы приложения не требуются: при возникновении ошибок на стороне сервера перехватывать их и отправлять по SOAP в событии fault +** какой vendor_id ????? +** что такое marketplace_id ????? diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index 0fbb794fb..6fa1c681c 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -52,37 +52,36 @@ public abstract class AbstractNetworkLink implements INetworkLink { myLinks = new TreeMap(links); } - public String getSiteName() { + public final String getSiteName() { return mySiteName; } - public String getTitle() { + public final String getTitle() { return myTitle; } - public String getSummary() { + public final String getSummary() { return mySummary; } - public String getIcon() { + public final String getIcon() { return myIcon; } - public String getLanguage() { + public final String getLanguage() { return myLanguage; } - public String getLink(String urlKey) { + public final String getLink(String urlKey) { return myLinks.get(urlKey); } - public Set getLinkKeys() { + public final Set getLinkKeys() { return myLinks.keySet(); } - public NetworkOperationData createOperationData(INetworkLink link, - NetworkOperationData.OnNewItemListener listener) { - return new NetworkOperationData(link, listener); + public NetworkOperationData createOperationData(NetworkOperationData.OnNewItemListener listener) { + return new NetworkOperationData(this, listener); } @Override diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index f2cdd6fdb..105174aaf 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -41,12 +41,19 @@ public interface INetworkLink { String getSummary(); String getIcon(); String getLink(String urlKey); + + /** + * @return 2-letters language code or special token "multi" + */ String getLanguage(); Set getLinkKeys(); - NetworkOperationData createOperationData(INetworkLink link, - NetworkOperationData.OnNewItemListener listener); + /** + * @param listener Network operation listener + * @return instance, which represents the state of the network operation. + */ + NetworkOperationData createOperationData(NetworkOperationData.OnNewItemListener listener); ZLNetworkRequest simpleSearchRequest(String pattern, NetworkOperationData data); ZLNetworkRequest resume(NetworkOperationData data); diff --git a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java index 967ae60f9..739bc577c 100644 --- a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java @@ -23,6 +23,8 @@ import java.util.*; import org.geometerplus.zlibrary.core.util.ZLBoolean3; import org.geometerplus.zlibrary.core.network.ZLNetworkException; +import org.geometerplus.zlibrary.core.network.ZLNetworkManager; +import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; public abstract class NetworkCatalogItem extends NetworkLibraryItem { @@ -56,21 +58,6 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { this(link, title, summary, cover, urlByType, VISIBLE_ALWAYS, CATALOG_OTHER); } - /** - * Creates new NetworkCatalogItem instance with specified visibility and CATALOG_OTHER type. - * - * @param link corresponding NetworkLink object. Must be not null. - * @param title title of this library item. Must be not null. - * @param summary description of this library item. Can be null. - * @param cover cover url. Can be null. - * @param urlByType map contains URLs and their types. Must be not null. - * @param visibility value defines when this library item will be shown in the network library. - * Can be one of the VISIBLE_* values. - */ - public NetworkCatalogItem(INetworkLink link, String title, String summary, String cover, Map urlByType, int visibility) { - this(link, title, summary, cover, urlByType, visibility, CATALOG_OTHER); - } - /** * Creates new NetworkCatalogItem instance with specified visibility and type. * @@ -113,6 +100,9 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { public void onDisplayItem() { } + /** + * @return visibility status: on of the values from ZLBoolean3 class. + */ public int getVisibility() { if (Visibility == VISIBLE_ALWAYS) { return ZLBoolean3.B3_TRUE; @@ -130,4 +120,24 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { } return ZLBoolean3.B3_FALSE; } + + /** + * Performs all necessary operations with NetworkOperationData and NetworkRequest + * to complete loading children items. + * + * @param data Network operation data instance + * @param networkRequest initial network request + * + * @throws ZLNetworkException when network operation couldn't be completed + */ + protected final void doLoadChildren(NetworkOperationData data, + ZLNetworkRequest networkRequest) throws ZLNetworkException { + while (networkRequest != null) { + ZLNetworkManager.Instance().perform(networkRequest); + if (data.Listener.confirmInterrupt()) { + return; + } + networkRequest = data.resume(); + } + } } diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 7f276b73f..876b455e8 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -442,7 +442,7 @@ public class NetworkLibrary { synchronized (myLinks) { for (INetworkLink link : activeLinks()) { - final NetworkOperationData data = link.createOperationData(link, synchronizedListener); + final NetworkOperationData data = link.createOperationData(synchronizedListener); final ZLNetworkRequest request = link.simpleSearchRequest(pattern, data); if (request != null) { dataList.add(data); diff --git a/src/org/geometerplus/fbreader/network/NetworkOperationData.java b/src/org/geometerplus/fbreader/network/NetworkOperationData.java index 33182660a..256336808 100644 --- a/src/org/geometerplus/fbreader/network/NetworkOperationData.java +++ b/src/org/geometerplus/fbreader/network/NetworkOperationData.java @@ -29,8 +29,12 @@ public class NetworkOperationData { void commitItems(INetworkLink link); - // returns true to confirm interrupt reading; return false to continue reading. - // once true has been returned, all next calls must return true. + /** + * @return true to confirm interrupt reading; + * false to continue reading. + * Once true has been returned, + * all next calls MUST return true. + */ boolean confirmInterrupt(); } @@ -43,11 +47,11 @@ public class NetworkOperationData { Listener = listener; } - public void clear() { + protected void clear() { ResumeURI = null; } - public ZLNetworkRequest resume() { + public final ZLNetworkRequest resume() { final ZLNetworkRequest request = Link.resume(this); clear(); return request; diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java index a459b0d99..a45a70cb7 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java @@ -49,16 +49,8 @@ class SortedCatalogItem extends NetworkCatalogItem { public class LitResBookshelfItem extends NetworkCatalogItem { private boolean myForceReload; - public LitResBookshelfItem(INetworkLink link, String title, String summary, String cover, Map urlByType) { - super(link, title, summary, cover, urlByType); - } - public LitResBookshelfItem(INetworkLink link, String title, String summary, String cover, Map urlByType, int visibility) { - super(link, title, summary, cover, urlByType, visibility); - } - - public LitResBookshelfItem(INetworkLink link, String title, String summary, String cover, Map urlByType, int visibility, int catalogType) { - super(link, title, summary, cover, urlByType, visibility, catalogType); + super(link, title, summary, cover, urlByType, visibility, CATALOG_OTHER); } @Override diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCatalogItem.java b/src/org/geometerplus/fbreader/network/opds/OPDSCatalogItem.java index 8c2a8cf88..6152a221c 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCatalogItem.java @@ -21,7 +21,6 @@ package org.geometerplus.fbreader.network.opds; import java.util.*; -import org.geometerplus.zlibrary.core.network.ZLNetworkManager; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; @@ -49,19 +48,12 @@ class OPDSCatalogItem extends NetworkCatalogItem { myExtraData = null; } - private void doLoadChildren(NetworkOperationData.OnNewItemListener listener, - ZLNetworkRequest networkRequest) throws ZLNetworkException { - while (networkRequest != null) { - try { - ZLNetworkManager.Instance().perform(networkRequest); - } catch (ZLNetworkException e) { - myLoadingState = null; - throw e; - } - if (listener.confirmInterrupt()) { - return; - } - networkRequest = myLoadingState.resume(); + private void doLoadChildren(ZLNetworkRequest networkRequest) throws ZLNetworkException { + try { + super.doLoadChildren(myLoadingState, networkRequest); + } catch (ZLNetworkException e) { + myLoadingState = null; + throw e; } } @@ -74,12 +66,12 @@ class OPDSCatalogItem extends NetworkCatalogItem { public final void loadChildren(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException { OPDSNetworkLink opdsLink = (OPDSNetworkLink) Link; - myLoadingState = opdsLink.createOperationData(Link, listener); + myLoadingState = opdsLink.createOperationData(listener); ZLNetworkRequest networkRequest = opdsLink.createNetworkData(URLByType.get(URL_CATALOG), myLoadingState); - doLoadChildren(listener, networkRequest); + doLoadChildren(networkRequest); } @Override @@ -92,7 +84,7 @@ class OPDSCatalogItem extends NetworkCatalogItem { if (myLoadingState != null) { myLoadingState.Listener = listener; ZLNetworkRequest networkRequest = myLoadingState.resume(); - doLoadChildren(listener, networkRequest); + doLoadChildren(networkRequest); } } } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index 2328d27c8..0d0cef9bd 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -121,9 +121,8 @@ class OPDSNetworkLink extends AbstractNetworkLink { } @Override - public OPDSCatalogItem.State createOperationData(INetworkLink link, - NetworkOperationData.OnNewItemListener listener) { - return new OPDSCatalogItem.State(link, listener); + public OPDSCatalogItem.State createOperationData(NetworkOperationData.OnNewItemListener listener) { + return new OPDSCatalogItem.State(this, listener); } public ZLNetworkRequest simpleSearchRequest(String pattern, NetworkOperationData data) { From 62d6b0525fce49be00649b83b195c9a57c33445c Mon Sep 17 00:00:00 2001 From: Vasiliy Bout Date: Wed, 26 Jan 2011 15:00:09 +0300 Subject: [PATCH 07/71] Some logical changes to the fbreader/network core --- TODO.SOAP | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 TODO.SOAP diff --git a/TODO.SOAP b/TODO.SOAP deleted file mode 100644 index fb8279afd..000000000 --- a/TODO.SOAP +++ /dev/null @@ -1,8 +0,0 @@ -* response parser: add namespaces processing -* return full result from response parser -* full SOAP types list: support in request and in parser - - -** коды возврата для работы приложения не требуются: при возникновении ошибок на стороне сервера перехватывать их и отправлять по SOAP в событии fault -** какой vendor_id ????? -** что такое marketplace_id ????? From acf00d5706efe04cf61701b1d6364f531bbe7258 Mon Sep 17 00:00:00 2001 From: Vasiliy Bout Date: Wed, 26 Jan 2011 17:47:25 +0300 Subject: [PATCH 08/71] More changes to fbreader/network core --- .../network/AddCustomCatalogItemTree.java | 5 +++ .../fbreader/network/NetworkBookActions.java | 7 +--- .../network/NetworkCatalogActions.java | 37 ++++++++++--------- .../network/NetworkCatalogActivity.java | 28 +++++--------- .../network/NetworkLibraryActivity.java | 10 +++-- .../network/NetworkSearchActivity.java | 2 +- .../android/fbreader/network/NetworkView.java | 3 +- .../fbreader/network/RefillAccountTree.java | 5 +++ .../fbreader/network/SearchItemTree.java | 5 +++ .../fbreader/network/NetworkTree.java | 6 +++ .../network/tree/NetworkAuthorTree.java | 5 +++ .../network/tree/NetworkBookTree.java | 5 +++ .../network/tree/NetworkCatalogTree.java | 6 +++ .../network/tree/NetworkSeriesTree.java | 13 +++++++ .../fbreader/network/tree/RootTree.java | 5 +++ 15 files changed, 95 insertions(+), 47 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java index 4b111f5e5..d625d2c86 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java +++ b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java @@ -51,4 +51,9 @@ public class AddCustomCatalogItemTree extends NetworkTree implements ZLAndroidTr public int getCoverResourceId() { return R.drawable.ic_list_plus; } + + @Override + public String getUniqueKey() { + return null; + } } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java index cff6a0021..fda5944e4 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java @@ -226,12 +226,7 @@ class NetworkBookActions extends NetworkTreeActions { private void showBooks(NetworkBaseActivity activity, NetworkTree tree) { - String key = null; - if (tree instanceof NetworkAuthorTree) { - key = PACKAGE + ".Authors:" + ((NetworkAuthorTree) tree).Author.DisplayName; - } else if (tree instanceof NetworkSeriesTree) { - key = PACKAGE + ".Series:" + ((NetworkSeriesTree) tree).SeriesTitle; - } + final String key = tree.getUniqueKey(); if (key != null) { NetworkView.Instance().openTree(activity, tree, key); } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 4fda7af71..111b371bb 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -172,11 +172,12 @@ class NetworkCatalogActions extends NetworkTreeActions { final NetworkCatalogTree catalogTree = (NetworkCatalogTree) tree; final NetworkCatalogItem item = catalogTree.Item; - final String catalogUrl = item.URLByType.get(NetworkCatalogItem.URL_CATALOG); - final boolean isLoading = (catalogUrl != null) ? - NetworkView.Instance().containsItemsLoadingRunnable(catalogUrl) : false; + final String key = tree.getUniqueKey(); + final boolean isLoading = (key != null) ? + NetworkView.Instance().containsItemsLoadingRunnable(key) : false; - prepareOptionsItem(menu, RELOAD_ITEM_ID, catalogUrl != null && !isLoading); + prepareOptionsItem(menu, RELOAD_ITEM_ID, + item.URLByType.get(NetworkCatalogItem.URL_CATALOG) != null && !isLoading); boolean signIn = false; boolean signOut = false; @@ -399,11 +400,11 @@ class NetworkCatalogActions extends NetworkTreeActions { } public void doExpandCatalog(final NetworkBaseActivity activity, final NetworkCatalogTree tree) { - final String url = tree.Item.URLByType.get(NetworkCatalogItem.URL_CATALOG); - if (url == null) { - throw new RuntimeException("That's impossible!!!"); + final String key = tree.getUniqueKey(); + if (key == null) { + throw new RuntimeException("Catalog tree has null unique key. That's impossible!!!"); } - NetworkView.Instance().tryResumeLoading(activity, tree, url, new Runnable() { + NetworkView.Instance().tryResumeLoading(activity, tree, key, new Runnable() { public void run() { boolean resumeNotLoad = false; if (tree.hasChildren()) { @@ -411,7 +412,7 @@ class NetworkCatalogActions extends NetworkTreeActions { if (tree.Item.supportsResumeLoading()) { resumeNotLoad = true; } else { - NetworkView.Instance().openTree(activity, tree, url); + NetworkView.Instance().openTree(activity, tree, key); return; } } else { @@ -421,15 +422,15 @@ class NetworkCatalogActions extends NetworkTreeActions { } } - final ExpandCatalogHandler handler = new ExpandCatalogHandler(tree, url); + final ExpandCatalogHandler handler = new ExpandCatalogHandler(tree, key); NetworkView.Instance().startItemsLoading( activity, - url, + key, new ExpandCatalogRunnable(handler, tree, true, resumeNotLoad) ); processExtraData(activity, tree.Item.extraData(), new Runnable() { public void run() { - NetworkView.Instance().openTree(activity, tree, url); + NetworkView.Instance().openTree(activity, tree, key); } }); } @@ -437,20 +438,20 @@ class NetworkCatalogActions extends NetworkTreeActions { } public void doReloadCatalog(NetworkBaseActivity activity, final NetworkCatalogTree tree) { - final String url = tree.Item.URLByType.get(NetworkCatalogItem.URL_CATALOG); - if (url == null) { - throw new RuntimeException("That's impossible!!!"); + final String key = tree.getUniqueKey(); + if (key == null) { + throw new RuntimeException("Catalog tree has null unique key. That's impossible!!!"); } - if (NetworkView.Instance().containsItemsLoadingRunnable(url)) { + if (NetworkView.Instance().containsItemsLoadingRunnable(key)) { return; } tree.ChildrenItems.clear(); tree.clear(); NetworkView.Instance().fireModelChangedAsync(); - final ExpandCatalogHandler handler = new ExpandCatalogHandler(tree, url); + final ExpandCatalogHandler handler = new ExpandCatalogHandler(tree, key); NetworkView.Instance().startItemsLoading( activity, - url, + key, new ExpandCatalogRunnable(handler, tree, false, false) ); } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index b30016e0c..62f90ded0 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -29,7 +29,6 @@ import android.content.Intent; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.NetworkTree; -import org.geometerplus.fbreader.network.NetworkCatalogItem; import org.geometerplus.fbreader.network.tree.*; public class NetworkCatalogActivity extends NetworkBaseActivity implements UserRegistrationConstants { @@ -112,21 +111,6 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR setProgressBarIndeterminateVisibility(myInProgress); } - private static String getNetworkTreeKey(NetworkTree tree, boolean recursive) { - if (tree instanceof NetworkCatalogTree) { - return ((NetworkCatalogTree) tree).Item.URLByType.get(NetworkCatalogItem.URL_CATALOG); - } else if (tree instanceof SearchItemTree) { - return NetworkSearchActivity.SEARCH_RUNNABLE_KEY; - } else if (recursive && tree.Parent instanceof NetworkTree) { - if (tree instanceof NetworkAuthorTree - || tree instanceof NetworkSeriesTree) { - return getNetworkTreeKey((NetworkTree) tree.Parent, true); - } - } - return null; - } - - @Override public void onDestroy() { if (myTree != null && myCatalogKey != null && NetworkView.Instance().isInitialized()) { @@ -200,10 +184,18 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR } } + private static String getLoadableNetworkTreeKey(NetworkTree tree) { + if ((tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree) + && tree.Parent instanceof NetworkTree) { + return getLoadableNetworkTreeKey((NetworkTree) tree.Parent); + } + return tree.getUniqueKey(); + } + @Override public void onModelChanged() { final NetworkView networkView = NetworkView.Instance(); - final String key = getNetworkTreeKey(myTree, true); + final String key = getLoadableNetworkTreeKey(myTree); myInProgress = key != null && networkView.isInitialized() && networkView.containsItemsLoadingRunnable(key); getListView().invalidateViews(); @@ -227,7 +219,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR } private void doStopLoading() { - final String key = getNetworkTreeKey(myTree, false); + final String key = myCatalogKey; if (key != null && NetworkView.Instance().isInitialized()) { final ItemsLoadingRunnable runnable = NetworkView.Instance().getItemsLoadingRunnable(key); if (runnable != null) { diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index e4b74009d..f463cb57f 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -217,11 +217,15 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { return true; } + private static boolean searchIsInProgress() { + return NetworkView.Instance().containsItemsLoadingRunnable( + NetworkSearchActivity.SEARCH_RUNNABLE_KEY); + } + @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - final boolean searchInProgress = NetworkView.Instance().containsItemsLoadingRunnable(NetworkSearchActivity.SEARCH_RUNNABLE_KEY); - menu.findItem(MENU_SEARCH).setEnabled(!searchInProgress); + menu.findItem(MENU_SEARCH).setEnabled(!searchIsInProgress()); return true; } @@ -289,7 +293,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { @Override public boolean onSearchRequested() { - if (NetworkView.Instance().containsItemsLoadingRunnable(NetworkSearchActivity.SEARCH_RUNNABLE_KEY)) { + if (searchIsInProgress()) { return false; } final NetworkLibrary library = NetworkLibrary.Instance(); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java index bbca41a07..eafb52370 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java @@ -36,7 +36,7 @@ import org.geometerplus.fbreader.network.*; public class NetworkSearchActivity extends Activity { - public static final String SEARCH_RUNNABLE_KEY = "org.geometerplus.android.fbreader.network.NetworkSearchActivity"; + static final String SEARCH_RUNNABLE_KEY = "org.geometerplus.android.fbreader.network.NetworkSearchActivity"; @Override public void onCreate(Bundle icicle) { diff --git a/src/org/geometerplus/android/fbreader/network/NetworkView.java b/src/org/geometerplus/android/fbreader/network/NetworkView.java index 226a30e69..44435fe34 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkView.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkView.java @@ -33,6 +33,7 @@ import android.view.Menu; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.*; +import org.geometerplus.fbreader.network.tree.NetworkCatalogTree; class NetworkView { private static NetworkView ourInstance; @@ -177,7 +178,7 @@ class NetworkView { return getItemsLoadingRunnable(key) != null; } - public void tryResumeLoading(NetworkBaseActivity activity, NetworkTree tree, String key, Runnable expandRunnable) { + public void tryResumeLoading(NetworkBaseActivity activity, NetworkCatalogTree tree, String key, Runnable expandRunnable) { final ItemsLoadingRunnable runnable = getItemsLoadingRunnable(key); if (runnable != null && runnable.tryResumeLoading()) { openTree(activity, tree, key); diff --git a/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java b/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java index a70ea64eb..7d10da183 100644 --- a/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java +++ b/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java @@ -73,4 +73,9 @@ class RefillAccountTree extends NetworkTree implements ZLAndroidTree { public int getCoverResourceId() { return R.drawable.ic_list_library_wallet; } + + @Override + public String getUniqueKey() { + return null; + } } diff --git a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java b/src/org/geometerplus/android/fbreader/network/SearchItemTree.java index 67979ff25..286074501 100644 --- a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java +++ b/src/org/geometerplus/android/fbreader/network/SearchItemTree.java @@ -102,4 +102,9 @@ public class SearchItemTree extends NetworkTree implements ZLAndroidTree { public NetworkLibraryItem getHoldedItem() { return null; } + + @Override + public String getUniqueKey() { + return NetworkSearchActivity.SEARCH_RUNNABLE_KEY; + } } diff --git a/src/org/geometerplus/fbreader/network/NetworkTree.java b/src/org/geometerplus/fbreader/network/NetworkTree.java index 22603e003..b79a30334 100644 --- a/src/org/geometerplus/fbreader/network/NetworkTree.java +++ b/src/org/geometerplus/fbreader/network/NetworkTree.java @@ -90,6 +90,12 @@ public abstract class NetworkTree extends FBTree { public abstract NetworkLibraryItem getHoldedItem(); + /** + * Returns unique identifier which can be used in NetworkView methods + * @return unique String instance + */ + public abstract String getUniqueKey(); + public void removeItems(Set items) { if (items.isEmpty() || subTrees().isEmpty()) { return; diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java index 17a02f627..7a395ab54 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java @@ -123,4 +123,9 @@ public class NetworkAuthorTree extends NetworkTree { public NetworkLibraryItem getHoldedItem() { return null; } + + @Override + public String getUniqueKey() { + return "org.geometerplus.fbreader.network.tree.Authors:" + Author.DisplayName; + } } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java index 8193d3241..df737635b 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java @@ -72,4 +72,9 @@ public class NetworkBookTree extends NetworkTree { public NetworkLibraryItem getHoldedItem() { return Book; } + + @Override + public String getUniqueKey() { + return null; + } } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java index 564c02bad..43b6b14a9 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java @@ -167,4 +167,10 @@ public class NetworkCatalogTree extends NetworkTree { ChildrenItems.removeAll(items); super.removeItems(items); } + + @Override + public String getUniqueKey() { + // FIXME: URL can be the same for POST queries!!! + return Item.URLByType.get(NetworkCatalogItem.URL_CATALOG); + } } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java index 81f838b3e..5ae3f7984 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java @@ -98,4 +98,17 @@ public class NetworkSeriesTree extends NetworkTree { removeSelf(); } } + + @Override + public String getUniqueKey() { + final StringBuilder buffer = new StringBuilder(); + + final String parentKey = ((NetworkTree)Parent).getUniqueKey(); + if (parentKey != null) { + buffer.append(parentKey).append("///"); + } + buffer.append("org.geometerplus.fbreader.network.tree.Series:").append(SeriesTitle); + + return buffer.toString(); + } } diff --git a/src/org/geometerplus/fbreader/network/tree/RootTree.java b/src/org/geometerplus/fbreader/network/tree/RootTree.java index 561566c43..a954f6c32 100644 --- a/src/org/geometerplus/fbreader/network/tree/RootTree.java +++ b/src/org/geometerplus/fbreader/network/tree/RootTree.java @@ -32,4 +32,9 @@ public final class RootTree extends NetworkTree { public NetworkLibraryItem getHoldedItem() { return null; } + + @Override + public String getUniqueKey() { + return null; + } } From eaf46d5427030c2f4dd89f12979fb53e0098ab5d Mon Sep 17 00:00:00 2001 From: Vasiliy Bout Date: Mon, 31 Jan 2011 03:16:34 +0300 Subject: [PATCH 09/71] Final changes to fbreader.network (BUG has been found) --- .../fbreader/network/NetworkBookActions.java | 2 -- .../fbreader/network/NetworkCatalogActions.java | 10 ++++++++++ .../fbreader/network/NetworkCatalogItem.java | 14 +++++++++++++- .../fbreader/network/tree/NetworkCatalogTree.java | 3 +-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java index fda5944e4..f3ef9e04b 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java @@ -49,8 +49,6 @@ import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationMan class NetworkBookActions extends NetworkTreeActions { - private static final String PACKAGE = "org.geometerplus.android.fbreader.network"; - public static final int DOWNLOAD_BOOK_ITEM_ID = 0; public static final int DOWNLOAD_DEMO_ITEM_ID = 1; public static final int READ_BOOK_ITEM_ID = 2; diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 111b371bb..8497949fb 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -422,6 +422,16 @@ class NetworkCatalogActions extends NetworkTreeActions { } } + /* FIXME: if catalog's loading will be very fast + * then it is possible that loading message is lost + * (see ExpandCatalogHandler.afterUpdateCatalog method). + * + * For example, this can be fixed via adding method + * NetworkView.postCatalogLoadingResult, that will do the following: + * 1) If there is activity, then show message + * 2) If there is no activity, then save message, and show when activity is created + * 3) Remove unused messages (say, by timeout) + */ final ExpandCatalogHandler handler = new ExpandCatalogHandler(tree, key); NetworkView.Instance().startItemsLoading( activity, diff --git a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java index 739bc577c..740150adb 100644 --- a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java @@ -103,7 +103,7 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { /** * @return visibility status: on of the values from ZLBoolean3 class. */ - public int getVisibility() { + public final int getVisibility() { if (Visibility == VISIBLE_ALWAYS) { return ZLBoolean3.B3_TRUE; } @@ -140,4 +140,16 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { networkRequest = data.resume(); } } + + /** + * Override this method if result of the request depends not only from URL + * (e.g. result of the POST request depends from the URL and the body of the request). + * + * @return unique String for corresponding network request, for which: + * {@code item1.getFullRequestString().equals(item2.getFullRequestString())} + * iff network requests for items {@code item1} and {@code item2} are the same. + */ + public String getFullRequestString() { + return URLByType.get(URL_CATALOG); + } } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java index 43b6b14a9..614dc00e6 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java @@ -170,7 +170,6 @@ public class NetworkCatalogTree extends NetworkTree { @Override public String getUniqueKey() { - // FIXME: URL can be the same for POST queries!!! - return Item.URLByType.get(NetworkCatalogItem.URL_CATALOG); + return Item.getFullRequestString(); } } From aa3b82a1ba452747d631a9ec4d39aeb8e1e6749f Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Feb 2011 22:06:54 +0000 Subject: [PATCH 10/71] error message style changed: dialog -> toast; more experiments with LitResBookshelfItem --- assets/resources/application/en.xml | 14 ++++++--- .../network/NetworkCatalogActions.java | 31 ++++++------------- src/org/geometerplus/android/util/UIUtil.java | 18 ++++++----- .../litres/LitResBookshelfItem.java | 18 +++++++---- 4 files changed, 41 insertions(+), 40 deletions(-) diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index 1fb978e04..52d531515 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -46,6 +46,15 @@ + + + + + + + + + @@ -554,10 +563,6 @@ - - - - @@ -605,6 +610,7 @@ + diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 8497949fb..ef10d46ad 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -28,7 +28,6 @@ import android.os.Handler; import android.view.Menu; import android.view.ContextMenu; -import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.util.ZLBoolean3; import org.geometerplus.zlibrary.core.network.ZLNetworkException; @@ -318,30 +317,18 @@ class NetworkCatalogActions extends NetworkTreeActions { } private void afterUpdateCatalog(String errorMessage, boolean childrenEmpty) { - final ZLResource dialogResource = ZLResource.resource("dialog"); - ZLResource boxResource = null; + if (!NetworkView.Instance().isInitialized()) { + return; + } + final NetworkCatalogActivity activity = NetworkView.Instance().getOpenedActivity(myKey); + if (activity == null) { + return; + } String msg = null; if (errorMessage != null) { - boxResource = dialogResource.getResource("networkError"); - msg = errorMessage; + UIUtil.showErrorMessageText(activity, errorMessage); } else if (childrenEmpty) { - // TODO: make ListView's empty view instead - boxResource = dialogResource.getResource("emptyCatalogBox"); - msg = boxResource.getResource("message").getValue(); - } - if (msg != null) { - if (NetworkView.Instance().isInitialized()) { - final NetworkCatalogActivity activity = NetworkView.Instance().getOpenedActivity(myKey); - if (activity != null) { - final ZLResource buttonResource = dialogResource.getResource("button"); - new AlertDialog.Builder(activity) - .setTitle(boxResource.getResource("title").getValue()) - .setMessage(msg) - .setIcon(0) - .setPositiveButton(buttonResource.getResource("ok").getValue(), null) - .create().show(); - } - } + UIUtil.showErrorMessage(activity, "emptyCatalog"); } } } diff --git a/src/org/geometerplus/android/util/UIUtil.java b/src/org/geometerplus/android/util/UIUtil.java index c6fe8dbc1..1471a5906 100644 --- a/src/org/geometerplus/android/util/UIUtil.java +++ b/src/org/geometerplus/android/util/UIUtil.java @@ -110,19 +110,21 @@ public abstract class UIUtil { runner.start(); } + public static void showErrorMessageText(Context context, String text) { + Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); + } + public static void showErrorMessage(Context context, String resourceKey) { - Toast.makeText( + showErrorMessageText( context, - ZLResource.resource("errorMessage").getResource(resourceKey).getValue(), - Toast.LENGTH_SHORT - ).show(); + ZLResource.resource("errorMessage").getResource(resourceKey).getValue() + ); } public static void showErrorMessage(Context context, String resourceKey, String parameter) { - Toast.makeText( + showErrorMessageText( context, - ZLResource.resource("errorMessage").getResource(resourceKey).getValue().replace("%s", parameter), - Toast.LENGTH_SHORT - ).show(); + ZLResource.resource("errorMessage").getResource(resourceKey).getValue().replace("%s", parameter) + ); } } diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java index a45a70cb7..88154ea40 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java @@ -21,6 +21,7 @@ package org.geometerplus.fbreader.network.authentication.litres; import java.util.*; +import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.*; @@ -28,12 +29,16 @@ import org.geometerplus.fbreader.network.*; class SortedCatalogItem extends NetworkCatalogItem { private final List myChildren = new LinkedList(); - public SortedCatalogItem(NetworkCatalogItem parent, List children) { - //super(parent.Link, "by author", "books by author", "", Collections.emptyMap()); - super(parent.Link, "by author", "books by author", "", parent.URLByType); + private SortedCatalogItem(NetworkCatalogItem parent, ZLResource resource, List children) { + super(parent.Link, resource.getValue(), resource.getResource("summary").getValue(), "", parent.URLByType); myChildren.addAll(children); } + public SortedCatalogItem(NetworkCatalogItem parent, String resourceKey, List children) { + //super(parent.Link, "by author", "books by author", "", Collections.emptyMap()); + this(parent, ZLResource.resource("networkView").getResource(resourceKey), children); + } + @Override public void onDisplayItem() { } @@ -43,6 +48,7 @@ class SortedCatalogItem extends NetworkCatalogItem { for (NetworkLibraryItem child : myChildren) { listener.onNewItem(Link, child); } + listener.commitItems(Link); } } @@ -82,9 +88,9 @@ public class LitResBookshelfItem extends NetworkCatalogItem { listener.onNewItem(Link, item); } } else { - listener.onNewItem(Link, new SortedCatalogItem(this, children)); - listener.onNewItem(Link, new SortedCatalogItem(this, children)); - listener.onNewItem(Link, new SortedCatalogItem(this, children)); + listener.onNewItem(Link, new SortedCatalogItem(this, "byAuthor", children)); + listener.onNewItem(Link, new SortedCatalogItem(this, "byTitle", children)); + listener.onNewItem(Link, new SortedCatalogItem(this, "byDate", children)); } listener.commitItems(Link); } From ea5a42a6aba25d8b5a9ba847a9dc7d7c1d2f5fb3 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Feb 2011 22:55:56 +0000 Subject: [PATCH 11/71] code cleanup --- .../network/authentication/litres/LitResBookshelfItem.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java index 88154ea40..c2f7478ae 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java @@ -35,7 +35,6 @@ class SortedCatalogItem extends NetworkCatalogItem { } public SortedCatalogItem(NetworkCatalogItem parent, String resourceKey, List children) { - //super(parent.Link, "by author", "books by author", "", Collections.emptyMap()); this(parent, ZLResource.resource("networkView").getResource(resourceKey), children); } @@ -88,9 +87,9 @@ public class LitResBookshelfItem extends NetworkCatalogItem { listener.onNewItem(Link, item); } } else { + listener.onNewItem(Link, new SortedCatalogItem(this, "byDate", children)); listener.onNewItem(Link, new SortedCatalogItem(this, "byAuthor", children)); listener.onNewItem(Link, new SortedCatalogItem(this, "byTitle", children)); - listener.onNewItem(Link, new SortedCatalogItem(this, "byDate", children)); } listener.commitItems(Link); } From 73b9d5d1e5f7be95c2f3006b4b45950f238320d0 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 6 Feb 2011 00:22:25 +0000 Subject: [PATCH 12/71] resources synchronization --- assets/resources/application/cs.xml | 5 +---- assets/resources/application/de.xml | 5 +---- assets/resources/application/fr.xml | 5 +---- assets/resources/application/gl.xml | 5 +---- assets/resources/application/hu.xml | 5 +---- assets/resources/application/it.xml | 5 +---- assets/resources/application/nl.xml | 5 +---- assets/resources/application/ru.xml | 5 +---- assets/resources/application/uk.xml | 5 +---- assets/resources/application/vi.xml | 5 +---- assets/resources/application/zh.xml | 5 +---- 11 files changed, 11 insertions(+), 44 deletions(-) diff --git a/assets/resources/application/cs.xml b/assets/resources/application/cs.xml index 02bb50383..e2706f99e 100644 --- a/assets/resources/application/cs.xml +++ b/assets/resources/application/cs.xml @@ -559,10 +559,6 @@ - - - - @@ -610,6 +606,7 @@ + diff --git a/assets/resources/application/de.xml b/assets/resources/application/de.xml index a5f4ef6ae..8ecfea5f9 100644 --- a/assets/resources/application/de.xml +++ b/assets/resources/application/de.xml @@ -560,10 +560,6 @@ - - - - @@ -611,6 +607,7 @@ + diff --git a/assets/resources/application/fr.xml b/assets/resources/application/fr.xml index f9bd3390f..f3fd481e6 100644 --- a/assets/resources/application/fr.xml +++ b/assets/resources/application/fr.xml @@ -562,10 +562,6 @@ - - - - @@ -613,6 +609,7 @@ + diff --git a/assets/resources/application/gl.xml b/assets/resources/application/gl.xml index 9fabc7324..a8277d966 100644 --- a/assets/resources/application/gl.xml +++ b/assets/resources/application/gl.xml @@ -559,10 +559,6 @@ - - - - @@ -610,6 +606,7 @@ + diff --git a/assets/resources/application/hu.xml b/assets/resources/application/hu.xml index 9a514b903..f0aac8ce3 100644 --- a/assets/resources/application/hu.xml +++ b/assets/resources/application/hu.xml @@ -559,10 +559,6 @@ - - - - @@ -610,6 +606,7 @@ + diff --git a/assets/resources/application/it.xml b/assets/resources/application/it.xml index 677225789..bc8725496 100644 --- a/assets/resources/application/it.xml +++ b/assets/resources/application/it.xml @@ -559,10 +559,6 @@ - - - - @@ -610,6 +606,7 @@ + diff --git a/assets/resources/application/nl.xml b/assets/resources/application/nl.xml index 937e00481..5722ce571 100644 --- a/assets/resources/application/nl.xml +++ b/assets/resources/application/nl.xml @@ -559,10 +559,6 @@ - - - - @@ -610,6 +606,7 @@ + diff --git a/assets/resources/application/ru.xml b/assets/resources/application/ru.xml index b6b34d4da..835201f0c 100644 --- a/assets/resources/application/ru.xml +++ b/assets/resources/application/ru.xml @@ -558,10 +558,6 @@ - - - - @@ -609,6 +605,7 @@ + diff --git a/assets/resources/application/uk.xml b/assets/resources/application/uk.xml index cd76fe5b3..0680a11d2 100644 --- a/assets/resources/application/uk.xml +++ b/assets/resources/application/uk.xml @@ -559,10 +559,6 @@ - - - - @@ -610,6 +606,7 @@ + diff --git a/assets/resources/application/vi.xml b/assets/resources/application/vi.xml index c4ecfcbbf..479383ca1 100644 --- a/assets/resources/application/vi.xml +++ b/assets/resources/application/vi.xml @@ -559,10 +559,6 @@ - - - - @@ -610,6 +606,7 @@ + diff --git a/assets/resources/application/zh.xml b/assets/resources/application/zh.xml index 60248ba65..e042b4738 100644 --- a/assets/resources/application/zh.xml +++ b/assets/resources/application/zh.xml @@ -559,10 +559,6 @@ - - - - @@ -610,6 +606,7 @@ + From d7ded9b2ebcb98c8dba53cafd10282f0fba8b66f Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 6 Feb 2011 10:01:24 +0000 Subject: [PATCH 13/71] "by series" branch --- assets/resources/application/en.xml | 3 + .../network/NetworkBookItemComparator.java | 2 - .../litres/LitResAuthenticationManager.java | 6 +- .../litres/LitResBookshelfItem.java | 100 +++++++++++++++++- 4 files changed, 101 insertions(+), 10 deletions(-) diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index a38d2d94f..219907539 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -55,6 +55,9 @@ + + + diff --git a/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java b/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java index eaf162871..db8981e73 100644 --- a/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java +++ b/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java @@ -22,9 +22,7 @@ package org.geometerplus.fbreader.network; import java.util.Comparator; import java.util.LinkedList; - public final class NetworkBookItemComparator implements Comparator { - public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { final boolean item0isABook = item0 instanceof NetworkBookItem; final boolean item1isABook = item1 instanceof NetworkBookItem; diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java index eba9ed973..9553cc2a4 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java @@ -361,11 +361,11 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { } private void loadPurchasedBooksOnSuccess(LitResNetworkRequest purchasedBooksRequest) { - LitResXMLReader reader = (LitResXMLReader) purchasedBooksRequest.Reader; + LitResXMLReader reader = (LitResXMLReader)purchasedBooksRequest.Reader; myPurchasedBooks.clear(); for (NetworkLibraryItem item: reader.Books) { if (item instanceof NetworkBookItem) { - NetworkBookItem book = (NetworkBookItem) item; + NetworkBookItem book = (NetworkBookItem)item; myPurchasedBooks.put(book.Id, book); } } @@ -390,7 +390,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { } private void loadAccountOnSuccess(LitResNetworkRequest accountRequest) { - LitResPurchaseXMLReader reader = (LitResPurchaseXMLReader) accountRequest.Reader; + LitResPurchaseXMLReader reader = (LitResPurchaseXMLReader)accountRequest.Reader; myAccount = BuyBookReference.price(reader.Account, "RUB"); } diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java index c2f7478ae..62c7418ac 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java @@ -26,12 +26,29 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.*; -class SortedCatalogItem extends NetworkCatalogItem { +abstract class SortedCatalogItem extends NetworkCatalogItem { private final List myChildren = new LinkedList(); private SortedCatalogItem(NetworkCatalogItem parent, ZLResource resource, List children) { super(parent.Link, resource.getValue(), resource.getResource("summary").getValue(), "", parent.URLByType); - myChildren.addAll(children); + for (NetworkLibraryItem child : children) { + if (accepts(child)) { + myChildren.add(child); + } + } + final Comparator comparator = getComparator(); + if (comparator != null) { + Collections.sort(myChildren, comparator); + } + } + + public boolean isEmpty() { + return myChildren.isEmpty(); + } + + protected abstract Comparator getComparator(); + protected boolean accepts(NetworkLibraryItem item) { + return item instanceof NetworkBookItem; } public SortedCatalogItem(NetworkCatalogItem parent, String resourceKey, List children) { @@ -51,6 +68,75 @@ class SortedCatalogItem extends NetworkCatalogItem { } } +class ByAuthorCatalogItem extends SortedCatalogItem { + ByAuthorCatalogItem(NetworkCatalogItem parent, List children) { + super(parent, "byAuthor", children); + } + + @Override + protected Comparator getComparator() { + return new NetworkBookItemComparator(); + } +} + +class ByTitleCatalogItem extends SortedCatalogItem { + ByTitleCatalogItem(NetworkCatalogItem parent, List children) { + super(parent, "byTitle", children); + } + + @Override + protected Comparator getComparator() { + return new Comparator() { + public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { + return item0.Title.compareTo(item1.Title); + } + }; + } +} + +class ByDateCatalogItem extends SortedCatalogItem { + ByDateCatalogItem(NetworkCatalogItem parent, List children) { + super(parent, "byDate", children); + } + + @Override + protected Comparator getComparator() { + return new Comparator() { + public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { + return 0; + } + }; + } +} + +class BySeriesCatalogItem extends SortedCatalogItem { + BySeriesCatalogItem(NetworkCatalogItem parent, List children) { + super(parent, "bySeries", children); + } + + @Override + protected Comparator getComparator() { + return new Comparator() { + public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { + final NetworkBookItem book0 = (NetworkBookItem)item0; + final NetworkBookItem book1 = (NetworkBookItem)item1; + int diff = book0.SeriesTitle.compareTo(book1.SeriesTitle); + if (diff == 0) { + diff = book0.IndexInSeries - book1.IndexInSeries; + } + return diff != 0 ? diff : book0.Title.compareTo(book1.Title); + } + }; + } + + @Override + protected boolean accepts(NetworkLibraryItem item) { + return + item instanceof NetworkBookItem && + ((NetworkBookItem)item).SeriesTitle != null; + } +} + public class LitResBookshelfItem extends NetworkCatalogItem { private boolean myForceReload; @@ -87,9 +173,13 @@ public class LitResBookshelfItem extends NetworkCatalogItem { listener.onNewItem(Link, item); } } else { - listener.onNewItem(Link, new SortedCatalogItem(this, "byDate", children)); - listener.onNewItem(Link, new SortedCatalogItem(this, "byAuthor", children)); - listener.onNewItem(Link, new SortedCatalogItem(this, "byTitle", children)); + listener.onNewItem(Link, new ByDateCatalogItem(this, children)); + listener.onNewItem(Link, new ByAuthorCatalogItem(this, children)); + listener.onNewItem(Link, new ByTitleCatalogItem(this, children)); + final BySeriesCatalogItem bySeries = new BySeriesCatalogItem(this, children); + if (!bySeries.isEmpty()) { + listener.onNewItem(Link, bySeries); + } } listener.commitItems(Link); } From 9b97f41248e7177bc3e2bfec394718ecf30ea578 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 12 Feb 2011 02:40:51 +0000 Subject: [PATCH 14/71] fixed compilation issue --- .../fbreader/network/NetworkCatalogItem.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java index 1750cc77d..678d51973 100644 --- a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java @@ -67,21 +67,6 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { this(link, title, summary, cover, urlByType, Accessibility.ALWAYS, CatalogType.OTHER); } - /** - * Creates new NetworkCatalogItem instance with specified accessibility and CatalogType.OTHER type. - * - * @param link corresponding NetworkLink object. Must be not null. - * @param title title of this library item. Must be not null. - * @param summary description of this library item. Can be null. - * @param cover cover url. Can be null. - * @param urlByType map contains URLs and their types. Must be not null. - * @param accessibility value defines when this library item will be accessible - * in the network library view. - */ - public NetworkCatalogItem(INetworkLink link, String title, String summary, String cover, Map urlByType, Accessibility accessibility) { - this(link, title, summary, cover, urlByType, accessibility, CatalogType.OTHER); - } - /** * Creates new NetworkCatalogItem instance with specified accessibility and type. * From 8deae7154cb6f78af2512326334bbd3cc99b1e63 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 12 Feb 2011 12:43:22 +0000 Subject: [PATCH 15/71] resources synchronization --- assets/resources/application/ru.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/assets/resources/application/ru.xml b/assets/resources/application/ru.xml index 835201f0c..a3c700bd7 100644 --- a/assets/resources/application/ru.xml +++ b/assets/resources/application/ru.xml @@ -46,6 +46,18 @@ + + + + + + + + + + + + From d84969c5f5c9b2b8445bba18c0b2abcaeb8beeea Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 12 Feb 2011 13:51:27 +0000 Subject: [PATCH 16/71] fixed compilation issue --- .../geometerplus/android/fbreader/network/BasketTree.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/org/geometerplus/android/fbreader/network/BasketTree.java b/src/org/geometerplus/android/fbreader/network/BasketTree.java index 4adf8c7ee..d6306a551 100644 --- a/src/org/geometerplus/android/fbreader/network/BasketTree.java +++ b/src/org/geometerplus/android/fbreader/network/BasketTree.java @@ -54,4 +54,9 @@ public class BasketTree extends NetworkTree implements ZLAndroidTree { public NetworkLibraryItem getHoldedItem() { return null; } + + @Override + public String getUniqueKey() { + return null; + } } From 839430ac1534d9a63e33ba88be21454f9788d399 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 13 Feb 2011 00:25:17 +0000 Subject: [PATCH 17/71] code cleanup: extra null checks have been removed --- .../fbreader/network/NetworkBookActions.java | 14 +++----------- .../fbreader/network/NetworkCatalogActions.java | 11 ++--------- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java index e24b2167b..4e3678434 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java @@ -217,23 +217,15 @@ class NetworkBookActions extends NetworkTreeActions { public boolean runAction(NetworkBaseActivity activity, NetworkTree tree, int actionCode) { if (tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree) { switch (actionCode) { - case SHOW_BOOKS_ITEM_ID: - showBooks(activity, tree); - return true; + case SHOW_BOOKS_ITEM_ID: + NetworkView.Instance().openTree(activity, tree, tree.getUniqueKey()); + return true; } return false; } return runAction(activity, ((NetworkBookTree) tree).Book, actionCode); } - - private void showBooks(NetworkBaseActivity activity, NetworkTree tree) { - final String key = tree.getUniqueKey(); - if (key != null) { - NetworkView.Instance().openTree(activity, tree, key); - } - } - static boolean runAction(Activity activity, NetworkBookItem book, int actionCode) { switch (actionCode) { case DOWNLOAD_BOOK_ITEM_ID: diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 642b79edb..55149725e 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -159,9 +159,8 @@ class NetworkCatalogActions extends NetworkTreeActions { final NetworkCatalogTree catalogTree = (NetworkCatalogTree) tree; final NetworkCatalogItem item = catalogTree.Item; - final String key = tree.getUniqueKey(); - final boolean isLoading = (key != null) ? - NetworkView.Instance().containsItemsLoadingRunnable(key) : false; + final boolean isLoading = + NetworkView.Instance().containsItemsLoadingRunnable(tree.getUniqueKey()); prepareOptionsItem(menu, RELOAD_ITEM_ID, item.URLByType.get(NetworkCatalogItem.URL_CATALOG) != null && !isLoading); @@ -375,9 +374,6 @@ class NetworkCatalogActions extends NetworkTreeActions { public void doExpandCatalog(final NetworkBaseActivity activity, final NetworkCatalogTree tree) { final String key = tree.getUniqueKey(); - if (key == null) { - throw new RuntimeException("Catalog tree has null unique key. That's impossible!!!"); - } NetworkView.Instance().tryResumeLoading(activity, tree, key, new Runnable() { public void run() { boolean resumeNotLoad = false; @@ -423,9 +419,6 @@ class NetworkCatalogActions extends NetworkTreeActions { public void doReloadCatalog(NetworkBaseActivity activity, final NetworkCatalogTree tree) { final String key = tree.getUniqueKey(); - if (key == null) { - throw new RuntimeException("Catalog tree has null unique key. That's impossible!!!"); - } if (NetworkView.Instance().containsItemsLoadingRunnable(key)) { return; } From 2d5af67acd9f6316535b6b4baa2618c7203bc294 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 18 Feb 2011 23:20:58 +0000 Subject: [PATCH 18/71] basket announcement will be moved to network feed --- .../android/fbreader/network/NetworkCatalogActivity.java | 3 +-- .../fbreader/network/opds/NetworkOPDSFeedReader.java | 9 +++++++++ .../fbreader/network/opds/OPDSConstants.java | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index cd1b16f7a..1330df162 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -37,7 +37,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR private NetworkTree myTree; private String myCatalogKey; - private boolean myInProgress; + private volatile boolean myInProgress; @Override public void onCreate(Bundle icicle) { @@ -125,7 +125,6 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR } private final class CatalogAdapter extends BaseAdapter { - private ArrayList mySpecialItems; public CatalogAdapter() { diff --git a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java index 7b51c18c7..c064ce1a1 100644 --- a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java +++ b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java @@ -457,6 +457,15 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes urlMap, opdsLink.getCondition(entry.Id.Uri) ); + } else if (REL_BASKET.equals(litresRel)) { + return new LitResRecommendationsItem( + opdsLink, + entry.Title, + annotation, + coverURL, + urlMap, + opdsLink.getCondition(entry.Id.Uri) + ); } else { return null; } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSConstants.java b/src/org/geometerplus/fbreader/network/opds/OPDSConstants.java index 9f20b253d..a66838957 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSConstants.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSConstants.java @@ -24,6 +24,7 @@ interface OPDSConstants { // Feed level String REL_BOOKSHELF = "http://data.fbreader.org/rel/bookshelf"; String REL_RECOMMENDATIONS = "http://data.fbreader.org/rel/recommendations"; + String REL_BASKET = "http://data.fbreader.org/rel/basket"; //String REL_SUBSCRIPTIONS = "http://opds-spec.org/subscriptions"; // Entry level / catalog types From a193a35f8514e4b68a3b62f3d5b3f1507dda60a6 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 19 Feb 2011 02:52:56 +0000 Subject: [PATCH 19/71] first basket implementation --- .../android/fbreader/network/BasketTree.java | 62 ------------------- .../fbreader/network/NetworkBookActions.java | 14 ++++- .../network/NetworkCatalogActivity.java | 1 - .../fbreader/network/INetworkLink.java | 5 ++ .../litres/LitResBasketItem.java | 52 ++++++++++++++++ .../network/opds/NetworkOPDSFeedReader.java | 3 +- .../network/opds/OPDSNetworkLink.java | 33 +++++++++- 7 files changed, 104 insertions(+), 66 deletions(-) delete mode 100644 src/org/geometerplus/android/fbreader/network/BasketTree.java create mode 100644 src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java diff --git a/src/org/geometerplus/android/fbreader/network/BasketTree.java b/src/org/geometerplus/android/fbreader/network/BasketTree.java deleted file mode 100644 index d6306a551..000000000 --- a/src/org/geometerplus/android/fbreader/network/BasketTree.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2010-2011 Geometer Plus - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package org.geometerplus.android.fbreader.network; - -import java.util.*; - -import org.geometerplus.zlibrary.core.resources.ZLResource; - -import org.geometerplus.fbreader.tree.FBTree; -import org.geometerplus.fbreader.network.*; -import org.geometerplus.fbreader.network.tree.NetworkAuthorTree; - -import org.geometerplus.zlibrary.ui.android.R; - -import org.geometerplus.android.fbreader.tree.ZLAndroidTree; - -public class BasketTree extends NetworkTree implements ZLAndroidTree { - public BasketTree() { - super(2); - } - - @Override - public String getName() { - return ZLResource.resource("networkView").getResource("basket").getValue(); - } - - @Override - public String getSummary() { - return ZLResource.resource("networkView").getResource("basketSummary").getValue(); - } - - public int getCoverResourceId() { - return R.drawable.ic_list_library_basket; - } - - @Override - public NetworkLibraryItem getHoldedItem() { - return null; - } - - @Override - public String getUniqueKey() { - return null; - } -} diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java index 4e3678434..0826089dc 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java @@ -185,7 +185,13 @@ class NetworkBookActions extends NetworkTreeActions { final String price = ((BuyBookReference) reference).Price; actions.add(new Action(id, "buy", price)); } - actions.add(new Action(ADD_BOOK_TO_BASKET, "addToBasket")); + if (book.Link.supportsBasket()) { + if (book.Link.isBookInBasket(book)) { + actions.add(new Action(REMOVE_BOOK_FROM_BASKET, "removeFromBasket")); + } else { + actions.add(new Action(ADD_BOOK_TO_BASKET, "addToBasket")); + } + } } return actions; } @@ -255,6 +261,12 @@ class NetworkBookActions extends NetworkTreeActions { case SHOW_BOOK_ACTIVITY_ITEM_ID: NetworkView.Instance().showBookInfoActivity(activity, book); return true; + case ADD_BOOK_TO_BASKET: + book.Link.addToBasket(book); + return true; + case REMOVE_BOOK_FROM_BASKET: + book.Link.removeFromBasket(book); + return true; } return false; } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index 1330df162..d69d84838 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -132,7 +132,6 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR final NetworkCatalogRootTree rootTree = (NetworkCatalogRootTree)myTree; mySpecialItems = new ArrayList(); if (Util.isAccountRefillingSupported(NetworkCatalogActivity.this, rootTree.Item.Link)) { - mySpecialItems.add(new BasketTree()); mySpecialItems.add(new RefillAccountTree(rootTree)); } if (mySpecialItems.size() > 0) { diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index 105174aaf..852516367 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -61,5 +61,10 @@ public interface INetworkLink { NetworkCatalogItem libraryItem(); NetworkAuthenticationManager authenticationManager(); + boolean supportsBasket(); + void addToBasket(NetworkBookItem book); + void removeFromBasket(NetworkBookItem book); + boolean isBookInBasket(NetworkBookItem book); + String rewriteUrl(String url, boolean isUrlExternal); } diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java new file mode 100644 index 000000000..d7a5242db --- /dev/null +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2010-2011 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.fbreader.network.authentication.litres; + +import java.util.Map; + +import org.geometerplus.zlibrary.core.util.ZLNetworkUtil; + +import org.geometerplus.fbreader.network.INetworkLink; +import org.geometerplus.fbreader.network.NetworkBookItem; +import org.geometerplus.fbreader.network.opds.OPDSNetworkLink; +import org.geometerplus.fbreader.network.opds.OPDSCatalogItem; + +public class LitResBasketItem extends OPDSCatalogItem { + public LitResBasketItem(INetworkLink link, String title, String summary, String cover, Map urlByType, Accessibility accessibility) { + super(link, title, summary, cover, urlByType, accessibility, CatalogType.BY_SERIES); + ((OPDSNetworkLink)link).setSupportsBasket(); + } + + @Override + protected String getUrl() { + final StringBuilder builder = new StringBuilder(); + boolean flag = false; + for (String bookId : ((OPDSNetworkLink)Link).booksInBasket()) { + if (flag) { + builder.append(','); + } else { + flag = true; + } + builder.append(bookId); + } + + return ZLNetworkUtil.appendParameter(URLByType.get(URL_CATALOG), "ids", builder.toString()); + } +} diff --git a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java index c064ce1a1..e04e69d8c 100644 --- a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java +++ b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java @@ -26,6 +26,7 @@ import org.geometerplus.zlibrary.core.util.ZLNetworkUtil; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.atom.*; +import org.geometerplus.fbreader.network.authentication.litres.LitResBasketItem; import org.geometerplus.fbreader.network.authentication.litres.LitResBookshelfItem; import org.geometerplus.fbreader.network.authentication.litres.LitResRecommendationsItem; @@ -458,7 +459,7 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes opdsLink.getCondition(entry.Id.Uri) ); } else if (REL_BASKET.equals(litresRel)) { - return new LitResRecommendationsItem( + return new LitResBasketItem( opdsLink, entry.Title, annotation, diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index 1209fbabc..267d55f3e 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -34,7 +34,7 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; -class OPDSNetworkLink extends AbstractNetworkLink { +public class OPDSNetworkLink extends AbstractNetworkLink { private TreeMap myRelationAliases; private TreeMap myUrlConditions; @@ -42,6 +42,9 @@ class OPDSNetworkLink extends AbstractNetworkLink { private final Map myExtraData = new HashMap(); private NetworkAuthenticationManager myAuthenticationManager; + private boolean mySupportsBasket; + private final List myBooksInBasket = new LinkedList(); + private final boolean myHasStableIdentifiers; OPDSNetworkLink(String siteName, String title, String summary, String icon, String language, @@ -143,6 +146,34 @@ class OPDSNetworkLink extends AbstractNetworkLink { return myAuthenticationManager; } + public final void setSupportsBasket() { + mySupportsBasket = true; + } + + public final boolean supportsBasket() { + return mySupportsBasket; + } + + public final void addToBasket(NetworkBookItem book) { + if (supportsBasket()) { + myBooksInBasket.add(book.Id); + } + } + + public final void removeFromBasket(NetworkBookItem book) { + if (supportsBasket()) { + myBooksInBasket.remove(book.Id); + } + } + + public final boolean isBookInBasket(NetworkBookItem book) { + return myBooksInBasket.contains(book.Id); + } + + public final List booksInBasket() { + return Collections.unmodifiableList(myBooksInBasket); + } + public String rewriteUrl(String url, boolean isUrlExternal) { for (URLRewritingRule rule: myUrlRewritingRules) { if (rule.Apply != URLRewritingRule.APPLY_ALWAYS) { From ec4d95c3389d79e6a71de15eebf31240a5568eb4 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 19 Feb 2011 12:10:36 +0000 Subject: [PATCH 20/71] basket: persistent storage, use in recommendations list --- .../litres/LitResRecommendationsItem.java | 9 +++ .../network/opds/OPDSNetworkLink.java | 22 +++-- .../core/options/ZLStringListOption.java | 81 +++++++++++++++++++ 3 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java index 9c7bbc761..d00671229 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java @@ -26,6 +26,7 @@ import org.geometerplus.zlibrary.core.util.ZLNetworkUtil; import org.geometerplus.fbreader.network.INetworkLink; import org.geometerplus.fbreader.network.NetworkBookItem; import org.geometerplus.fbreader.network.opds.OPDSCatalogItem; +import org.geometerplus.fbreader.network.opds.OPDSNetworkLink; public class LitResRecommendationsItem extends OPDSCatalogItem { public LitResRecommendationsItem(INetworkLink link, String title, String summary, String cover, Map urlByType, Accessibility accessibility) { @@ -46,6 +47,14 @@ public class LitResRecommendationsItem extends OPDSCatalogItem { } builder.append(book.Id); } + for (String bookId : ((OPDSNetworkLink)Link).booksInBasket()) { + if (flag) { + builder.append(','); + } else { + flag = true; + } + builder.append(bookId); + } return ZLNetworkUtil.appendParameter(URLByType.get(URL_CATALOG), "ids", builder.toString()); } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index 267d55f3e..702953d93 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -30,6 +30,7 @@ import org.geometerplus.zlibrary.core.util.ZLMiscUtil; import org.geometerplus.zlibrary.core.util.ZLNetworkUtil; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; +import org.geometerplus.zlibrary.core.options.ZLStringListOption; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; @@ -43,7 +44,7 @@ public class OPDSNetworkLink extends AbstractNetworkLink { private NetworkAuthenticationManager myAuthenticationManager; private boolean mySupportsBasket; - private final List myBooksInBasket = new LinkedList(); + private final ZLStringListOption myBooksInBasketOption; private final boolean myHasStableIdentifiers; @@ -51,6 +52,7 @@ public class OPDSNetworkLink extends AbstractNetworkLink { Map links, boolean hasStableIdentifiers) { super(siteName, title, summary, icon, language, links); myHasStableIdentifiers = hasStableIdentifiers; + myBooksInBasketOption = new ZLStringListOption(siteName, "Basket", null); } final void setRelationAliases(Map relationAliases) { @@ -156,22 +158,32 @@ public class OPDSNetworkLink extends AbstractNetworkLink { public final void addToBasket(NetworkBookItem book) { if (supportsBasket()) { - myBooksInBasket.add(book.Id); + List ids = myBooksInBasketOption.getValue(); + if (!ids.contains(book.Id)) { + ids = new ArrayList(ids); + ids.add(book.Id); + myBooksInBasketOption.setValue(ids); + } } } public final void removeFromBasket(NetworkBookItem book) { if (supportsBasket()) { - myBooksInBasket.remove(book.Id); + List ids = myBooksInBasketOption.getValue(); + if (ids.contains(book.Id)) { + ids = new ArrayList(ids); + ids.remove(book.Id); + myBooksInBasketOption.setValue(ids); + } } } public final boolean isBookInBasket(NetworkBookItem book) { - return myBooksInBasket.contains(book.Id); + return myBooksInBasketOption.getValue().contains(book.Id); } public final List booksInBasket() { - return Collections.unmodifiableList(myBooksInBasket); + return myBooksInBasketOption.getValue(); } public String rewriteUrl(String url, boolean isUrlExternal) { diff --git a/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java b/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java new file mode 100644 index 000000000..bf7cba727 --- /dev/null +++ b/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2007-2011 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.zlibrary.core.options; + +import java.util.*; + +public class ZLStringListOption extends ZLOption { + private final List myDefaultValue; + private List myValue; + + private static String listToString(List list) { + if (list == null || list.isEmpty()) { + return ""; + } + final StringBuilder builder = new StringBuilder(); + boolean first = true; + for (String s : list) { + if (first) { + first = false; + } else { + builder.append(","); + } + builder.append(s); + } + return builder.toString(); + } + + private static List stringToList(String str) { + return Arrays.asList(str.split(",")); + } + + public ZLStringListOption(String group, String optionName, List defaultValue) { + super(group, optionName); + myDefaultValue = (defaultValue != null) ? defaultValue : Collections.emptyList(); + myValue = myDefaultValue; + } + + public List getValue() { + if (!myIsSynchronized) { + final String value = getConfigValue(listToString(myDefaultValue)); + if (value != null) { + myValue = stringToList(value); + } + myIsSynchronized = true; + } + return Collections.unmodifiableList(myValue); + } + + public void setValue(List value) { + if (value == null) { + value = Collections.emptyList(); + } + if (myIsSynchronized && (myValue.equals(value))) { + return; + } + myValue = new ArrayList(value); + if (value.equals(myDefaultValue)) { + unsetConfigValue(); + } else { + setConfigValue(listToString(value)); + } + myIsSynchronized = true; + } +} From 3cf18954a884b6848ee908e05cb80c7cc1d8bc68 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 19 Feb 2011 14:58:00 +0000 Subject: [PATCH 21/71] no empty book id's in the list --- .../geometerplus/fbreader/network/opds/OPDSNetworkLink.java | 4 ++-- .../zlibrary/core/options/ZLStringListOption.java | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index 702953d93..4b0ce9e29 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -157,7 +157,7 @@ public class OPDSNetworkLink extends AbstractNetworkLink { } public final void addToBasket(NetworkBookItem book) { - if (supportsBasket()) { + if (supportsBasket() && book.Id != null && !"".equals(book.Id)) { List ids = myBooksInBasketOption.getValue(); if (!ids.contains(book.Id)) { ids = new ArrayList(ids); @@ -168,7 +168,7 @@ public class OPDSNetworkLink extends AbstractNetworkLink { } public final void removeFromBasket(NetworkBookItem book) { - if (supportsBasket()) { + if (supportsBasket() && book.Id != null && !"".equals(book.Id)) { List ids = myBooksInBasketOption.getValue(); if (ids.contains(book.Id)) { ids = new ArrayList(ids); diff --git a/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java b/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java index bf7cba727..4f7081403 100644 --- a/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java +++ b/src/org/geometerplus/zlibrary/core/options/ZLStringListOption.java @@ -43,6 +43,9 @@ public class ZLStringListOption extends ZLOption { } private static List stringToList(String str) { + if (str == null || "".equals(str)) { + return Collections.emptyList(); + } return Arrays.asList(str.split(",")); } From 2344537a12f0261968dca03d5a27bf1931bef369 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 20 Feb 2011 11:11:16 +0000 Subject: [PATCH 22/71] recommendations subcatalog will be visible even if user is not logged (if basket is non-empty) --- src/org/geometerplus/fbreader/network/INetworkLink.java | 2 ++ src/org/geometerplus/fbreader/network/NetworkCatalogItem.java | 3 ++- .../network/authentication/litres/LitResBasketItem.java | 2 +- .../authentication/litres/LitResRecommendationsItem.java | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index 852516367..820f01385 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -19,6 +19,7 @@ package org.geometerplus.fbreader.network; +import java.util.List; import java.util.Set; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; @@ -65,6 +66,7 @@ public interface INetworkLink { void addToBasket(NetworkBookItem book); void removeFromBasket(NetworkBookItem book); boolean isBookInBasket(NetworkBookItem book); + List booksInBasket(); String rewriteUrl(String url, boolean isUrlExternal); } diff --git a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java index 678d51973..2e9292d26 100644 --- a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java @@ -131,7 +131,8 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { return ZLBoolean3.B3_UNDEFINED; } case HAS_BOOKS: - if (mgr != null && mgr.purchasedBooks().size() > 0) { + if (Link.booksInBasket().size() > 0 || + (mgr != null && mgr.purchasedBooks().size() > 0)) { return ZLBoolean3.B3_TRUE; } else { return ZLBoolean3.B3_FALSE; diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java index d7a5242db..c308f4cb9 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java @@ -38,7 +38,7 @@ public class LitResBasketItem extends OPDSCatalogItem { protected String getUrl() { final StringBuilder builder = new StringBuilder(); boolean flag = false; - for (String bookId : ((OPDSNetworkLink)Link).booksInBasket()) { + for (String bookId : Link.booksInBasket()) { if (flag) { builder.append(','); } else { diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java index d00671229..3996fb009 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java @@ -47,7 +47,7 @@ public class LitResRecommendationsItem extends OPDSCatalogItem { } builder.append(book.Id); } - for (String bookId : ((OPDSNetworkLink)Link).booksInBasket()) { + for (String bookId : Link.booksInBasket()) { if (flag) { builder.append(','); } else { From 1ba700a8a1b9f039ba14c6f649fda3060593d404 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Mon, 21 Feb 2011 11:18:07 +0000 Subject: [PATCH 23/71] public => private --- .../android/fbreader/network/NetworkCatalogActions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 55149725e..5ccd099ab 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -372,7 +372,7 @@ class NetworkCatalogActions extends NetworkTreeActions { } } - public void doExpandCatalog(final NetworkBaseActivity activity, final NetworkCatalogTree tree) { + private void doExpandCatalog(final NetworkBaseActivity activity, final NetworkCatalogTree tree) { final String key = tree.getUniqueKey(); NetworkView.Instance().tryResumeLoading(activity, tree, key, new Runnable() { public void run() { From a1b5fd9288e27e67e1fe761e7c5c2b13c45dcbe5 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 22 Feb 2011 12:08:36 +0000 Subject: [PATCH 24/71] resources synchronization --- assets/resources/application/cs.xml | 2 ++ assets/resources/application/de.xml | 2 ++ assets/resources/application/fr.xml | 2 ++ assets/resources/application/gl.xml | 2 ++ assets/resources/application/hu.xml | 2 ++ assets/resources/application/it.xml | 2 ++ assets/resources/application/nl.xml | 2 ++ assets/resources/application/ru.xml | 2 ++ assets/resources/application/th.xml | 2 ++ assets/resources/application/uk.xml | 2 ++ assets/resources/application/vi.xml | 2 ++ assets/resources/application/zh.xml | 2 ++ 12 files changed, 24 insertions(+) diff --git a/assets/resources/application/cs.xml b/assets/resources/application/cs.xml index 409e0496d..08f1f978c 100644 --- a/assets/resources/application/cs.xml +++ b/assets/resources/application/cs.xml @@ -57,6 +57,8 @@ + + diff --git a/assets/resources/application/de.xml b/assets/resources/application/de.xml index 8ecfea5f9..01d157858 100644 --- a/assets/resources/application/de.xml +++ b/assets/resources/application/de.xml @@ -58,6 +58,8 @@ + + diff --git a/assets/resources/application/fr.xml b/assets/resources/application/fr.xml index f3fd481e6..48e5d10f6 100644 --- a/assets/resources/application/fr.xml +++ b/assets/resources/application/fr.xml @@ -60,6 +60,8 @@ + + diff --git a/assets/resources/application/gl.xml b/assets/resources/application/gl.xml index a8277d966..0429c0bf4 100644 --- a/assets/resources/application/gl.xml +++ b/assets/resources/application/gl.xml @@ -57,6 +57,8 @@ + + diff --git a/assets/resources/application/hu.xml b/assets/resources/application/hu.xml index f0aac8ce3..4e926c909 100644 --- a/assets/resources/application/hu.xml +++ b/assets/resources/application/hu.xml @@ -57,6 +57,8 @@ + + diff --git a/assets/resources/application/it.xml b/assets/resources/application/it.xml index bc8725496..991df7bef 100644 --- a/assets/resources/application/it.xml +++ b/assets/resources/application/it.xml @@ -57,6 +57,8 @@ + + diff --git a/assets/resources/application/nl.xml b/assets/resources/application/nl.xml index 5722ce571..b546c8b92 100644 --- a/assets/resources/application/nl.xml +++ b/assets/resources/application/nl.xml @@ -57,6 +57,8 @@ + + diff --git a/assets/resources/application/ru.xml b/assets/resources/application/ru.xml index a3c700bd7..527b39d14 100644 --- a/assets/resources/application/ru.xml +++ b/assets/resources/application/ru.xml @@ -68,6 +68,8 @@ + + diff --git a/assets/resources/application/th.xml b/assets/resources/application/th.xml index bcb0e5941..6ce742bd4 100644 --- a/assets/resources/application/th.xml +++ b/assets/resources/application/th.xml @@ -57,6 +57,8 @@ + + diff --git a/assets/resources/application/uk.xml b/assets/resources/application/uk.xml index 0680a11d2..609e3ba40 100644 --- a/assets/resources/application/uk.xml +++ b/assets/resources/application/uk.xml @@ -57,6 +57,8 @@ + + diff --git a/assets/resources/application/vi.xml b/assets/resources/application/vi.xml index 479383ca1..f93ba9643 100644 --- a/assets/resources/application/vi.xml +++ b/assets/resources/application/vi.xml @@ -57,6 +57,8 @@ + + diff --git a/assets/resources/application/zh.xml b/assets/resources/application/zh.xml index f27c8bfc1..70e89ac72 100644 --- a/assets/resources/application/zh.xml +++ b/assets/resources/application/zh.xml @@ -57,6 +57,8 @@ + + From 141cdb00e21b0e4cb43fc6989115b385ffc839c1 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 22 Feb 2011 12:15:47 +0000 Subject: [PATCH 25/71] resources synchronization --- assets/resources/application/cs.xml | 12 ++++++++++++ assets/resources/application/de.xml | 12 ++++++++++++ assets/resources/application/fr.xml | 12 ++++++++++++ assets/resources/application/gl.xml | 12 ++++++++++++ assets/resources/application/hu.xml | 12 ++++++++++++ assets/resources/application/it.xml | 12 ++++++++++++ assets/resources/application/nl.xml | 12 ++++++++++++ assets/resources/application/th.xml | 12 ++++++++++++ assets/resources/application/uk.xml | 12 ++++++++++++ assets/resources/application/vi.xml | 12 ++++++++++++ assets/resources/application/zh.xml | 12 ++++++++++++ 11 files changed, 132 insertions(+) diff --git a/assets/resources/application/cs.xml b/assets/resources/application/cs.xml index 08f1f978c..e6b9fc776 100644 --- a/assets/resources/application/cs.xml +++ b/assets/resources/application/cs.xml @@ -47,6 +47,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/de.xml b/assets/resources/application/de.xml index 01d157858..fbaa9f16f 100644 --- a/assets/resources/application/de.xml +++ b/assets/resources/application/de.xml @@ -48,6 +48,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/fr.xml b/assets/resources/application/fr.xml index 48e5d10f6..fa0bf4275 100644 --- a/assets/resources/application/fr.xml +++ b/assets/resources/application/fr.xml @@ -50,6 +50,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/gl.xml b/assets/resources/application/gl.xml index 0429c0bf4..a6cb03a1e 100644 --- a/assets/resources/application/gl.xml +++ b/assets/resources/application/gl.xml @@ -47,6 +47,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/hu.xml b/assets/resources/application/hu.xml index 4e926c909..ccc685770 100644 --- a/assets/resources/application/hu.xml +++ b/assets/resources/application/hu.xml @@ -47,6 +47,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/it.xml b/assets/resources/application/it.xml index 991df7bef..a67ec653f 100644 --- a/assets/resources/application/it.xml +++ b/assets/resources/application/it.xml @@ -47,6 +47,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/nl.xml b/assets/resources/application/nl.xml index b546c8b92..a747968c5 100644 --- a/assets/resources/application/nl.xml +++ b/assets/resources/application/nl.xml @@ -47,6 +47,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/th.xml b/assets/resources/application/th.xml index 6ce742bd4..21a59a643 100644 --- a/assets/resources/application/th.xml +++ b/assets/resources/application/th.xml @@ -47,6 +47,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/uk.xml b/assets/resources/application/uk.xml index 609e3ba40..37fce895f 100644 --- a/assets/resources/application/uk.xml +++ b/assets/resources/application/uk.xml @@ -47,6 +47,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/vi.xml b/assets/resources/application/vi.xml index f93ba9643..98d7f67e7 100644 --- a/assets/resources/application/vi.xml +++ b/assets/resources/application/vi.xml @@ -47,6 +47,18 @@ + + + + + + + + + + + + diff --git a/assets/resources/application/zh.xml b/assets/resources/application/zh.xml index 70e89ac72..ebc704b90 100644 --- a/assets/resources/application/zh.xml +++ b/assets/resources/application/zh.xml @@ -47,6 +47,18 @@ + + + + + + + + + + + + From c012f2e54eb8a2680f9f70ae03acc7b64c526c3d Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 1 Mar 2011 13:42:33 +0300 Subject: [PATCH 26/71] fixed unexpected search call --- ChangeLog | 1 + src/org/geometerplus/android/fbreader/FBReader.java | 1 + 2 files changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index 3826d0f1e..a9d5b5ee6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * Thai localization (by Samphan Pojanasophanakul) * Fixed TTF font style detection * opds:// URLs support has been implemented +* Unexpected search call has been fixed ===== 0.99.13 (Feb 13, 2011) ===== * Fixed book/position forgetting bug diff --git a/src/org/geometerplus/android/fbreader/FBReader.java b/src/org/geometerplus/android/fbreader/FBReader.java index 7fa5408e2..f9cbbeb7e 100644 --- a/src/org/geometerplus/android/fbreader/FBReader.java +++ b/src/org/geometerplus/android/fbreader/FBReader.java @@ -151,6 +151,7 @@ public final class FBReader extends ZLAndroidActivity { } }; UIUtil.wait("search", runnable, this); + startActivity(new Intent(this, getClass())); } else { super.onNewIntent(intent); } From 85df6a5e84cc1c850f316be12e5bfd72dd02ebf0 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 1 Mar 2011 14:39:47 +0000 Subject: [PATCH 27/71] NetworkTree.Key as unique key for network tree --- .../network/AddCustomCatalogItemTree.java | 4 +- .../fbreader/network/ItemsLoadingService.java | 3 +- .../network/NetworkCatalogActions.java | 9 +- .../network/NetworkCatalogActivity.java | 16 ++-- .../network/NetworkLibraryActivity.java | 3 +- .../network/NetworkSearchActivity.java | 11 +-- .../android/fbreader/network/NetworkView.java | 22 ++--- .../fbreader/network/RefillAccountTree.java | 4 +- .../fbreader/network/SearchItemActions.java | 5 +- .../fbreader/network/SearchItemTree.java | 4 +- .../formats/oeb/OEBAnnotationReader.java | 2 +- .../formats/oeb/OEBMetaInfoReader.java | 2 +- .../fbreader/network/NetworkBookItem.java | 2 +- .../fbreader/network/NetworkTree.java | 87 ++++++++++++++++++- .../fbreader/network/opds/OPDSXMLReader.java | 2 +- .../network/tree/NetworkAuthorTree.java | 4 +- .../network/tree/NetworkBookTree.java | 4 +- .../network/tree/NetworkCatalogTree.java | 2 +- .../network/tree/NetworkSeriesTree.java | 12 +-- .../fbreader/network/tree/RootTree.java | 4 +- 20 files changed, 137 insertions(+), 65 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java index d625d2c86..5a22fe7e4 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java +++ b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java @@ -53,7 +53,7 @@ public class AddCustomCatalogItemTree extends NetworkTree implements ZLAndroidTr } @Override - public String getUniqueKey() { - return null; + protected String getStringId() { + return "@Add Custom Catalog"; } } diff --git a/src/org/geometerplus/android/fbreader/network/ItemsLoadingService.java b/src/org/geometerplus/android/fbreader/network/ItemsLoadingService.java index 34ff845ca..2e91b5d4c 100644 --- a/src/org/geometerplus/android/fbreader/network/ItemsLoadingService.java +++ b/src/org/geometerplus/android/fbreader/network/ItemsLoadingService.java @@ -25,6 +25,7 @@ import android.os.Message; import android.app.Service; import android.content.Intent; +import org.geometerplus.fbreader.network.NetworkTree; public class ItemsLoadingService extends Service { @@ -53,7 +54,7 @@ public class ItemsLoadingService extends Service { super.onStart(intent, startId); doStart(); - final String key = intent.getStringExtra(ITEMS_LOADING_RUNNABLE_KEY); + final NetworkTree.Key key = (NetworkTree.Key)intent.getSerializableExtra(ITEMS_LOADING_RUNNABLE_KEY); if (key == null) { doStop(); return; diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 8a666abbd..086517278 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -272,11 +272,10 @@ class NetworkCatalogActions extends NetworkTreeActions { private static class ExpandCatalogHandler extends ItemsLoadingHandler { - - private final String myKey; + private final NetworkTree.Key myKey; private final NetworkCatalogTree myTree; - ExpandCatalogHandler(NetworkCatalogTree tree, String key) { + ExpandCatalogHandler(NetworkCatalogTree tree, NetworkTree.Key key) { myTree = tree; myKey = key; } @@ -389,7 +388,7 @@ class NetworkCatalogActions extends NetworkTreeActions { } private void doExpandCatalog(final NetworkBaseActivity activity, final NetworkCatalogTree tree) { - final String key = tree.getUniqueKey(); + final NetworkTree.Key key = tree.getUniqueKey(); NetworkView.Instance().tryResumeLoading(activity, tree, key, new Runnable() { public void run() { boolean resumeNotLoad = false; @@ -434,7 +433,7 @@ class NetworkCatalogActions extends NetworkTreeActions { } public void doReloadCatalog(NetworkBaseActivity activity, final NetworkCatalogTree tree) { - final String key = tree.getUniqueKey(); + final NetworkTree.Key key = tree.getUniqueKey(); if (NetworkView.Instance().containsItemsLoadingRunnable(key)) { return; } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index d69d84838..89ebdbc7d 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -36,7 +36,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR public static final String CATALOG_KEY_KEY = "org.geometerplus.android.fbreader.network.CatalogKey"; private NetworkTree myTree; - private String myCatalogKey; + private NetworkTree.Key myCatalogKey; private volatile boolean myInProgress; @Override @@ -57,7 +57,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR throw new RuntimeException("Catalog's Level was not specified!!!"); } - myCatalogKey = intent.getStringExtra(CATALOG_KEY_KEY); + myCatalogKey = (NetworkTree.Key)intent.getSerializableExtra(CATALOG_KEY_KEY); if (myCatalogKey == null) { throw new RuntimeException("Catalog's Key was not specified!!!"); } @@ -183,10 +183,10 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR } } - private static String getLoadableNetworkTreeKey(NetworkTree tree) { + private static NetworkTree.Key getLoadableNetworkTreeKey(NetworkTree tree) { if ((tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree) && tree.Parent instanceof NetworkTree) { - return getLoadableNetworkTreeKey((NetworkTree) tree.Parent); + return getLoadableNetworkTreeKey((NetworkTree)tree.Parent); } return tree.getUniqueKey(); } @@ -194,7 +194,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR @Override public void onModelChanged() { final NetworkView networkView = NetworkView.Instance(); - final String key = getLoadableNetworkTreeKey(myTree); + final NetworkTree.Key key = getLoadableNetworkTreeKey(myTree); myInProgress = key != null && networkView.isInitialized() && networkView.containsItemsLoadingRunnable(key); getListView().invalidateViews(); @@ -218,9 +218,9 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR } private void doStopLoading() { - final String key = myCatalogKey; - if (key != null && NetworkView.Instance().isInitialized()) { - final ItemsLoadingRunnable runnable = NetworkView.Instance().getItemsLoadingRunnable(key); + if (NetworkView.Instance().isInitialized()) { + final ItemsLoadingRunnable runnable = + NetworkView.Instance().getItemsLoadingRunnable(myCatalogKey); if (runnable != null) { runnable.interruptLoading(); } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index 7ff160ae1..69af7232a 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -275,8 +275,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { } private static boolean searchIsInProgress() { - return NetworkView.Instance().containsItemsLoadingRunnable( - NetworkSearchActivity.SEARCH_RUNNABLE_KEY); + return NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey); } @Override diff --git a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java index eafb52370..37b865e8e 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java @@ -35,9 +35,6 @@ import org.geometerplus.fbreader.network.*; public class NetworkSearchActivity extends Activity { - - static final String SEARCH_RUNNABLE_KEY = "org.geometerplus.android.fbreader.network.NetworkSearchActivity"; - @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -109,7 +106,7 @@ public class NetworkSearchActivity extends Activity { } if (msg != null) { if (NetworkView.Instance().isInitialized()) { - final NetworkCatalogActivity activity = NetworkView.Instance().getOpenedActivity(SEARCH_RUNNABLE_KEY); + final NetworkCatalogActivity activity = NetworkView.Instance().getOpenedActivity(NetworkTree.SearchKey); if (activity != null) { final ZLResource buttonResource = dialogResource.getResource("button"); new AlertDialog.Builder(activity) @@ -148,7 +145,7 @@ public class NetworkSearchActivity extends Activity { final NetworkLibrary library = NetworkLibrary.Instance(); library.NetworkSearchPatternOption.setValue(pattern); - if (NetworkView.Instance().containsItemsLoadingRunnable(SEARCH_RUNNABLE_KEY)) { + if (NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey)) { return; } @@ -163,9 +160,9 @@ public class NetworkSearchActivity extends Activity { final SearchHandler handler = new SearchHandler(tree); NetworkView.Instance().startItemsLoading( this, - SEARCH_RUNNABLE_KEY, + NetworkTree.SearchKey, new SearchRunnable(handler, pattern) ); - NetworkView.Instance().openTree(this, tree, SEARCH_RUNNABLE_KEY); + NetworkView.Instance().openTree(this, tree, NetworkTree.SearchKey); } } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkView.java b/src/org/geometerplus/android/fbreader/network/NetworkView.java index 44435fe34..9c41f24f3 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkView.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkView.java @@ -141,9 +141,10 @@ class NetworkView { * Code for loading network items (running items-loading service and managing items-loading runnables). */ - private final HashMap myItemsLoadingRunnables = new HashMap(); + private final HashMap myItemsLoadingRunnables = + new HashMap(); - public void startItemsLoading(Context context, String key, ItemsLoadingRunnable runnable) { + public void startItemsLoading(Context context, NetworkTree.Key key, ItemsLoadingRunnable runnable) { boolean doDownload = false; synchronized (myItemsLoadingRunnables) { if (!myItemsLoadingRunnables.containsKey(key)) { @@ -159,13 +160,13 @@ class NetworkView { } } - ItemsLoadingRunnable getItemsLoadingRunnable(String key) { + ItemsLoadingRunnable getItemsLoadingRunnable(NetworkTree.Key key) { synchronized (myItemsLoadingRunnables) { return myItemsLoadingRunnables.get(key); } } - void removeItemsLoadingRunnable(String key) { + void removeItemsLoadingRunnable(NetworkTree.Key key) { synchronized (myItemsLoadingRunnables) { ItemsLoadingRunnable runnable = myItemsLoadingRunnables.remove(key); if (runnable != null) { @@ -174,11 +175,11 @@ class NetworkView { } } - public final boolean containsItemsLoadingRunnable(String key) { + public final boolean containsItemsLoadingRunnable(NetworkTree.Key key) { return getItemsLoadingRunnable(key) != null; } - public void tryResumeLoading(NetworkBaseActivity activity, NetworkCatalogTree tree, String key, Runnable expandRunnable) { + public void tryResumeLoading(NetworkBaseActivity activity, NetworkCatalogTree tree, NetworkTree.Key key, Runnable expandRunnable) { final ItemsLoadingRunnable runnable = getItemsLoadingRunnable(key); if (runnable != null && runnable.tryResumeLoading()) { openTree(activity, tree, key); @@ -266,9 +267,10 @@ class NetworkView { */ private final LinkedList myOpenedStack = new LinkedList(); - private final HashMap myOpenedActivities = new HashMap(); + private final HashMap myOpenedActivities = + new HashMap(); - public void openTree(Context context, NetworkTree tree, String key) { + public void openTree(Context context, NetworkTree tree, NetworkTree.Key key) { final int level = tree.Level - 1; // tree.Level == 1 for catalog's root element if (level > myOpenedStack.size()) { throw new RuntimeException("Unable to open catalog with Level greater than the number of opened catalogs.\n" @@ -288,7 +290,7 @@ class NetworkView { ); } - void setOpenedActivity(String key, NetworkCatalogActivity activity) { + void setOpenedActivity(NetworkTree.Key key, NetworkCatalogActivity activity) { if (activity == null) { myOpenedActivities.remove(key); } else { @@ -296,7 +298,7 @@ class NetworkView { } } - public NetworkCatalogActivity getOpenedActivity(String key) { + public NetworkCatalogActivity getOpenedActivity(NetworkTree.Key key) { return myOpenedActivities.get(key); } diff --git a/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java b/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java index 7d10da183..4cb9791f2 100644 --- a/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java +++ b/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java @@ -75,7 +75,7 @@ class RefillAccountTree extends NetworkTree implements ZLAndroidTree { } @Override - public String getUniqueKey() { - return null; + protected String getStringId() { + return "@TopUp Account"; } } diff --git a/src/org/geometerplus/android/fbreader/network/SearchItemActions.java b/src/org/geometerplus/android/fbreader/network/SearchItemActions.java index 74d4ff35f..0f40cae2d 100644 --- a/src/org/geometerplus/android/fbreader/network/SearchItemActions.java +++ b/src/org/geometerplus/android/fbreader/network/SearchItemActions.java @@ -26,7 +26,6 @@ import android.view.ContextMenu; import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.SearchResult; - class SearchItemActions extends NetworkTreeActions { public static final int RUN_SEARCH_ITEM_ID = 0; @@ -50,7 +49,7 @@ class SearchItemActions extends NetworkTreeActions { public void buildContextMenu(Activity activity, ContextMenu menu, NetworkTree tree) { menu.setHeaderTitle(tree.getName()); - final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkSearchActivity.SEARCH_RUNNABLE_KEY); + final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey); if (!isLoading) { addMenuItem(menu, RUN_SEARCH_ITEM_ID, "search"); @@ -61,7 +60,7 @@ class SearchItemActions extends NetworkTreeActions { @Override public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) { - final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkSearchActivity.SEARCH_RUNNABLE_KEY); + final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey); if (!isLoading) { return RUN_SEARCH_ITEM_ID; } diff --git a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java b/src/org/geometerplus/android/fbreader/network/SearchItemTree.java index 286074501..379664ca9 100644 --- a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java +++ b/src/org/geometerplus/android/fbreader/network/SearchItemTree.java @@ -104,7 +104,7 @@ public class SearchItemTree extends NetworkTree implements ZLAndroidTree { } @Override - public String getUniqueKey() { - return NetworkSearchActivity.SEARCH_RUNNABLE_KEY; + protected String getStringId() { + return "@Search"; } } diff --git a/src/org/geometerplus/fbreader/formats/oeb/OEBAnnotationReader.java b/src/org/geometerplus/fbreader/formats/oeb/OEBAnnotationReader.java index a3ceb3fa6..219727575 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/OEBAnnotationReader.java +++ b/src/org/geometerplus/fbreader/formats/oeb/OEBAnnotationReader.java @@ -32,7 +32,7 @@ class OEBAnnotationReader extends ZLXMLReaderAdapter implements XMLNamespaces { private static final int READ_DESCRIPTION = 1; private int myReadState; - private final StringBuffer myBuffer = new StringBuffer(); + private final StringBuilder myBuffer = new StringBuilder(); String readAnnotation(ZLFile file) { myReadState = READ_NONE; diff --git a/src/org/geometerplus/fbreader/formats/oeb/OEBMetaInfoReader.java b/src/org/geometerplus/fbreader/formats/oeb/OEBMetaInfoReader.java index 6588e4d99..a3d8d4fa9 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/OEBMetaInfoReader.java +++ b/src/org/geometerplus/fbreader/formats/oeb/OEBMetaInfoReader.java @@ -83,7 +83,7 @@ class OEBMetaInfoReader extends ZLXMLReaderAdapter implements XMLNamespaces { private int myReadState; private boolean myReadMetaData; - private final StringBuffer myBuffer = new StringBuffer(); + private final StringBuilder myBuffer = new StringBuilder(); @Override public boolean processNamespaces() { diff --git a/src/org/geometerplus/fbreader/network/NetworkBookItem.java b/src/org/geometerplus/fbreader/network/NetworkBookItem.java index 5d151b0f6..6e8da3cbb 100644 --- a/src/org/geometerplus/fbreader/network/NetworkBookItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkBookItem.java @@ -59,7 +59,7 @@ public final class NetworkBookItem extends NetworkLibraryItem { return false; } final AuthorData data = (AuthorData) o; - return SortKey == data.SortKey && DisplayName == data.DisplayName; + return SortKey.equals(data.SortKey) && DisplayName.equals(data.DisplayName); } @Override diff --git a/src/org/geometerplus/fbreader/network/NetworkTree.java b/src/org/geometerplus/fbreader/network/NetworkTree.java index b79a30334..2697ed2f2 100644 --- a/src/org/geometerplus/fbreader/network/NetworkTree.java +++ b/src/org/geometerplus/fbreader/network/NetworkTree.java @@ -21,6 +21,7 @@ package org.geometerplus.fbreader.network; import java.util.LinkedList; import java.util.Set; +import java.io.*; import org.geometerplus.zlibrary.core.constants.MimeTypes; import org.geometerplus.zlibrary.core.image.ZLImage; @@ -28,6 +29,71 @@ import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.fbreader.tree.FBTree; public abstract class NetworkTree extends FBTree { + public static final Key SearchKey = new Key(null, "@Search"); + + public static class Key implements Serializable { + private Key myParent; + private String myId; + + private Key(Key parent, String id) { + if (id == null) { + throw new IllegalArgumentException("NetworkTree string id must be non-null"); + } + myParent = parent; + myId = id; + } + + private Key() { + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if (!(other instanceof NetworkTree.Key)) { + return false; + } + final NetworkTree.Key key = (NetworkTree.Key)other; + return myParent == key.myParent && myId.equals(key.myId); + } + + @Override + public int hashCode() { + return myId.hashCode(); + } + + private void writeObject(ObjectOutputStream os) throws IOException { + if (myParent != null) { + myParent.writeObject(os); + } + os.writeBytes(myId); + os.writeBytes("\000"); + } + + private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException { + myParent = null; + myId = null; + + final StringBuilder builder = new StringBuilder(); + try { + while (true) { + char c = is.readChar(); + if (c != '\000') { + builder.append(c); + } else { + if (myId != null) { + myParent = new Key(myParent, myId); + } + myId = builder.toString(); + builder.delete(0, builder.length()); + } + } + } catch (IOException e) { + } + } + } + protected NetworkTree(int level) { super(level); } @@ -90,11 +156,28 @@ public abstract class NetworkTree extends FBTree { public abstract NetworkLibraryItem getHoldedItem(); + private Key myKey; /** * Returns unique identifier which can be used in NetworkView methods - * @return unique String instance + * @return unique Key instance */ - public abstract String getUniqueKey(); + public final Key getUniqueKey() { + if (myKey == null) { + //final ZLTree parentTree = getParent(); + final Key parentKey = Parent instanceof NetworkTree ? + ((NetworkTree)Parent).getUniqueKey() : null; + myKey = new Key(parentKey, getStringId()); + } + return myKey; + } + + /** + * Returns id used as a part of unique key above. This string must be + * not null + * and + * be unique for all children of same tree + */ + protected abstract String getStringId(); public void removeItems(Set items) { if (items.isEmpty() || subTrees().isEmpty()) { diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSXMLReader.java index 1631f7aef..631266477 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSXMLReader.java @@ -172,7 +172,7 @@ class OPDSXMLReader extends ZLXMLReaderAdapter { private int myState = START; - private final StringBuffer myBuffer = new StringBuffer(); + private final StringBuilder myBuffer = new StringBuilder(); private HtmlToString myHtmlToString = new HtmlToString(); private boolean myFeedMetadataProcessed; diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java index 7a395ab54..e16690223 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java @@ -125,7 +125,7 @@ public class NetworkAuthorTree extends NetworkTree { } @Override - public String getUniqueKey() { - return "org.geometerplus.fbreader.network.tree.Authors:" + Author.DisplayName; + protected String getStringId() { + return "@Author:" + Author.DisplayName + ":" + Author.SortKey; } } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java index df737635b..c765fcb4c 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java @@ -74,7 +74,7 @@ public class NetworkBookTree extends NetworkTree { } @Override - public String getUniqueKey() { - return null; + protected String getStringId() { + return "@Book:" + Book.Id + ":" + Book.Title; } } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java index 5f77d8bf0..265a9a573 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java @@ -172,7 +172,7 @@ public class NetworkCatalogTree extends NetworkTree { } @Override - public String getUniqueKey() { + protected String getStringId() { return Item.getFullRequestString(); } } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java index 5ae3f7984..8c4bb848f 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java @@ -100,15 +100,7 @@ public class NetworkSeriesTree extends NetworkTree { } @Override - public String getUniqueKey() { - final StringBuilder buffer = new StringBuilder(); - - final String parentKey = ((NetworkTree)Parent).getUniqueKey(); - if (parentKey != null) { - buffer.append(parentKey).append("///"); - } - buffer.append("org.geometerplus.fbreader.network.tree.Series:").append(SeriesTitle); - - return buffer.toString(); + protected String getStringId() { + return "@Series:" + SeriesTitle; } } diff --git a/src/org/geometerplus/fbreader/network/tree/RootTree.java b/src/org/geometerplus/fbreader/network/tree/RootTree.java index a954f6c32..b7b93506f 100644 --- a/src/org/geometerplus/fbreader/network/tree/RootTree.java +++ b/src/org/geometerplus/fbreader/network/tree/RootTree.java @@ -34,7 +34,7 @@ public final class RootTree extends NetworkTree { } @Override - public String getUniqueKey() { - return null; + protected String getStringId() { + return "@Root"; } } From 8001a37cec8318ab7a2ea28f537b6c38eb7bca7a Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 1 Mar 2011 16:24:49 +0000 Subject: [PATCH 28/71] cleanup: no NetworkTree constructor with level parameter --- .../fbreader/network/AddCustomCatalogItemTree.java | 4 ++-- .../android/fbreader/network/NetworkBookInfoActivity.java | 2 +- .../android/fbreader/network/NetworkLibraryActivity.java | 2 +- .../android/fbreader/network/NetworkView.java | 8 ++++++-- .../android/fbreader/network/RefillAccountActions.java | 5 ++++- .../android/fbreader/network/RefillAccountTree.java | 7 +------ .../android/fbreader/network/SearchItemTree.java | 5 ++--- src/org/geometerplus/fbreader/network/NetworkLibrary.java | 3 +-- src/org/geometerplus/fbreader/network/NetworkTree.java | 4 ---- src/org/geometerplus/fbreader/tree/FBTree.java | 4 ---- src/org/geometerplus/zlibrary/core/tree/ZLTree.java | 4 ---- 11 files changed, 18 insertions(+), 30 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java index 5a22fe7e4..77b7d0018 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java +++ b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java @@ -29,8 +29,8 @@ import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.android.fbreader.tree.ZLAndroidTree; public class AddCustomCatalogItemTree extends NetworkTree implements ZLAndroidTree { - public AddCustomCatalogItemTree() { - super(1); + public AddCustomCatalogItemTree(NetworkTree parent) { + super(parent); } @Override diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java index 6cd908970..cea518a1f 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java @@ -99,7 +99,7 @@ public class NetworkBookInfoActivity extends Activity implements NetworkView.Eve @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - new RefillAccountActions().buildContextMenu(this, menu, new RefillAccountTree(myBook.Link)); + new RefillAccountActions().buildContextMenu(this, menu, myBook.Link); } @Override diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index 69af7232a..2a819f841 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -103,7 +103,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { private void prepareView() { if (myTree == null) { - myTree = NetworkLibrary.Instance().getTree(); + myTree = NetworkLibrary.Instance().getRootTree(); setListAdapter(new LibraryAdapter()); getListView().invalidateViews(); } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkView.java b/src/org/geometerplus/android/fbreader/network/NetworkView.java index 9c41f24f3..2930b2e0c 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkView.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkView.java @@ -69,6 +69,10 @@ class NetworkView { myActions.add(new AddCustomCatalogItemActions()); myActions.trimToSize(); + final NetworkTree root = library.getRootTree(); + mySearchItem = new SearchItemTree(root); + myAddCustomCatalogItem = new AddCustomCatalogItemTree(root); + myInitialized = true; } @@ -313,8 +317,8 @@ class NetworkView { * Special view items item */ - private final SearchItemTree mySearchItem = new SearchItemTree(); - private final AddCustomCatalogItemTree myAddCustomCatalogItem = new AddCustomCatalogItemTree(); + private SearchItemTree mySearchItem; + private AddCustomCatalogItemTree myAddCustomCatalogItem; public SearchItemTree getSearchItemTree() { return mySearchItem; diff --git a/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java b/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java index 6107f3bc3..fbb1f8799 100644 --- a/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java +++ b/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java @@ -41,9 +41,12 @@ class RefillAccountActions extends NetworkTreeActions { @Override public void buildContextMenu(Activity activity, ContextMenu menu, NetworkTree tree) { + buildContextMenu(activity, menu, ((RefillAccountTree)tree).Link); + } + + public void buildContextMenu(Activity activity, ContextMenu menu, INetworkLink link) { menu.setHeaderTitle(getTitleValue("refillTitle")); - final INetworkLink link = ((RefillAccountTree)tree).Link; if (Util.isSmsAccountRefillingSupported(activity, link)) { addMenuItem(menu, REFILL_VIA_SMS_ITEM_ID, "refillViaSms"); } diff --git a/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java b/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java index 4cb9791f2..4f132ac9c 100644 --- a/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java +++ b/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java @@ -36,15 +36,10 @@ class RefillAccountTree extends NetworkTree implements ZLAndroidTree { public final INetworkLink Link; public RefillAccountTree(NetworkCatalogTree parentTree) { - super(parentTree.Level + 1); + super(parentTree); Link = parentTree.Item.Link; } - public RefillAccountTree(INetworkLink link) { - super(1); - Link = link; - } - @Override public String getName() { return ZLResource.resource("networkView").getResource("refillTitle").getValue(); diff --git a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java b/src/org/geometerplus/android/fbreader/network/SearchItemTree.java index 379664ca9..dc0347eca 100644 --- a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java +++ b/src/org/geometerplus/android/fbreader/network/SearchItemTree.java @@ -34,11 +34,10 @@ import org.geometerplus.zlibrary.ui.android.R; import org.geometerplus.android.fbreader.tree.ZLAndroidTree; public class SearchItemTree extends NetworkTree implements ZLAndroidTree { - private SearchResult myResult; - public SearchItemTree() { - super(1); + public SearchItemTree(NetworkTree parent) { + super(parent); } @Override diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 0b14619ca..cd5329790 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -413,11 +413,10 @@ public class NetworkLibrary { } } - public NetworkTree getTree() { + public NetworkTree getRootTree() { return myRootTree; } - public void simpleSearch(String pattern, final NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException { LinkedList requestList = new LinkedList(); LinkedList dataList = new LinkedList(); diff --git a/src/org/geometerplus/fbreader/network/NetworkTree.java b/src/org/geometerplus/fbreader/network/NetworkTree.java index 2697ed2f2..6e7b28637 100644 --- a/src/org/geometerplus/fbreader/network/NetworkTree.java +++ b/src/org/geometerplus/fbreader/network/NetworkTree.java @@ -94,10 +94,6 @@ public abstract class NetworkTree extends FBTree { } } - protected NetworkTree(int level) { - super(level); - } - protected NetworkTree() { super(); } diff --git a/src/org/geometerplus/fbreader/tree/FBTree.java b/src/org/geometerplus/fbreader/tree/FBTree.java index 743b394dc..0cf94b8d9 100644 --- a/src/org/geometerplus/fbreader/tree/FBTree.java +++ b/src/org/geometerplus/fbreader/tree/FBTree.java @@ -29,10 +29,6 @@ public abstract class FBTree extends ZLTree implements Comparable> implements Iterable { public final int Level; private ArrayList mySubTrees; - protected ZLTree(int level) { - this(level, null, 0); - } - protected ZLTree() { this(null); } From 6fda2db49e6545513cde77586f2746cb60272f88 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 1 Mar 2011 16:27:11 +0000 Subject: [PATCH 29/71] cleanup: unused constructor has gone --- src/org/geometerplus/zlibrary/core/tree/ZLTree.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/org/geometerplus/zlibrary/core/tree/ZLTree.java b/src/org/geometerplus/zlibrary/core/tree/ZLTree.java index 2945da0e9..b3036fe12 100644 --- a/src/org/geometerplus/zlibrary/core/tree/ZLTree.java +++ b/src/org/geometerplus/zlibrary/core/tree/ZLTree.java @@ -36,10 +36,6 @@ public abstract class ZLTree> implements Iterable { } protected ZLTree(T parent, int position) { - this(0, parent, position); - } - - private ZLTree(int nullLevel, T parent, int position) { if (parent != null && (position < 0 || position > parent.subTrees().size())) { throw new IndexOutOfBoundsException("`position` value equals " + position + " but must be in range [0; " + parent.subTrees().size() + "]"); } @@ -48,7 +44,7 @@ public abstract class ZLTree> implements Iterable { Level = parent.Level + 1; parent.addSubTree((T)this, position); } else { - Level = nullLevel; + Level = 0; } } From d096a3456acdaa569149573f111c40582660df55 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 1 Mar 2011 17:09:23 +0000 Subject: [PATCH 30/71] cleanup: parameters pair (tree, tree.getUniqueKey()) is replaced by one parameter tree --- .../android/fbreader/network/NetworkBookActions.java | 2 +- .../fbreader/network/NetworkCatalogActions.java | 6 +++--- .../fbreader/network/NetworkCatalogActivity.java | 4 ++-- .../fbreader/network/NetworkSearchActivity.java | 2 +- .../android/fbreader/network/NetworkView.java | 10 +++++----- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java index cbb000d92..04fc11968 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java @@ -224,7 +224,7 @@ class NetworkBookActions extends NetworkTreeActions { if (tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree) { switch (actionCode) { case SHOW_BOOKS_ITEM_ID: - NetworkView.Instance().openTree(activity, tree, tree.getUniqueKey()); + NetworkView.Instance().openTree(activity, tree); return true; } return false; diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 086517278..8f76b1d65 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -389,7 +389,7 @@ class NetworkCatalogActions extends NetworkTreeActions { private void doExpandCatalog(final NetworkBaseActivity activity, final NetworkCatalogTree tree) { final NetworkTree.Key key = tree.getUniqueKey(); - NetworkView.Instance().tryResumeLoading(activity, tree, key, new Runnable() { + NetworkView.Instance().tryResumeLoading(activity, tree, new Runnable() { public void run() { boolean resumeNotLoad = false; if (tree.hasChildren()) { @@ -397,7 +397,7 @@ class NetworkCatalogActions extends NetworkTreeActions { if (tree.Item.supportsResumeLoading()) { resumeNotLoad = true; } else { - NetworkView.Instance().openTree(activity, tree, key); + NetworkView.Instance().openTree(activity, tree); return; } } else { @@ -425,7 +425,7 @@ class NetworkCatalogActions extends NetworkTreeActions { ); processExtraData(activity, tree.Item.extraData(), new Runnable() { public void run() { - NetworkView.Instance().openTree(activity, tree, key); + NetworkView.Instance().openTree(activity, tree); } }); } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index 89ebdbc7d..316634bfd 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -54,12 +54,12 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR final Intent intent = getIntent(); final int level = intent.getIntExtra(CATALOG_LEVEL_KEY, -1); if (level == -1) { - throw new RuntimeException("Catalog's Level was not specified!!!"); + throw new RuntimeException("Catalog Level was not specified!!!"); } myCatalogKey = (NetworkTree.Key)intent.getSerializableExtra(CATALOG_KEY_KEY); if (myCatalogKey == null) { - throw new RuntimeException("Catalog's Key was not specified!!!"); + throw new RuntimeException("Catalog Key was not specified!!!"); } myTree = networkView.getOpenedTree(level); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java index 37b865e8e..29ebfb91b 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java @@ -163,6 +163,6 @@ public class NetworkSearchActivity extends Activity { NetworkTree.SearchKey, new SearchRunnable(handler, pattern) ); - NetworkView.Instance().openTree(this, tree, NetworkTree.SearchKey); + NetworkView.Instance().openTree(this, tree); } } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkView.java b/src/org/geometerplus/android/fbreader/network/NetworkView.java index 2930b2e0c..d3c9dc45f 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkView.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkView.java @@ -183,10 +183,10 @@ class NetworkView { return getItemsLoadingRunnable(key) != null; } - public void tryResumeLoading(NetworkBaseActivity activity, NetworkCatalogTree tree, NetworkTree.Key key, Runnable expandRunnable) { - final ItemsLoadingRunnable runnable = getItemsLoadingRunnable(key); + public void tryResumeLoading(NetworkBaseActivity activity, NetworkCatalogTree tree, Runnable expandRunnable) { + final ItemsLoadingRunnable runnable = getItemsLoadingRunnable(tree.getUniqueKey()); if (runnable != null && runnable.tryResumeLoading()) { - openTree(activity, tree, key); + openTree(activity, tree); return; } if (runnable == null) { @@ -274,7 +274,7 @@ class NetworkView { private final HashMap myOpenedActivities = new HashMap(); - public void openTree(Context context, NetworkTree tree, NetworkTree.Key key) { + public void openTree(Context context, NetworkTree tree) { final int level = tree.Level - 1; // tree.Level == 1 for catalog's root element if (level > myOpenedStack.size()) { throw new RuntimeException("Unable to open catalog with Level greater than the number of opened catalogs.\n" @@ -290,7 +290,7 @@ class NetworkView { context.startActivity( new Intent(context.getApplicationContext(), NetworkCatalogActivity.class) .putExtra(NetworkCatalogActivity.CATALOG_LEVEL_KEY, level) - .putExtra(NetworkCatalogActivity.CATALOG_KEY_KEY, key) + .putExtra(NetworkCatalogActivity.CATALOG_KEY_KEY, tree.getUniqueKey()) ); } From 05461052e6afbc31387edee1af59f3501c918864 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 1 Mar 2011 18:46:00 +0000 Subject: [PATCH 31/71] fixed NetworkTree.Key.equals; "get NetworkTree by key" method --- .../network/NetworkCatalogActivity.java | 22 +++++----- .../fbreader/network/NetworkLibrary.java | 17 ++++++++ .../fbreader/network/NetworkTree.java | 43 +++++++++++-------- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index 316634bfd..a7b03f00d 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -28,6 +28,7 @@ import android.content.Intent; import org.geometerplus.zlibrary.core.network.ZLNetworkException; +import org.geometerplus.fbreader.network.NetworkLibrary; import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.tree.*; @@ -36,7 +37,6 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR public static final String CATALOG_KEY_KEY = "org.geometerplus.android.fbreader.network.CatalogKey"; private NetworkTree myTree; - private NetworkTree.Key myCatalogKey; private volatile boolean myInProgress; @Override @@ -57,14 +57,16 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR throw new RuntimeException("Catalog Level was not specified!!!"); } - myCatalogKey = (NetworkTree.Key)intent.getSerializableExtra(CATALOG_KEY_KEY); - if (myCatalogKey == null) { - throw new RuntimeException("Catalog Key was not specified!!!"); + final NetworkLibrary library = NetworkLibrary.Instance(); + final NetworkTree.Key key = (NetworkTree.Key)intent.getSerializableExtra(CATALOG_KEY_KEY); + myTree = library.getTreeByKey(key); + + System.err.println("KEY = " + key); + if (myTree == null) { + throw new RuntimeException("Tree not found for key " + key); } - myTree = networkView.getOpenedTree(level); - - networkView.setOpenedActivity(myCatalogKey, this); + networkView.setOpenedActivity(key, this); setListAdapter(new CatalogAdapter()); getListView().invalidateViews(); @@ -113,8 +115,8 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR @Override public void onDestroy() { - if (myTree != null && myCatalogKey != null && NetworkView.Instance().isInitialized()) { - NetworkView.Instance().setOpenedActivity(myCatalogKey, null); + if (myTree != null && NetworkView.Instance().isInitialized()) { + NetworkView.Instance().setOpenedActivity(myTree.getUniqueKey(), null); } super.onDestroy(); } @@ -220,7 +222,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR private void doStopLoading() { if (NetworkView.Instance().isInitialized()) { final ItemsLoadingRunnable runnable = - NetworkView.Instance().getItemsLoadingRunnable(myCatalogKey); + NetworkView.Instance().getItemsLoadingRunnable(myTree.getUniqueKey()); if (runnable != null) { runnable.interruptLoading(); } diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index cd5329790..03bfc2c6f 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -417,6 +417,23 @@ public class NetworkLibrary { return myRootTree; } + public NetworkTree getTreeByKey(NetworkTree.Key key) { + if (key.Parent == null) { + return key.equals(myRootTree.getUniqueKey()) ? myRootTree : null; + } + final NetworkTree parentTree = getTreeByKey(key.Parent); + if (parentTree == null) { + return null; + } + for (FBTree tree : parentTree.subTrees()) { + final NetworkTree nTree = (NetworkTree)tree; + if (key.equals(nTree.getUniqueKey())) { + return nTree; + } + } + return null; + } + public void simpleSearch(String pattern, final NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException { LinkedList requestList = new LinkedList(); LinkedList dataList = new LinkedList(); diff --git a/src/org/geometerplus/fbreader/network/NetworkTree.java b/src/org/geometerplus/fbreader/network/NetworkTree.java index 6e7b28637..716c15c8a 100644 --- a/src/org/geometerplus/fbreader/network/NetworkTree.java +++ b/src/org/geometerplus/fbreader/network/NetworkTree.java @@ -21,7 +21,7 @@ package org.geometerplus.fbreader.network; import java.util.LinkedList; import java.util.Set; -import java.io.*; +import java.io.Serializable; import org.geometerplus.zlibrary.core.constants.MimeTypes; import org.geometerplus.zlibrary.core.image.ZLImage; @@ -32,18 +32,15 @@ public abstract class NetworkTree extends FBTree { public static final Key SearchKey = new Key(null, "@Search"); public static class Key implements Serializable { - private Key myParent; - private String myId; + final Key Parent; + final String Id; private Key(Key parent, String id) { if (id == null) { throw new IllegalArgumentException("NetworkTree string id must be non-null"); } - myParent = parent; - myId = id; - } - - private Key() { + Parent = parent; + Id = id; } @Override @@ -55,25 +52,34 @@ public abstract class NetworkTree extends FBTree { return false; } final NetworkTree.Key key = (NetworkTree.Key)other; - return myParent == key.myParent && myId.equals(key.myId); + if (Parent == null) { + return key.Parent == null && Id.equals(key.Id); + } + return Id.equals(key.Id) && Parent.equals(key.Parent); } @Override public int hashCode() { - return myId.hashCode(); + return Id.hashCode(); } + @Override + public String toString() { + return Parent == null ? Id : Parent.toString() + " :: " + Id; + } + + /* private void writeObject(ObjectOutputStream os) throws IOException { - if (myParent != null) { - myParent.writeObject(os); + if (Parent != null) { + Parent.writeObject(os); } - os.writeBytes(myId); + os.writeBytes(Id); os.writeBytes("\000"); } private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException { - myParent = null; - myId = null; + Parent = null; + Id = null; final StringBuilder builder = new StringBuilder(); try { @@ -82,16 +88,17 @@ public abstract class NetworkTree extends FBTree { if (c != '\000') { builder.append(c); } else { - if (myId != null) { - myParent = new Key(myParent, myId); + if (Id != null) { + Parent = new Key(Parent, Id); } - myId = builder.toString(); + Id = builder.toString(); builder.delete(0, builder.length()); } } } catch (IOException e) { } } + */ } protected NetworkTree() { From d69b42c7ea662c66c8fcf5e68726230b5e295854 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 1 Mar 2011 18:50:14 +0000 Subject: [PATCH 32/71] activity level is not used now --- .../network/NetworkCatalogActivity.java | 5 ----- .../android/fbreader/network/NetworkView.java | 21 ------------------- 2 files changed, 26 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index a7b03f00d..58af4ad9a 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -33,7 +33,6 @@ import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.tree.*; public class NetworkCatalogActivity extends NetworkBaseActivity implements UserRegistrationConstants { - public static final String CATALOG_LEVEL_KEY = "org.geometerplus.android.fbreader.network.CatalogLevel"; public static final String CATALOG_KEY_KEY = "org.geometerplus.android.fbreader.network.CatalogKey"; private NetworkTree myTree; @@ -52,10 +51,6 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR } final Intent intent = getIntent(); - final int level = intent.getIntExtra(CATALOG_LEVEL_KEY, -1); - if (level == -1) { - throw new RuntimeException("Catalog Level was not specified!!!"); - } final NetworkLibrary library = NetworkLibrary.Instance(); final NetworkTree.Key key = (NetworkTree.Key)intent.getSerializableExtra(CATALOG_KEY_KEY); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkView.java b/src/org/geometerplus/android/fbreader/network/NetworkView.java index d3c9dc45f..8166d502e 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkView.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkView.java @@ -270,26 +270,12 @@ class NetworkView { * Opening Catalogs & managing opened catalogs stack */ - private final LinkedList myOpenedStack = new LinkedList(); private final HashMap myOpenedActivities = new HashMap(); public void openTree(Context context, NetworkTree tree) { - final int level = tree.Level - 1; // tree.Level == 1 for catalog's root element - if (level > myOpenedStack.size()) { - throw new RuntimeException("Unable to open catalog with Level greater than the number of opened catalogs.\n" - + "Catalog: " + tree.getName() + "\n" - + "Level: " + level + "\n" - + "Opened catalogs: " + myOpenedStack.size()); - } - while (level < myOpenedStack.size()) { - myOpenedStack.removeLast(); - } - myOpenedStack.add(tree); - context.startActivity( new Intent(context.getApplicationContext(), NetworkCatalogActivity.class) - .putExtra(NetworkCatalogActivity.CATALOG_LEVEL_KEY, level) .putExtra(NetworkCatalogActivity.CATALOG_KEY_KEY, tree.getUniqueKey()) ); } @@ -306,13 +292,6 @@ class NetworkView { return myOpenedActivities.get(key); } - public NetworkTree getOpenedTree(int level) { - if (level < 0 || level >= myOpenedStack.size()) { - return null; - } - return myOpenedStack.get(level); - } - /* * Special view items item */ From 48de79c40ff9b4d84caa7df7c9c09970a89ae0bd Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 1 Mar 2011 20:26:56 +0000 Subject: [PATCH 33/71] cleanup: standard java serialization is good enough for NetworkTree.Key --- .../fbreader/network/NetworkTree.java | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/src/org/geometerplus/fbreader/network/NetworkTree.java b/src/org/geometerplus/fbreader/network/NetworkTree.java index 716c15c8a..50524143f 100644 --- a/src/org/geometerplus/fbreader/network/NetworkTree.java +++ b/src/org/geometerplus/fbreader/network/NetworkTree.java @@ -67,38 +67,6 @@ public abstract class NetworkTree extends FBTree { public String toString() { return Parent == null ? Id : Parent.toString() + " :: " + Id; } - - /* - private void writeObject(ObjectOutputStream os) throws IOException { - if (Parent != null) { - Parent.writeObject(os); - } - os.writeBytes(Id); - os.writeBytes("\000"); - } - - private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException { - Parent = null; - Id = null; - - final StringBuilder builder = new StringBuilder(); - try { - while (true) { - char c = is.readChar(); - if (c != '\000') { - builder.append(c); - } else { - if (Id != null) { - Parent = new Key(Parent, Id); - } - Id = builder.toString(); - builder.delete(0, builder.length()); - } - } - } catch (IOException e) { - } - } - */ } protected NetworkTree() { From 348c749054a211efe74db0e51da3642e9b2aca37 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 16:34:28 +0000 Subject: [PATCH 34/71] code simplification --- .../network/AddCustomCatalogItemActions.java | 3 +- .../network/NetworkCatalogActions.java | 1 - .../network/NetworkLibraryActivity.java | 6 +- .../android/fbreader/network/NetworkView.java | 6 -- .../network/AddCustomCatalogItemTree.java | 2 +- .../fbreader/network/NetworkLibrary.java | 58 ++++++------------- 6 files changed, 20 insertions(+), 56 deletions(-) rename src/org/geometerplus/{android => }/fbreader/network/AddCustomCatalogItemTree.java (97%) diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemActions.java b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemActions.java index 63f804209..8a6f6d663 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemActions.java +++ b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemActions.java @@ -25,10 +25,9 @@ import android.view.Menu; import android.view.ContextMenu; import org.geometerplus.fbreader.network.NetworkTree; - +import org.geometerplus.fbreader.network.AddCustomCatalogItemTree; class AddCustomCatalogItemActions extends NetworkTreeActions { - public static final int RUN_ITEM_ID = 0; @Override diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 8f76b1d65..177cb3b11 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -474,7 +474,6 @@ class NetworkCatalogActions extends NetworkTreeActions { private void removeCustomLink(ICustomNetworkLink link) { final NetworkLibrary library = NetworkLibrary.Instance(); library.removeCustomLink(link); - library.updateChildren(); library.synchronize(); NetworkView.Instance().fireModelChangedAsync(); } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index 2a819f841..51d5a95b7 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -91,7 +91,6 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { public void run() { final NetworkLibrary library = NetworkLibrary.Instance(); library.addCustomLink(link); - library.updateChildren(); library.synchronize(); NetworkView.Instance().fireModelChangedAsync(); getListView().invalidateViews(); @@ -227,7 +226,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { if (!NetworkView.Instance().isInitialized()) { return 0; } - return myTree.subTrees().size() + 2; // subtrees + + + return myTree.subTrees().size() + 1; // subtrees + } public final NetworkTree getItem(int position) { @@ -236,8 +235,6 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { return NetworkView.Instance().getSearchItemTree(); } else if (position > 0 && position <= size) { return (NetworkTree)myTree.subTrees().get(position - 1); - } else if (position == size + 1) { - return NetworkView.Instance().getAddCustomCatalogItemTree(); } return null; } @@ -319,7 +316,6 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { } } library.setActiveLanguageCodes(newActiveCodes); - library.invalidateChildren(); library.synchronize(); NetworkView.Instance().fireModelChanged(); } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkView.java b/src/org/geometerplus/android/fbreader/network/NetworkView.java index 8166d502e..a59c4b6cd 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkView.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkView.java @@ -71,7 +71,6 @@ class NetworkView { final NetworkTree root = library.getRootTree(); mySearchItem = new SearchItemTree(root); - myAddCustomCatalogItem = new AddCustomCatalogItemTree(root); myInitialized = true; } @@ -297,13 +296,8 @@ class NetworkView { */ private SearchItemTree mySearchItem; - private AddCustomCatalogItemTree myAddCustomCatalogItem; public SearchItemTree getSearchItemTree() { return mySearchItem; } - - public AddCustomCatalogItemTree getAddCustomCatalogItemTree() { - return myAddCustomCatalogItem; - } } diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java b/src/org/geometerplus/fbreader/network/AddCustomCatalogItemTree.java similarity index 97% rename from src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java rename to src/org/geometerplus/fbreader/network/AddCustomCatalogItemTree.java index 77b7d0018..f4f65d22a 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemTree.java +++ b/src/org/geometerplus/fbreader/network/AddCustomCatalogItemTree.java @@ -17,7 +17,7 @@ * 02110-1301, USA. */ -package org.geometerplus.android.fbreader.network; +package org.geometerplus.fbreader.network; import org.geometerplus.zlibrary.core.resources.ZLResource; diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 03bfc2c6f..eb0f6ad16 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -119,6 +119,7 @@ public class NetworkLibrary { allCodes.removeAll(languageCodes()); allCodes.addAll(codes); activeLanguageCodesOption().setValue(commaSeparatedString(allCodes)); + invalidateChildren(); } private String commaSeparatedString(Collection codes) { @@ -149,8 +150,7 @@ public class NetworkLibrary { private final RootTree myRootTree = new RootTree(); - private boolean myUpdateChildren = true; - private boolean myInvalidateChildren; + private boolean myChildrenAreInvalid = true; private boolean myUpdateVisibility; private NetworkLibrary() { @@ -188,24 +188,6 @@ public class NetworkLibrary { ); } - /*testDate(new ATOMUpdated(2010, 1, 1, 1, 0, 0, 0, 2, 0), - new ATOMUpdated(2009, 12, 31, 23, 0, 0, 0, 0, 0)); - testDate(new ATOMUpdated(2010, 12, 31, 23, 40, 0, 0, -1, -30), - new ATOMUpdated(2011, 1, 1, 1, 10, 0, 0, 0, 0)); - testDate(new ATOMUpdated(2010, 1, 31, 23, 40, 0, 0, -1, -30), - new ATOMUpdated(2010, 2, 1, 1, 10, 0, 0, 0, 0)); - testDate(new ATOMUpdated(2010, 2, 28, 23, 40, 0, 0, -1, -30), - new ATOMUpdated(2010, 3, 1, 1, 10, 0, 0, 0, 0)); - testDate(new ATOMUpdated(2012, 2, 28, 23, 40, 0, 0, -1, -30), - new ATOMUpdated(2012, 2, 29, 1, 10, 0, 0, 0, 0)); - testDate(new ATOMUpdated(2012, 2, 15, 23, 40, 0, 0, -1, -30), - new ATOMUpdated(2012, 2, 16, 1, 10, 0, 0, 0, 0)); - testDate(new ATOMUpdated(2012, 2, 15, 23, 40, 1, 0, 3, 30), - new ATOMUpdated(2012, 2, 15, 23, 40, 0, 0, 3, 30)); - testDate(new ATOMUpdated(2012, 2, 15, 23, 40, 0, 0, 3, 30), - new ATOMUpdated(2012, 2, 15, 23, 40, 1, 0, 3, 30)); - testDate(new ATOMUpdated(2012, 2, 15, 23, 40, 0, 0.001f, 3, 30), - new ATOMUpdated(2012, 2, 15, 23, 40, 0, 0, 3, 30));*/ myIsAlreadyInitialized = true; } @@ -272,7 +254,7 @@ public class NetworkLibrary { synchronized (myLinks) { removeAllLoadedLinks(); myLinks.addAll(myBackgroundLinks); - updateChildren(); + invalidateChildren(); } } } @@ -291,30 +273,22 @@ public class NetworkLibrary { } public void invalidateChildren() { - myInvalidateChildren = true; - } - - public void updateChildren() { - myUpdateChildren = true; + myChildrenAreInvalid = true; } public void invalidateVisibility() { myUpdateVisibility = true; } - 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 boolean linkIsChanged(INetworkLink link) { + return + link instanceof ICustomNetworkLink && + ((ICustomNetworkLink)link).hasChanges(); } private static void makeValid(INetworkLink link) { if (link instanceof ICustomNetworkLink) { - ((ICustomNetworkLink) link).resetChanges(); + ((ICustomNetworkLink)link).resetChanges(); } } @@ -340,9 +314,9 @@ public class NetworkLibrary { ++nodeCount; continue; } - final INetworkLink nodeLink = ((NetworkCatalogTree) currentNode).Item.Link; + final INetworkLink nodeLink = ((NetworkCatalogTree)currentNode).Item.Link; if (link == nodeLink) { - if (linkIsInvalid(link, nodeLink)) { + if (linkIsChanged(link)) { toRemove.add(currentNode); } else { processed = true; @@ -359,7 +333,7 @@ public class NetworkLibrary { break; } } - if (newNodeLink == null || linkIsInvalid(newNodeLink, nodeLink)) { + if (newNodeLink == null || linkIsChanged(nodeLink)) { toRemove.add(currentNode); currentNode = null; ++nodeCount; @@ -390,6 +364,7 @@ public class NetworkLibrary { for (FBTree tree : toRemove) { tree.removeSelf(); } + new AddCustomCatalogItemTree(myRootTree); } private void updateVisibility() { @@ -402,9 +377,8 @@ public class NetworkLibrary { } public void synchronize() { - if (myUpdateChildren || myInvalidateChildren) { - myUpdateChildren = false; - myInvalidateChildren = false; + if (myChildrenAreInvalid) { + myChildrenAreInvalid = false; makeUpToDate(); } if (myUpdateVisibility) { @@ -499,6 +473,7 @@ public class NetworkLibrary { } } NetworkDatabase.Instance().saveCustomLink(link); + invalidateChildren(); } public void removeCustomLink(ICustomNetworkLink link) { @@ -506,6 +481,7 @@ public class NetworkLibrary { myLinks.remove(link); } NetworkDatabase.Instance().deleteCustomLink(link); + invalidateChildren(); } public boolean hasCustomLinkTitle(String title, INetworkLink exceptFor) { From f3f228b427ee95429fbedd0ad6213b2d1a391f14 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 16:54:04 +0000 Subject: [PATCH 35/71] unused code has been removed --- .../network/AuthenticationDialog.java | 8 ++-- .../fbreader/network/NetworkDialog.java | 39 +++++-------------- .../fbreader/network/NetworkLibrary.java | 7 ++-- 3 files changed, 16 insertions(+), 38 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java index 7e7b1d0cb..1e43db96f 100644 --- a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java +++ b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java @@ -72,7 +72,7 @@ class AuthenticationDialog extends NetworkDialog { if (login.length() == 0) { final String err = myResource.getResource("loginIsEmpty").getValue(); - sendError(true, false, err); + sendError(err); return; } @@ -87,10 +87,10 @@ class AuthenticationDialog extends NetworkDialog { } } catch (ZLNetworkException e) { mgr.logOut(); - sendError(true, false, e.getMessage()); + sendError(e.getMessage()); return; } - sendSuccess(false); + sendSuccess(); } }; UIUtil.wait("authentication", runnable, myActivity); @@ -103,7 +103,7 @@ class AuthenticationDialog extends NetworkDialog { public void run() { if (mgr.mayBeAuthorised(false)) { mgr.logOut(); - sendCancel(false); + sendCancel(); } } }; diff --git a/src/org/geometerplus/android/fbreader/network/NetworkDialog.java b/src/org/geometerplus/android/fbreader/network/NetworkDialog.java index 45b8d4599..7b5ce0903 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkDialog.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkDialog.java @@ -58,41 +58,20 @@ abstract class NetworkDialog { return dlg; } - private class DialogHandler extends Handler { - - public Message obtainMessage(int code, boolean invalidateLibrary, String message) { - return obtainMessage(code, invalidateLibrary ? 1 : 0, 0, message); - } - @Override public void handleMessage(Message message) { if (!NetworkView.Instance().isInitialized()) { return; } final NetworkLibrary library = NetworkLibrary.Instance(); - if (message.arg1 != 0) { - library.invalidateChildren(); - } library.invalidateVisibility(); library.synchronize(); NetworkView.Instance().fireModelChanged(); if (message.what < 0) { - if (message.what == -2) { - final ZLResource dialogResource = ZLResource.resource("dialog"); - final ZLResource boxResource = dialogResource.getResource("networkError"); - final ZLResource buttonResource = dialogResource.getResource("button"); - new AlertDialog.Builder(myActivity) - .setTitle(boxResource.getResource("title").getValue()) - .setMessage((String) message.obj) - .setIcon(0) - .setPositiveButton(buttonResource.getResource("ok").getValue(), null) - .create().show(); - } else { - myErrorMessage = (String) message.obj; - myActivity.showDialog(myId); - return; - } + myErrorMessage = (String) message.obj; + myActivity.showDialog(myId); + return; } else if (message.what > 0) { if (myOnSuccessRunnable != null) { myOnSuccessRunnable.run(); @@ -130,16 +109,16 @@ abstract class NetworkDialog { } - protected void sendSuccess(boolean invalidateLibrary) { - myHandler.sendMessage(myHandler.obtainMessage(1, invalidateLibrary, null)); + protected void sendSuccess() { + myHandler.sendMessage(myHandler.obtainMessage(1, null)); } - protected void sendCancel(boolean invalidateLibrary) { - myHandler.sendMessage(myHandler.obtainMessage(0, invalidateLibrary, null)); + protected void sendCancel() { + myHandler.sendMessage(myHandler.obtainMessage(0, null)); } - protected void sendError(boolean restart, boolean invalidateLibrary, String message) { - myHandler.sendMessage(myHandler.obtainMessage(restart ? -1 : -2, invalidateLibrary, message)); + protected void sendError(String message) { + myHandler.sendMessage(myHandler.obtainMessage(-1, message)); } protected abstract View createLayout(); diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index eb0f6ad16..6496c4f02 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -272,7 +272,7 @@ public class NetworkLibrary { return url; } - public void invalidateChildren() { + private void invalidateChildren() { myChildrenAreInvalid = true; } @@ -369,10 +369,9 @@ public class NetworkLibrary { private void updateVisibility() { for (FBTree tree : myRootTree.subTrees()) { - if (!(tree instanceof NetworkCatalogTree)) { - continue; + if (tree instanceof NetworkCatalogTree) { + ((NetworkCatalogTree)tree).updateVisibility(); } - ((NetworkCatalogTree) tree).updateVisibility(); } } From 7f03baca749b6b4d2803ed26362a7adeb9ae7ec1 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 17:30:57 +0000 Subject: [PATCH 36/71] NetworkDialog -> AuthenticationDialog --- .../network/AuthenticationDialog.java | 122 +++++++++++-- .../fbreader/network/NetworkBaseActivity.java | 6 +- .../fbreader/network/NetworkBookActions.java | 2 +- .../network/NetworkBookInfoActivity.java | 6 +- .../network/NetworkCatalogActions.java | 4 +- .../fbreader/network/NetworkDialog.java | 163 ------------------ .../network/RefillAccountActions.java | 2 +- 7 files changed, 116 insertions(+), 189 deletions(-) delete mode 100644 src/org/geometerplus/android/fbreader/network/NetworkDialog.java diff --git a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java index 1e43db96f..73deb8678 100644 --- a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java +++ b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java @@ -19,32 +19,96 @@ package org.geometerplus.android.fbreader.network; -import android.app.Dialog; +import android.app.Activity; import android.app.AlertDialog; +import android.app.Dialog; import android.content.DialogInterface; +import android.os.Handler; +import android.os.Message; import android.view.View; import android.widget.TextView; -import org.geometerplus.zlibrary.ui.android.R; - +import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.network.ZLNetworkException; +import org.geometerplus.zlibrary.ui.android.R; + +import org.geometerplus.fbreader.network.INetworkLink; +import org.geometerplus.fbreader.network.NetworkLibrary; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; import org.geometerplus.android.util.UIUtil; +class AuthenticationDialog { + private static AuthenticationDialog ourDialog; + + public static AuthenticationDialog getDialog() { + if (ourDialog == null) { + ourDialog = new AuthenticationDialog(); + } + return ourDialog; + } + + private class DialogHandler extends Handler { + @Override + public void handleMessage(Message message) { + if (!NetworkView.Instance().isInitialized()) { + return; + } + final NetworkLibrary library = NetworkLibrary.Instance(); + library.invalidateVisibility(); + library.synchronize(); + NetworkView.Instance().fireModelChanged(); + if (message.what < 0) { + myErrorMessage = (String) message.obj; + myActivity.showDialog(0); + return; + } else if (message.what > 0) { + if (myOnSuccessRunnable != null) { + myOnSuccessRunnable.run(); + } + } + } + }; + + + protected final ZLResource myResource; + + protected INetworkLink myLink; + protected String myErrorMessage; + protected Runnable myOnSuccessRunnable; + protected Activity myActivity; + + protected final DialogHandler myHandler = new DialogHandler(); -class AuthenticationDialog extends NetworkDialog { public AuthenticationDialog() { - super("AuthenticationDialog"); + myResource = ZLResource.resource("dialog").getResource("AuthenticationDialog"); } - @Override - protected void clearData() { + public static void show(Activity activity, INetworkLink link, Runnable onSuccessRunnable) { + getDialog().showInternal(activity, link, onSuccessRunnable); } - @Override - public View createLayout() { + private void showInternal(Activity activity, INetworkLink link, Runnable onSuccessRunnable) { + myLink = link; + myErrorMessage = null; + myOnSuccessRunnable = onSuccessRunnable; + activity.showDialog(0); + } + + protected void sendSuccess() { + myHandler.sendMessage(myHandler.obtainMessage(1, null)); + } + + protected void sendCancel() { + myHandler.sendMessage(myHandler.obtainMessage(0, null)); + } + + protected void sendError(String message) { + myHandler.sendMessage(myHandler.obtainMessage(-1, message)); + } + + private View createLayout() { final View layout = myActivity.getLayoutInflater().inflate(R.layout.network_authentication_dialog, null); ((TextView) layout.findViewById(R.id.network_authentication_login_text)).setText(myResource.getResource("login").getValue()); @@ -56,7 +120,7 @@ class AuthenticationDialog extends NetworkDialog { public void onClick(View view) { //final NetworkAuthenticationManager mgr = myLink.authenticationManager(); if (Util.isRegistrationSupported(myActivity, myLink)) { - myActivity.dismissDialog(NetworkDialog.DIALOG_AUTHENTICATION); + myActivity.dismissDialog(0); Util.runRegistrationDialog(myActivity, myLink); } } @@ -64,8 +128,7 @@ class AuthenticationDialog extends NetworkDialog { return layout; } - @Override - protected void onPositive(DialogInterface dialog) { + private void onPositive(DialogInterface dialog) { AlertDialog alert = (AlertDialog) dialog; final String login = ((TextView) alert.findViewById(R.id.network_authentication_login)).getText().toString().trim(); final String password = ((TextView) alert.findViewById(R.id.network_authentication_password)).getText().toString(); @@ -96,8 +159,7 @@ class AuthenticationDialog extends NetworkDialog { UIUtil.wait("authentication", runnable, myActivity); } - @Override - protected void onNegative(DialogInterface dialog) { + private void onNegative(DialogInterface dialog) { final NetworkAuthenticationManager mgr = myLink.authenticationManager(); final Runnable runnable = new Runnable() { public void run() { @@ -110,8 +172,36 @@ class AuthenticationDialog extends NetworkDialog { UIUtil.wait("signOut", runnable, myActivity); } - @Override - public void prepareDialogInternal(Dialog dialog) { + public final Dialog createDialog(final Activity activity) { + myActivity = activity; + final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_POSITIVE) { + onPositive(dialog); + } else { + onNegative(dialog); + } + } + }; + + final View layout = createLayout(); + final ZLResource buttonResource = ZLResource.resource("dialog").getResource("button"); + return new AlertDialog.Builder(activity) + .setView(layout) + .setTitle(myResource.getResource("title").getValue()) + .setPositiveButton(buttonResource.getResource("ok").getValue(), listener) + .setNegativeButton(buttonResource.getResource("cancel").getValue(), listener) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + onNegative(dialog); + } + }) + .create(); + } + + public final void prepareDialog(final Activity activity, Dialog dialog) { + myActivity = activity; + final NetworkAuthenticationManager mgr = myLink.authenticationManager(); ((TextView) dialog.findViewById(R.id.network_authentication_login)).setText(mgr.UserNameOption.getValue()); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java index 86aadfd71..c7ba7eaf7 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java @@ -260,7 +260,7 @@ abstract class NetworkBaseActivity extends ListActivity implements NetworkView.E if (!NetworkView.Instance().isInitialized()) { return null; } - final NetworkDialog dlg = NetworkDialog.getDialog(id); + final AuthenticationDialog dlg = AuthenticationDialog.getDialog(); if (dlg != null) { return dlg.createDialog(this); } @@ -271,10 +271,10 @@ abstract class NetworkBaseActivity extends ListActivity implements NetworkView.E protected void onPrepareDialog(int id, Dialog dialog) { super.onPrepareDialog(id, dialog); - final NetworkDialog dlg = NetworkDialog.getDialog(id); + final AuthenticationDialog dlg = AuthenticationDialog.getDialog(); if (dlg != null) { dlg.prepareDialog(this, dialog); - } + } } @Override diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java index 04fc11968..27500fa85 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java @@ -451,7 +451,7 @@ class NetworkBookActions extends NetworkTreeActions { } } catch (ZLNetworkException e) { } - NetworkDialog.show(activity, NetworkDialog.DIALOG_AUTHENTICATION, book.Link, buyRunnable); + AuthenticationDialog.show(activity, book.Link, buyRunnable); } private static void doBuyInBrowser(Activity activity, final NetworkBookItem book) { diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java index cea518a1f..6890d682b 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookInfoActivity.java @@ -307,7 +307,7 @@ public class NetworkBookInfoActivity extends Activity implements NetworkView.Eve if (!NetworkView.Instance().isInitialized()) { return null; } - final NetworkDialog dlg = NetworkDialog.getDialog(id); + final AuthenticationDialog dlg = AuthenticationDialog.getDialog(); if (dlg != null) { return dlg.createDialog(this); } @@ -318,9 +318,9 @@ public class NetworkBookInfoActivity extends Activity implements NetworkView.Eve protected void onPrepareDialog(int id, Dialog dialog) { super.onPrepareDialog(id, dialog); - final NetworkDialog dlg = NetworkDialog.getDialog(id); + final AuthenticationDialog dlg = AuthenticationDialog.getDialog(); if (dlg != null) { dlg.prepareDialog(this, dialog); - } + } } } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 177cb3b11..9cd0c37ef 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -201,7 +201,7 @@ class NetworkCatalogActions extends NetworkTreeActions { case B3_TRUE: return false; case B3_UNDEFINED: - NetworkDialog.show(activity, NetworkDialog.DIALOG_AUTHENTICATION, ((NetworkCatalogTree)tree).Item.Link, new Runnable() { + AuthenticationDialog.show(activity, ((NetworkCatalogTree)tree).Item.Link, new Runnable() { public void run() { if (catalogTree.Item.getVisibility() != ZLBoolean3.B3_TRUE) { return; @@ -235,7 +235,7 @@ class NetworkCatalogActions extends NetworkTreeActions { doReloadCatalog(activity, (NetworkCatalogTree)tree); return true; case SIGNIN_ITEM_ID: - NetworkDialog.show(activity, NetworkDialog.DIALOG_AUTHENTICATION, ((NetworkCatalogTree)tree).Item.Link, null); + AuthenticationDialog.show(activity, ((NetworkCatalogTree)tree).Item.Link, null); return true; case SIGNUP_ITEM_ID: Util.runRegistrationDialog(activity, ((NetworkCatalogTree)tree).Item.Link); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkDialog.java b/src/org/geometerplus/android/fbreader/network/NetworkDialog.java deleted file mode 100644 index 7b5ce0903..000000000 --- a/src/org/geometerplus/android/fbreader/network/NetworkDialog.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2010-2011 Geometer Plus - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package org.geometerplus.android.fbreader.network; - -import java.util.TreeMap; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.os.Handler; -import android.os.Message; -import android.view.View; - -import org.geometerplus.zlibrary.core.resources.ZLResource; - -import org.geometerplus.fbreader.network.INetworkLink; -import org.geometerplus.fbreader.network.NetworkLibrary; - - -abstract class NetworkDialog { - - // dialog identifiers - public static final int DIALOG_AUTHENTICATION = 0; - - private static final TreeMap ourInstances = new TreeMap(); - - public static NetworkDialog getDialog(int id) { - NetworkDialog dlg = ourInstances.get(Integer.valueOf(id)); - if (dlg == null) { - switch (id) { - case DIALOG_AUTHENTICATION: - dlg = new AuthenticationDialog(); - break; - } - if (dlg != null) { - dlg.myId = id; - ourInstances.put(Integer.valueOf(id), dlg); - } - } - return dlg; - } - - private class DialogHandler extends Handler { - @Override - public void handleMessage(Message message) { - if (!NetworkView.Instance().isInitialized()) { - return; - } - final NetworkLibrary library = NetworkLibrary.Instance(); - library.invalidateVisibility(); - library.synchronize(); - NetworkView.Instance().fireModelChanged(); - if (message.what < 0) { - myErrorMessage = (String) message.obj; - myActivity.showDialog(myId); - return; - } else if (message.what > 0) { - if (myOnSuccessRunnable != null) { - myOnSuccessRunnable.run(); - } - } - clearData(); - } - }; - - - protected final ZLResource myResource; - - protected int myId; - - protected INetworkLink myLink; - protected String myErrorMessage; - protected Runnable myOnSuccessRunnable; - protected Activity myActivity; - - protected final DialogHandler myHandler = new DialogHandler(); - - public NetworkDialog(String key) { - myResource = ZLResource.resource("dialog").getResource(key); - } - - public static void show(Activity activity, int id, INetworkLink link, Runnable onSuccessRunnable) { - getDialog(id).showInternal(activity, link, onSuccessRunnable); - } - - private void showInternal(Activity activity, INetworkLink link, Runnable onSuccessRunnable) { - myLink = link; - myErrorMessage = null; - myOnSuccessRunnable = onSuccessRunnable; - activity.showDialog(myId); - } - - - protected void sendSuccess() { - myHandler.sendMessage(myHandler.obtainMessage(1, null)); - } - - protected void sendCancel() { - myHandler.sendMessage(myHandler.obtainMessage(0, null)); - } - - protected void sendError(String message) { - myHandler.sendMessage(myHandler.obtainMessage(-1, message)); - } - - protected abstract View createLayout(); - protected abstract void clearData(); - - protected abstract void onPositive(DialogInterface dialog); - protected abstract void onNegative(DialogInterface dialog); - - public final Dialog createDialog(final Activity activity) { - myActivity = activity; - final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - if (which == DialogInterface.BUTTON_POSITIVE) { - onPositive(dialog); - } else { - onNegative(dialog); - } - } - }; - - final View layout = createLayout(); - final ZLResource buttonResource = ZLResource.resource("dialog").getResource("button"); - return new AlertDialog.Builder(activity) - .setView(layout) - .setTitle(myResource.getResource("title").getValue()) - .setPositiveButton(buttonResource.getResource("ok").getValue(), listener) - .setNegativeButton(buttonResource.getResource("cancel").getValue(), listener) - .setOnCancelListener(new DialogInterface.OnCancelListener() { - public void onCancel(DialogInterface dialog) { - onNegative(dialog); - } - }) - .create(); - } - - public final void prepareDialog(final Activity activity, Dialog dialog) { - myActivity = activity; - prepareDialogInternal(dialog); - } - - protected abstract void prepareDialogInternal(Dialog dialog); -} diff --git a/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java b/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java index fbb1f8799..ab458905f 100644 --- a/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java +++ b/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java @@ -134,7 +134,7 @@ class RefillAccountActions extends NetworkTreeActions { if (mgr.mayBeAuthorised(false)) { refiller.run(); } else { - NetworkDialog.show(activity, NetworkDialog.DIALOG_AUTHENTICATION, link, new Runnable() { + AuthenticationDialog.show(activity, link, new Runnable() { public void run() { if (mgr.mayBeAuthorised(false)) { refiller.run(); From e60f32b331b13f83cdbef080e0c3006b00f1c52c Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 17:35:31 +0000 Subject: [PATCH 37/71] icon rollback --- icons/fbreader.png | Bin 1885 -> 23890 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/fbreader.png b/icons/fbreader.png index 44bfd85abe0c4ba6a87fa98f057b752fbc8b1aa8..149e037e3d19e358344f68d522469f4ea182d3d9 100644 GIT binary patch literal 23890 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 Y0BZli3n2XXbN~PV07*qoM6N<$f?~D&J^%m! delta 1870 zcmV-U2eJ6lx&hq|A&F2rZLYho(l?*l*3@qs`D8uoelPD=(*0g*L!KkAz)4)pw ziV4L`+Uu|Mq&%{*7My-VH9} z0a#f?ND{DbJqOk}eDV1YFpT4td63EuAOlYs0T9bT_nyWBEj1rhdn*GThkvQvW{Ous zbRHlw3GnwcLJ>?)jKlycP0)iM@1v}g3qYA@W4-_Vr=QeR+4gyzmOV~uvN3HXktYD5 zXL$SvAilijLN=UTX@)lZ=tf!KsisSSXxb1!EVsYu^lxvd+F!T9al~C|*bVV80)b#G zp>+hGqCG6hy70O(hWce|`EK=u1 zsL(ZWECVE_jpgLgCf~`U?;fc0Io{vsu^zHk#NL7!T15l_c{YQ{*+Pzs}sJ^}ivyVAS2$@ZC*TRCV*{<39s?0)N12^SOkFMWveS+zRU zP?Cc4rH0^iEhy_yJSbJXcu`y^cK+`co_4A_PKicB9VSNbD+=ZWFozNo%8$HjPBKxh z@ZgZeI){daJ_-hdBY(+cGR2w@z3$w(bA;&0>uXT5&Q)tx2oSLX=dD|}jqY>Te>+6Z06MX3rErydOA>312TN}V{iRtKL zwOYY$w+DD1xmYZKhy^()$}!!d(P+V?hf;tz;bvlhPMtahO@B>IB?IHci4(AO>()%0 zWTrwQs8WCow8L9fP1|g6?AWoA0kmz~Hi*Sys+S(B)?($jzirGH2o}K*>!gN`Mm3cw zHE7HLBn1ZDcjn9)%>fx49MqiRssSYK!z@;FfJiPz>O;4%WcHKz~M{bm4=D@=C2juEh#twE%?KC?+*G6L?Z}psp9zsf&~d6 z>82K==|M*z`do?f;_FG#j_Fc^?k9`5aN&aH6uW%+a(`CPne{>Bc;(8KRZh1MtC4c# z0=0BOv1|%TEjHJ+Gto!5PPQ@3T9Dv0N$czD)0|@Bd+1`jL$H?q{{FliZ?0TON%hVw z#j+_zFIt=x)1Zj`N~Xn&eVeWl#Y>kiX-+XAQp)*am`fBdUc4y#o6J_pXFC^H^~@)V zw3E&?Cx2UH%a#0Px{mJhpsQD}YECg>OGOtxNZfz^{CQbckjc^J+Hq{oJf@| z!J`2XZ&`=|p(#X<)#au=?KH1nzpgpO&YnH1pZy>L4h@ia%T=y3Rua*erdU27ppp=biigk8&!lOrz zpxjzn{g0v+KB?pYJ$Uc{9zJ{sv$M0X+wX_w=4N<%^JaYmq}I(xM@L~~WCWUb?0`TZ z0DsSymS8p*1h3Z%c8BBjv7oWBF&G~ohqkshXm4+S)lV#kfb&jcWBS~Kz*x*?sPcFq zva*tMelZ$X2taa$Ebb3<;N(d6&&|z2{gy4Ot{ul@azk~stobq@;bNa+t*x!Ej`Tco z9u9}W<#N61+q7vDa2&U0T&DSDLou>2VSkbIyq1<0c)qv@4yO|$kqFe))j>l;11u~o ztN|#~d=|qz(Jm2>$8&Db%V|EJ4>qE>*R2Dm+YKg@DGkp2{CvR+3xz^y(4oLL!6*eN zj`Cu7c=+DVojX4!PxzS4=E5Qk$~;;T5j7eCg@8OYH3btB6ZeR|yxw^=rB6Lq;(wtQ zrMbJi`zy47T_`mYk0F($5$m3wo_;zxIXQ9n?%f};>o=4cT<3Bz03sIW;z1(er-nZ# zX2inlsmNkTen8CeDZG3okl>4QIdcHUL!1Ec=HxK4KnH1sr@g&0LSwqWVlor_y7O^07*qo IM6N<$g3Ex1Hvj+t From ef86c59ae5f467f22317d68e71e2b7756f262d97 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 17:43:07 +0000 Subject: [PATCH 38/71] duplicate 'add custom catalog' items have been removed --- src/org/geometerplus/fbreader/network/NetworkLibrary.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 6496c4f02..75a006ec0 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -310,6 +310,7 @@ public class NetworkLibrary { currentNode = nodeIterator.next(); } if (!(currentNode instanceof NetworkCatalogTree)) { + toRemove.add(currentNode); currentNode = null; ++nodeCount; continue; @@ -355,9 +356,7 @@ public class NetworkLibrary { if (currentNode == null) { currentNode = nodeIterator.next(); } - if (currentNode instanceof NetworkCatalogTree) { - toRemove.add(currentNode); - } + toRemove.add(currentNode); currentNode = null; } From ebe98a6a636c130ce9b700074717cea48d573aea Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 17:51:43 +0000 Subject: [PATCH 39/71] AddCustomCatalogItemTree doesn't depend on android-related packages --- .../network/AddCustomCatalogItemActions.java | 2 +- .../fbreader/network/NetworkBaseActivity.java | 5 +++++ .../network/{ => tree}/AddCustomCatalogItemTree.java | 12 ++---------- 3 files changed, 8 insertions(+), 11 deletions(-) rename src/org/geometerplus/fbreader/network/{ => tree}/AddCustomCatalogItemTree.java (82%) diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemActions.java b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemActions.java index 8a6f6d663..fb1d6da1f 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemActions.java +++ b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogItemActions.java @@ -25,7 +25,7 @@ import android.view.Menu; import android.view.ContextMenu; import org.geometerplus.fbreader.network.NetworkTree; -import org.geometerplus.fbreader.network.AddCustomCatalogItemTree; +import org.geometerplus.fbreader.network.tree.AddCustomCatalogItemTree; class AddCustomCatalogItemActions extends NetworkTreeActions { public static final int RUN_ITEM_ID = 0; diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java index c7ba7eaf7..c8b2a1732 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java @@ -38,6 +38,7 @@ import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageData; import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.tree.NetworkBookTree; +import org.geometerplus.fbreader.network.tree.AddCustomCatalogItemTree; import org.geometerplus.android.fbreader.tree.ZLAndroidTree; @@ -105,6 +106,10 @@ abstract class NetworkBaseActivity extends ListActivity implements NetworkView.E }; private void setupCover(final ImageView coverView, NetworkTree tree, int width, int height) { + if (tree instanceof AddCustomCatalogItemTree) { + coverView.setImageResource(R.drawable.ic_list_plus); + return; + } if (tree instanceof ZLAndroidTree) { coverView.setImageResource(((ZLAndroidTree)tree).getCoverResourceId()); return; diff --git a/src/org/geometerplus/fbreader/network/AddCustomCatalogItemTree.java b/src/org/geometerplus/fbreader/network/tree/AddCustomCatalogItemTree.java similarity index 82% rename from src/org/geometerplus/fbreader/network/AddCustomCatalogItemTree.java rename to src/org/geometerplus/fbreader/network/tree/AddCustomCatalogItemTree.java index f4f65d22a..99d7bd670 100644 --- a/src/org/geometerplus/fbreader/network/AddCustomCatalogItemTree.java +++ b/src/org/geometerplus/fbreader/network/tree/AddCustomCatalogItemTree.java @@ -17,18 +17,14 @@ * 02110-1301, USA. */ -package org.geometerplus.fbreader.network; +package org.geometerplus.fbreader.network.tree; import org.geometerplus.zlibrary.core.resources.ZLResource; -import org.geometerplus.zlibrary.ui.android.R; - import org.geometerplus.fbreader.network.NetworkLibraryItem; import org.geometerplus.fbreader.network.NetworkTree; -import org.geometerplus.android.fbreader.tree.ZLAndroidTree; - -public class AddCustomCatalogItemTree extends NetworkTree implements ZLAndroidTree { +public class AddCustomCatalogItemTree extends NetworkTree { public AddCustomCatalogItemTree(NetworkTree parent) { super(parent); } @@ -48,10 +44,6 @@ public class AddCustomCatalogItemTree extends NetworkTree implements ZLAndroidTr return null; } - public int getCoverResourceId() { - return R.drawable.ic_list_plus; - } - @Override protected String getStringId() { return "@Add Custom Catalog"; From e562a54a29dae3f4d955352b28704e70fd2b2e27 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 18:19:27 +0000 Subject: [PATCH 40/71] SearchItemTree has been moved to a platform-independent code (search doesn't work at the momemnt) --- .../fbreader/network/NetworkBaseActivity.java | 8 +++----- .../fbreader/network/NetworkLibraryActivity.java | 12 +++--------- .../fbreader/network/NetworkSearchActivity.java | 4 +++- .../android/fbreader/network/NetworkView.java | 13 ------------- .../fbreader/network/SearchItemActions.java | 1 + .../fbreader/network/NetworkLibrary.java | 1 + .../network/tree}/SearchItemTree.java | 16 ++++------------ 7 files changed, 15 insertions(+), 40 deletions(-) rename src/org/geometerplus/{android/fbreader/network => fbreader/network/tree}/SearchItemTree.java (88%) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java index c8b2a1732..f7db2fd0b 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java @@ -39,11 +39,9 @@ import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageData; import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.tree.NetworkBookTree; import org.geometerplus.fbreader.network.tree.AddCustomCatalogItemTree; - -import org.geometerplus.android.fbreader.tree.ZLAndroidTree; +import org.geometerplus.fbreader.network.tree.SearchItemTree; abstract class NetworkBaseActivity extends ListActivity implements NetworkView.EventListener { - protected final ZLResource myResource = ZLResource.resource("networkView"); public BookDownloaderServiceConnection Connection; @@ -110,8 +108,8 @@ abstract class NetworkBaseActivity extends ListActivity implements NetworkView.E coverView.setImageResource(R.drawable.ic_list_plus); return; } - if (tree instanceof ZLAndroidTree) { - coverView.setImageResource(((ZLAndroidTree)tree).getCoverResourceId()); + if (tree instanceof SearchItemTree) { + coverView.setImageResource(R.drawable.ic_list_searchresult); return; } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index 51d5a95b7..a4893f64c 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -108,7 +108,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { } } - private static Initializator myInitializator; + private static Initializator myInitializator; @Override public void onResume() { @@ -226,17 +226,11 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { if (!NetworkView.Instance().isInitialized()) { return 0; } - return myTree.subTrees().size() + 1; // subtrees + + return myTree.subTrees().size(); } public final NetworkTree getItem(int position) { - final int size = myTree.subTrees().size(); - if (position == 0) { - return NetworkView.Instance().getSearchItemTree(); - } else if (position > 0 && position <= size) { - return (NetworkTree)myTree.subTrees().get(position - 1); - } - return null; + return (NetworkTree)myTree.subTrees().get(position); } public final long getItemId(int position) { diff --git a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java index 29ebfb91b..94fac197a 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java @@ -32,6 +32,7 @@ import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.*; +import org.geometerplus.fbreader.network.tree.SearchItemTree; public class NetworkSearchActivity extends Activity { @@ -54,7 +55,6 @@ public class NetworkSearchActivity extends Activity { } private class SearchHandler extends ItemsLoadingHandler { - private final SearchItemTree myTree; public SearchHandler(SearchItemTree tree) { @@ -152,6 +152,7 @@ public class NetworkSearchActivity extends Activity { final String summary = ZLResource.resource("networkView").getResource("searchResults").getValue().replace("%s", pattern); final SearchResult result = new SearchResult(summary); + /* final SearchItemTree tree = NetworkView.Instance().getSearchItemTree(); tree.setSearchResult(result); @@ -164,5 +165,6 @@ public class NetworkSearchActivity extends Activity { new SearchRunnable(handler, pattern) ); NetworkView.Instance().openTree(this, tree); + */ } } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkView.java b/src/org/geometerplus/android/fbreader/network/NetworkView.java index a59c4b6cd..9a96abf6f 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkView.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkView.java @@ -69,9 +69,6 @@ class NetworkView { myActions.add(new AddCustomCatalogItemActions()); myActions.trimToSize(); - final NetworkTree root = library.getRootTree(); - mySearchItem = new SearchItemTree(root); - myInitialized = true; } @@ -290,14 +287,4 @@ class NetworkView { public NetworkCatalogActivity getOpenedActivity(NetworkTree.Key key) { return myOpenedActivities.get(key); } - - /* - * Special view items item - */ - - private SearchItemTree mySearchItem; - - public SearchItemTree getSearchItemTree() { - return mySearchItem; - } } diff --git a/src/org/geometerplus/android/fbreader/network/SearchItemActions.java b/src/org/geometerplus/android/fbreader/network/SearchItemActions.java index 0f40cae2d..3bf28b663 100644 --- a/src/org/geometerplus/android/fbreader/network/SearchItemActions.java +++ b/src/org/geometerplus/android/fbreader/network/SearchItemActions.java @@ -25,6 +25,7 @@ import android.view.ContextMenu; import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.SearchResult; +import org.geometerplus.fbreader.network.tree.SearchItemTree; class SearchItemActions extends NetworkTreeActions { diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 75a006ec0..7b9211847 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -364,6 +364,7 @@ public class NetworkLibrary { tree.removeSelf(); } new AddCustomCatalogItemTree(myRootTree); + new SearchItemTree(myRootTree, 0); } private void updateVisibility() { diff --git a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java b/src/org/geometerplus/fbreader/network/tree/SearchItemTree.java similarity index 88% rename from src/org/geometerplus/android/fbreader/network/SearchItemTree.java rename to src/org/geometerplus/fbreader/network/tree/SearchItemTree.java index dc0347eca..7d7adff0e 100644 --- a/src/org/geometerplus/android/fbreader/network/SearchItemTree.java +++ b/src/org/geometerplus/fbreader/network/tree/SearchItemTree.java @@ -17,7 +17,7 @@ * 02110-1301, USA. */ -package org.geometerplus.android.fbreader.network; +package org.geometerplus.fbreader.network.tree; import java.util.Set; import java.util.LinkedList; @@ -29,15 +29,11 @@ import org.geometerplus.fbreader.tree.FBTree; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.tree.NetworkAuthorTree; -import org.geometerplus.zlibrary.ui.android.R; - -import org.geometerplus.android.fbreader.tree.ZLAndroidTree; - -public class SearchItemTree extends NetworkTree implements ZLAndroidTree { +public class SearchItemTree extends NetworkTree { private SearchResult myResult; - public SearchItemTree(NetworkTree parent) { - super(parent); + public SearchItemTree(NetworkTree parent, int position) { + super(parent, position); } @Override @@ -50,10 +46,6 @@ public class SearchItemTree extends NetworkTree implements ZLAndroidTree { return ZLResource.resource("networkView").getResource("searchSummary").getValue(); } - public int getCoverResourceId() { - return R.drawable.ic_list_searchresult; - } - public void setSearchResult(SearchResult result) { myResult = result; clear(); From 3f14059edbe732a53d7c85deeba2d50c52228bdf Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 19:04:33 +0000 Subject: [PATCH 41/71] network search has been restored --- .../network/NetworkLibraryActivity.java | 4 +- .../network/NetworkSearchActivity.java | 47 +++++++++++-------- .../fbreader/network/SearchItemActions.java | 6 +-- .../fbreader/network/NetworkLibrary.java | 7 ++- .../fbreader/network/NetworkTree.java | 2 - .../fbreader/network/SearchResult.java | 7 ++- 6 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index a4893f64c..4dc5cfe1c 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -266,7 +266,9 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { } private static boolean searchIsInProgress() { - return NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey); + return NetworkView.Instance().containsItemsLoadingRunnable( + NetworkLibrary.Instance().getSearchItemTree().getUniqueKey() + ); } @Override diff --git a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java index 94fac197a..4b9496160 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java @@ -86,7 +86,7 @@ public class NetworkSearchActivity extends Activity { myTree.setSearchResult(null); } else { myTree.updateSubTrees(); - afterUpdateCatalog(errorMessage, myTree.getSearchResult().empty()); + afterUpdateCatalog(errorMessage, myTree.getSearchResult().isEmpty()); } if (NetworkView.Instance().isInitialized()) { NetworkView.Instance().fireModelChangedAsync(); @@ -103,20 +103,29 @@ public class NetworkSearchActivity extends Activity { } else if (childrenEmpty) { boxResource = dialogResource.getResource("emptySearchResults"); msg = boxResource.getResource("message").getValue(); + } else { + return; } - if (msg != null) { - if (NetworkView.Instance().isInitialized()) { - final NetworkCatalogActivity activity = NetworkView.Instance().getOpenedActivity(NetworkTree.SearchKey); - if (activity != null) { - final ZLResource buttonResource = dialogResource.getResource("button"); - new AlertDialog.Builder(activity) - .setTitle(boxResource.getResource("title").getValue()) - .setMessage(msg) - .setIcon(0) - .setPositiveButton(buttonResource.getResource("ok").getValue(), null) - .create().show(); - } - } + + if (!NetworkView.Instance().isInitialized()) { + return; + } + + final SearchItemTree tree = NetworkLibrary.Instance().getSearchItemTree(); + if (tree == null) { + return; + } + + final NetworkCatalogActivity activity = + NetworkView.Instance().getOpenedActivity(tree.getUniqueKey()); + if (activity != null) { + final ZLResource buttonResource = dialogResource.getResource("button"); + new AlertDialog.Builder(activity) + .setTitle(boxResource.getResource("title").getValue()) + .setMessage(msg) + .setIcon(0) + .setPositiveButton(buttonResource.getResource("ok").getValue(), null) + .create().show(); } } } @@ -145,26 +154,24 @@ public class NetworkSearchActivity extends Activity { final NetworkLibrary library = NetworkLibrary.Instance(); library.NetworkSearchPatternOption.setValue(pattern); - if (NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey)) { + final SearchItemTree tree = library.getSearchItemTree(); + if (tree == null || + NetworkView.Instance().containsItemsLoadingRunnable(tree.getUniqueKey())) { return; } final String summary = ZLResource.resource("networkView").getResource("searchResults").getValue().replace("%s", pattern); final SearchResult result = new SearchResult(summary); - /* - final SearchItemTree tree = NetworkView.Instance().getSearchItemTree(); - tree.setSearchResult(result); NetworkView.Instance().fireModelChangedAsync(); final SearchHandler handler = new SearchHandler(tree); NetworkView.Instance().startItemsLoading( this, - NetworkTree.SearchKey, + tree.getUniqueKey(), new SearchRunnable(handler, pattern) ); NetworkView.Instance().openTree(this, tree); - */ } } diff --git a/src/org/geometerplus/android/fbreader/network/SearchItemActions.java b/src/org/geometerplus/android/fbreader/network/SearchItemActions.java index 3bf28b663..043cf73ff 100644 --- a/src/org/geometerplus/android/fbreader/network/SearchItemActions.java +++ b/src/org/geometerplus/android/fbreader/network/SearchItemActions.java @@ -39,7 +39,7 @@ class SearchItemActions extends NetworkTreeActions { @Override public String getTreeTitle(NetworkTree tree) { - final SearchResult result = ((SearchItemTree) tree).getSearchResult(); + final SearchResult result = ((SearchItemTree)tree).getSearchResult(); if (result != null) { return result.Summary; } @@ -50,7 +50,7 @@ class SearchItemActions extends NetworkTreeActions { public void buildContextMenu(Activity activity, ContextMenu menu, NetworkTree tree) { menu.setHeaderTitle(tree.getName()); - final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey); + final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(tree.getUniqueKey()); if (!isLoading) { addMenuItem(menu, RUN_SEARCH_ITEM_ID, "search"); @@ -61,7 +61,7 @@ class SearchItemActions extends NetworkTreeActions { @Override public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) { - final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey); + final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(tree.getUniqueKey()); if (!isLoading) { return RUN_SEARCH_ITEM_ID; } diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 7b9211847..51f790cb5 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -149,6 +149,7 @@ public class NetworkLibrary { } private final RootTree myRootTree = new RootTree(); + private SearchItemTree mySearchItemTree; private boolean myChildrenAreInvalid = true; private boolean myUpdateVisibility; @@ -364,7 +365,7 @@ public class NetworkLibrary { tree.removeSelf(); } new AddCustomCatalogItemTree(myRootTree); - new SearchItemTree(myRootTree, 0); + mySearchItemTree = new SearchItemTree(myRootTree, 0); } private void updateVisibility() { @@ -390,6 +391,10 @@ public class NetworkLibrary { return myRootTree; } + public SearchItemTree getSearchItemTree() { + return mySearchItemTree; + } + public NetworkTree getTreeByKey(NetworkTree.Key key) { if (key.Parent == null) { return key.equals(myRootTree.getUniqueKey()) ? myRootTree : null; diff --git a/src/org/geometerplus/fbreader/network/NetworkTree.java b/src/org/geometerplus/fbreader/network/NetworkTree.java index 50524143f..cb13a446f 100644 --- a/src/org/geometerplus/fbreader/network/NetworkTree.java +++ b/src/org/geometerplus/fbreader/network/NetworkTree.java @@ -29,8 +29,6 @@ import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.fbreader.tree.FBTree; public abstract class NetworkTree extends FBTree { - public static final Key SearchKey = new Key(null, "@Search"); - public static class Key implements Serializable { final Key Parent; final String Id; diff --git a/src/org/geometerplus/fbreader/network/SearchResult.java b/src/org/geometerplus/fbreader/network/SearchResult.java index 68e4ae717..70a7fd413 100644 --- a/src/org/geometerplus/fbreader/network/SearchResult.java +++ b/src/org/geometerplus/fbreader/network/SearchResult.java @@ -23,13 +23,12 @@ import java.util.LinkedHashMap; import java.util.LinkedList; public class SearchResult { - public final String Summary; - public final LinkedHashMap> BooksMap; + public final LinkedHashMap> BooksMap = + new LinkedHashMap>(); public SearchResult(String summary) { Summary = summary; - BooksMap = new LinkedHashMap>(); } public void addBook(NetworkBookItem book) { @@ -43,7 +42,7 @@ public class SearchResult { } } - public boolean empty() { + public boolean isEmpty() { return BooksMap.size() == 0; } } From ac19e1b17554f97c235dbba60bca1ce9911e4ad6 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 19:08:31 +0000 Subject: [PATCH 42/71] TopUp item icon has been restored --- .../android/fbreader/network/NetworkBaseActivity.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java index f7db2fd0b..7ae3475c5 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java @@ -41,6 +41,8 @@ import org.geometerplus.fbreader.network.tree.NetworkBookTree; import org.geometerplus.fbreader.network.tree.AddCustomCatalogItemTree; import org.geometerplus.fbreader.network.tree.SearchItemTree; +import org.geometerplus.android.fbreader.tree.ZLAndroidTree; + abstract class NetworkBaseActivity extends ListActivity implements NetworkView.EventListener { protected final ZLResource myResource = ZLResource.resource("networkView"); @@ -112,6 +114,10 @@ abstract class NetworkBaseActivity extends ListActivity implements NetworkView.E coverView.setImageResource(R.drawable.ic_list_searchresult); return; } + if (tree instanceof ZLAndroidTree) { + coverView.setImageResource(((ZLAndroidTree)tree).getCoverResourceId()); + return; + } Bitmap coverBitmap = null; ZLImage cover = tree.getCover(); From 3cc724b12b500473fcc3a2d8803fdbb52c948249 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 19:50:18 +0000 Subject: [PATCH 43/71] code cleanup --- .../android/fbreader/network/NetworkSearchActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java index 4b9496160..a7bbc74c1 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java @@ -66,7 +66,7 @@ public class NetworkSearchActivity extends Activity { SearchResult result = myTree.getSearchResult(); for (NetworkLibraryItem item: items) { if (item instanceof NetworkBookItem) { - result.addBook((NetworkBookItem) item); + result.addBook((NetworkBookItem)item); } } } @@ -96,7 +96,7 @@ public class NetworkSearchActivity extends Activity { private void afterUpdateCatalog(String errorMessage, boolean childrenEmpty) { final ZLResource dialogResource = ZLResource.resource("dialog"); ZLResource boxResource = null; - String msg = null; + String msg; if (errorMessage != null) { boxResource = dialogResource.getResource("networkError"); msg = errorMessage; From 27c2f3911cabafddc6bb8cf78bafdea527cc137b Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 19:53:23 +0000 Subject: [PATCH 44/71] code cleanup --- .../network/AuthenticationDialog.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java index 73deb8678..05b3598ae 100644 --- a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java +++ b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java @@ -72,18 +72,15 @@ class AuthenticationDialog { }; - protected final ZLResource myResource; + private final ZLResource myResource = + ZLResource.resource("dialog").getResource("AuthenticationDialog"); - protected INetworkLink myLink; - protected String myErrorMessage; - protected Runnable myOnSuccessRunnable; - protected Activity myActivity; + private INetworkLink myLink; + private String myErrorMessage; + private Runnable myOnSuccessRunnable; + private Activity myActivity; - protected final DialogHandler myHandler = new DialogHandler(); - - public AuthenticationDialog() { - myResource = ZLResource.resource("dialog").getResource("AuthenticationDialog"); - } + private final DialogHandler myHandler = new DialogHandler(); public static void show(Activity activity, INetworkLink link, Runnable onSuccessRunnable) { getDialog().showInternal(activity, link, onSuccessRunnable); @@ -96,15 +93,15 @@ class AuthenticationDialog { activity.showDialog(0); } - protected void sendSuccess() { + private void sendSuccess() { myHandler.sendMessage(myHandler.obtainMessage(1, null)); } - protected void sendCancel() { + private void sendCancel() { myHandler.sendMessage(myHandler.obtainMessage(0, null)); } - protected void sendError(String message) { + private void sendError(String message) { myHandler.sendMessage(myHandler.obtainMessage(-1, message)); } From e4c5c7a70d5049c83116a0231838df6a0a742e92 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 19:56:54 +0000 Subject: [PATCH 45/71] code cleanup --- .../android/fbreader/network/AuthenticationDialog.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java index 05b3598ae..bd484d536 100644 --- a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java +++ b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java @@ -59,11 +59,10 @@ class AuthenticationDialog { library.invalidateVisibility(); library.synchronize(); NetworkView.Instance().fireModelChanged(); - if (message.what < 0) { + if (message.what == -1) { myErrorMessage = (String) message.obj; myActivity.showDialog(0); - return; - } else if (message.what > 0) { + } else if (message.what == 1) { if (myOnSuccessRunnable != null) { myOnSuccessRunnable.run(); } @@ -115,7 +114,6 @@ class AuthenticationDialog { registerText.setText(myResource.getResource("register").getValue()); registerText.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { - //final NetworkAuthenticationManager mgr = myLink.authenticationManager(); if (Util.isRegistrationSupported(myActivity, myLink)) { myActivity.dismissDialog(0); Util.runRegistrationDialog(myActivity, myLink); From 3a445d7e1776c9a13cea0ed58d1c892a709778c9 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 19:57:59 +0000 Subject: [PATCH 46/71] code cleanup --- .../network/AuthenticationDialog.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java index bd484d536..5d4bc5dbb 100644 --- a/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java +++ b/src/org/geometerplus/android/fbreader/network/AuthenticationDialog.java @@ -60,7 +60,7 @@ class AuthenticationDialog { library.synchronize(); NetworkView.Instance().fireModelChanged(); if (message.what == -1) { - myErrorMessage = (String) message.obj; + myErrorMessage = (String)message.obj; myActivity.showDialog(0); } else if (message.what == 1) { if (myOnSuccessRunnable != null) { @@ -107,10 +107,10 @@ class AuthenticationDialog { private View createLayout() { final View layout = myActivity.getLayoutInflater().inflate(R.layout.network_authentication_dialog, null); - ((TextView) layout.findViewById(R.id.network_authentication_login_text)).setText(myResource.getResource("login").getValue()); - ((TextView) layout.findViewById(R.id.network_authentication_password_text)).setText(myResource.getResource("password").getValue()); + ((TextView)layout.findViewById(R.id.network_authentication_login_text)).setText(myResource.getResource("login").getValue()); + ((TextView)layout.findViewById(R.id.network_authentication_password_text)).setText(myResource.getResource("password").getValue()); - final TextView registerText = (TextView) layout.findViewById(R.id.network_authentication_register); + final TextView registerText = (TextView)layout.findViewById(R.id.network_authentication_register); registerText.setText(myResource.getResource("register").getValue()); registerText.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { @@ -124,9 +124,9 @@ class AuthenticationDialog { } private void onPositive(DialogInterface dialog) { - AlertDialog alert = (AlertDialog) dialog; - final String login = ((TextView) alert.findViewById(R.id.network_authentication_login)).getText().toString().trim(); - final String password = ((TextView) alert.findViewById(R.id.network_authentication_password)).getText().toString(); + AlertDialog alert = (AlertDialog)dialog; + final String login = ((TextView)alert.findViewById(R.id.network_authentication_login)).getText().toString().trim(); + final String password = ((TextView)alert.findViewById(R.id.network_authentication_password)).getText().toString(); if (login.length() == 0) { final String err = myResource.getResource("loginIsEmpty").getValue(); @@ -199,10 +199,10 @@ class AuthenticationDialog { final NetworkAuthenticationManager mgr = myLink.authenticationManager(); - ((TextView) dialog.findViewById(R.id.network_authentication_login)).setText(mgr.UserNameOption.getValue()); - ((TextView) dialog.findViewById(R.id.network_authentication_password)).setText(""); + ((TextView)dialog.findViewById(R.id.network_authentication_login)).setText(mgr.UserNameOption.getValue()); + ((TextView)dialog.findViewById(R.id.network_authentication_password)).setText(""); - final TextView error = (TextView) dialog.findViewById(R.id.network_authentication_error); + final TextView error = (TextView)dialog.findViewById(R.id.network_authentication_error); if (myErrorMessage == null) { error.setVisibility(View.GONE); error.setText(""); From 240b5c8c4d51ffe4b0b5177fe2e780d25dedd7cf Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 2 Mar 2011 21:22:29 +0000 Subject: [PATCH 47/71] AuthenticationActivity has been declared in manifest --- AndroidManifest.xml | 1 + AndroidManifest.xml.pattern | 1 + 2 files changed, 2 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index fa7cd9c54..4b7a628fc 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -134,6 +134,7 @@ + diff --git a/AndroidManifest.xml.pattern b/AndroidManifest.xml.pattern index 63239e669..482ff9aca 100644 --- a/AndroidManifest.xml.pattern +++ b/AndroidManifest.xml.pattern @@ -134,6 +134,7 @@ + From ff8a77024d9fef328364468524c17c9de900c8af Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Thu, 3 Mar 2011 10:33:46 +0000 Subject: [PATCH 48/71] ignoring case when looking for a zip entry by name --- src/org/amse/ys/zip/ZipFile.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/org/amse/ys/zip/ZipFile.java b/src/org/amse/ys/zip/ZipFile.java index de49f6140..15e76d5e8 100644 --- a/src/org/amse/ys/zip/ZipFile.java +++ b/src/org/amse/ys/zip/ZipFile.java @@ -21,7 +21,17 @@ public final class ZipFile { } private final InputStreamHolder myStreamHolder; - private final LinkedHashMap myFileHeaders = new LinkedHashMap(); + private final LinkedHashMap myFileHeaders = new LinkedHashMap() { + @Override + public LocalFileHeader get(Object key) { + return super.get(((String)key).toLowerCase()); + } + + @Override + public LocalFileHeader put(String key, LocalFileHeader value) { + return super.put(key.toLowerCase(), value); + } + }; private boolean myAllFilesAreRead; From 6446d79c95e283c4f8ca663ff2c9fb614db4e29a Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Thu, 3 Mar 2011 11:11:48 +0000 Subject: [PATCH 49/71] see previous comment --- src/org/amse/ys/zip/ZipFile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/amse/ys/zip/ZipFile.java b/src/org/amse/ys/zip/ZipFile.java index 15e76d5e8..f59b56f46 100644 --- a/src/org/amse/ys/zip/ZipFile.java +++ b/src/org/amse/ys/zip/ZipFile.java @@ -60,7 +60,7 @@ public final class ZipFile { } if (header.FileName != null) { myFileHeaders.put(header.FileName, header); - if (header.FileName.equals(fileToFind)) { + if (header.FileName.equalsIgnoreCase(fileToFind)) { return true; } } From b1bdb41663f6dcb270cadbc421cc384c2bf7eb91 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Thu, 3 Mar 2011 11:19:34 +0000 Subject: [PATCH 50/71] refactoring: ZLFileImage.SCHEME constant has been introduced --- .../android/fbreader/image/ImageViewActivity.java | 2 +- .../zlibrary/core/image/ZLBase64EncodedImage.java | 2 +- src/org/geometerplus/zlibrary/core/image/ZLFileImage.java | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/image/ImageViewActivity.java b/src/org/geometerplus/android/fbreader/image/ImageViewActivity.java index 0f91fc5e5..a1c19596a 100644 --- a/src/org/geometerplus/android/fbreader/image/ImageViewActivity.java +++ b/src/org/geometerplus/android/fbreader/image/ImageViewActivity.java @@ -53,7 +53,7 @@ public class ImageViewActivity extends Activity { setContentView(new ImageView()); final Uri uri = getIntent().getData(); - if ("imagefile".equals(uri.getScheme())) { + if (ZLFileImage.SCHEME.equals(uri.getScheme())) { try { final String[] data = uri.getPath().split("\000"); final ZLFileImage image = new ZLFileImage( diff --git a/src/org/geometerplus/zlibrary/core/image/ZLBase64EncodedImage.java b/src/org/geometerplus/zlibrary/core/image/ZLBase64EncodedImage.java index 48d24ac02..a72e85e2d 100644 --- a/src/org/geometerplus/zlibrary/core/image/ZLBase64EncodedImage.java +++ b/src/org/geometerplus/zlibrary/core/image/ZLBase64EncodedImage.java @@ -62,7 +62,7 @@ public abstract class ZLBase64EncodedImage extends ZLSingleImage { try { decode(); final File file = new File(decodedFileName()); - return "imagefile://" + decodedFileName() + "\0000\000" + (int)file.length(); + return ZLFileImage.SCHEME + "://" + decodedFileName() + "\0000\000" + (int)file.length(); } catch (Exception e) { return null; } diff --git a/src/org/geometerplus/zlibrary/core/image/ZLFileImage.java b/src/org/geometerplus/zlibrary/core/image/ZLFileImage.java index 4c6f09df2..3b1653bb8 100644 --- a/src/org/geometerplus/zlibrary/core/image/ZLFileImage.java +++ b/src/org/geometerplus/zlibrary/core/image/ZLFileImage.java @@ -24,6 +24,8 @@ import java.io.*; import org.geometerplus.zlibrary.core.filesystem.ZLFile; public class ZLFileImage extends ZLSingleImage { + public static final String SCHEME = "imagefile"; + private final ZLFile myFile; private final int myOffset; private final int myLength; @@ -40,7 +42,7 @@ public class ZLFileImage extends ZLSingleImage { } public String getURI() { - return "imagefile://" + myFile.getPath() + "\000" + myOffset + "\000" + myLength; + return SCHEME + "://" + myFile.getPath() + "\000" + myOffset + "\000" + myLength; } @Override From 7c679882f4eda67f84b57c9f4cafbc34abec07dc Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Thu, 3 Mar 2011 19:08:53 +0000 Subject: [PATCH 51/71] network database refactoring; SQLiteUtil class --- ChangeLog | 3 +- .../android/fbreader/SQLiteBooksDatabase.java | 52 ++++++------------- .../network/NetworkCatalogActivity.java | 1 - .../network/SQLiteNetworkDatabase.java | 36 +++++++------ .../geometerplus/android/util/SQLiteUtil.java | 50 ++++++++++++++++++ .../network/opds/NetworkOPDSFeedReader.java | 3 ++ 6 files changed, 90 insertions(+), 55 deletions(-) create mode 100644 src/org/geometerplus/android/util/SQLiteUtil.java diff --git a/ChangeLog b/ChangeLog index a9d5b5ee6..a24794d63 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,9 @@ -===== 0.99.14 (??? ??, 2011) ===== +===== 0.99.14 (Mar ??, 2011) ===== * Thai localization (by Samphan Pojanasophanakul) * Fixed TTF font style detection * opds:// URLs support has been implemented * Unexpected search call has been fixed +* Ignore case comparison for zip entry names ===== 0.99.13 (Feb 13, 2011) ===== * Fixed book/position forgetting bug diff --git a/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java b/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java index 1cf0de390..036dc517f 100644 --- a/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java +++ b/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java @@ -37,6 +37,7 @@ import org.geometerplus.zlibrary.text.view.ZLTextFixedPosition; import org.geometerplus.fbreader.library.*; import org.geometerplus.android.util.UIUtil; +import org.geometerplus.android.util.SQLiteUtil; public final class SQLiteBooksDatabase extends BooksDatabase { private final String myInstanceId; @@ -107,29 +108,6 @@ public final class SQLiteBooksDatabase extends BooksDatabase { }, context); } - private static void bindString(SQLiteStatement statement, int index, String value) { - if (value != null) { - statement.bindString(index, value); - } else { - statement.bindNull(index); - } - } - - private static void bindDate(SQLiteStatement statement, int index, Date value) { - if (value != null) { - statement.bindLong(index, value.getTime()); - } else { - statement.bindNull(index); - } - } - - private static Date getDate(Cursor cursor, int index) { - if (cursor.isNull(index)) { - return null; - } - return new Date(cursor.getLong(index)); - } - @Override protected Book loadBook(long bookId) { Book book = null; @@ -278,8 +256,8 @@ public final class SQLiteBooksDatabase extends BooksDatabase { ); } myUpdateBookInfoStatement.bindLong(1, fileId); - bindString(myUpdateBookInfoStatement, 2, encoding); - bindString(myUpdateBookInfoStatement, 3, language); + SQLiteUtil.bindString(myUpdateBookInfoStatement, 2, encoding); + SQLiteUtil.bindString(myUpdateBookInfoStatement, 3, language); myUpdateBookInfoStatement.bindString(4, title); myUpdateBookInfoStatement.bindLong(5, bookId); myUpdateBookInfoStatement.execute(); @@ -292,8 +270,8 @@ public final class SQLiteBooksDatabase extends BooksDatabase { "INSERT OR IGNORE INTO Books (encoding,language,title,file_id) VALUES (?,?,?,?)" ); } - bindString(myInsertBookInfoStatement, 1, encoding); - bindString(myInsertBookInfoStatement, 2, language); + SQLiteUtil.bindString(myInsertBookInfoStatement, 1, encoding); + SQLiteUtil.bindString(myInsertBookInfoStatement, 2, language); myInsertBookInfoStatement.bindString(3, title); final FileInfoSet infoSet = new FileInfoSet(file); myInsertBookInfoStatement.bindLong(4, infoSet.getId(file)); @@ -709,9 +687,9 @@ public final class SQLiteBooksDatabase extends BooksDatabase { cursor.getLong(1), cursor.getString(2), cursor.getString(3), - getDate(cursor, 4), - getDate(cursor, 5), - getDate(cursor, 6), + SQLiteUtil.getDate(cursor, 4), + SQLiteUtil.getDate(cursor, 5), + SQLiteUtil.getDate(cursor, 6), (int)cursor.getLong(7), cursor.getString(8), (int)cursor.getLong(9), @@ -737,9 +715,9 @@ public final class SQLiteBooksDatabase extends BooksDatabase { cursor.getLong(1), cursor.getString(2), cursor.getString(3), - getDate(cursor, 4), - getDate(cursor, 5), - getDate(cursor, 6), + SQLiteUtil.getDate(cursor, 4), + SQLiteUtil.getDate(cursor, 5), + SQLiteUtil.getDate(cursor, 6), (int)cursor.getLong(7), cursor.getString(8), (int)cursor.getLong(9), @@ -775,11 +753,11 @@ public final class SQLiteBooksDatabase extends BooksDatabase { statement.bindLong(1, bookmark.getBookId()); statement.bindString(2, bookmark.getText()); - bindDate(statement, 3, bookmark.getTime(Bookmark.CREATION)); - bindDate(statement, 4, bookmark.getTime(Bookmark.MODIFICATION)); - bindDate(statement, 5, bookmark.getTime(Bookmark.ACCESS)); + SQLiteUtil.bindDate(statement, 3, bookmark.getTime(Bookmark.CREATION)); + SQLiteUtil.bindDate(statement, 4, bookmark.getTime(Bookmark.MODIFICATION)); + SQLiteUtil.bindDate(statement, 5, bookmark.getTime(Bookmark.ACCESS)); statement.bindLong(6, bookmark.getAccessCount()); - bindString(statement, 7, bookmark.ModelId); + SQLiteUtil.bindString(statement, 7, bookmark.ModelId); statement.bindLong(8, bookmark.ParagraphIndex); statement.bindLong(9, bookmark.ElementIndex); statement.bindLong(10, bookmark.CharIndex); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index 58af4ad9a..203e52a80 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -56,7 +56,6 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR final NetworkTree.Key key = (NetworkTree.Key)intent.getSerializableExtra(CATALOG_KEY_KEY); myTree = library.getTreeByKey(key); - System.err.println("KEY = " + key); if (myTree == null) { throw new RuntimeException("Tree not found for key " + key); } diff --git a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java index c9973f4db..901bccdf6 100644 --- a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java +++ b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java @@ -31,6 +31,8 @@ import org.geometerplus.zlibrary.ui.android.library.ZLAndroidApplication; import org.geometerplus.fbreader.network.ICustomNetworkLink; import org.geometerplus.fbreader.network.NetworkDatabase; +import org.geometerplus.android.util.SQLiteUtil; + class SQLiteNetworkDatabase extends NetworkDatabase { private final SQLiteDatabase myDatabase; @@ -69,14 +71,6 @@ class SQLiteNetworkDatabase extends NetworkDatabase { } } - private static void bindString(SQLiteStatement statement, int index, String value) { - if (value != null) { - statement.bindString(index, value); - } else { - statement.bindNull(index); - } - } - @Override protected void loadCustomLinks(ICustomLinksHandler handler) { final Cursor cursor = myDatabase.rawQuery("SELECT link_id,title,site_name,summary,icon FROM CustomLinks", null); @@ -89,7 +83,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { final String icon = cursor.getString(4); linksMap.clear(); - final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url FROM CustomLinkUrls WHERE link_id = " + id, null); + final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url FROM LinkUrls WHERE url NOT NULL AND link_id = " + id, null); while (linksCursor.moveToNext()) { linksMap.put(linksCursor.getString(0), linksCursor.getString(1)); } @@ -129,8 +123,8 @@ class SQLiteNetworkDatabase extends NetworkDatabase { statement.bindString(1, link.getTitle()); statement.bindString(2, link.getSiteName()); - bindString(statement, 3, link.getSummary()); - bindString(statement, 4, link.getIcon()); + SQLiteUtil.bindString(statement, 3, link.getSummary()); + SQLiteUtil.bindString(statement, 4, link.getIcon()); final long id; final HashMap linksMap = new HashMap(); @@ -143,7 +137,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { statement.bindLong(5, id); statement.execute(); - final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url FROM CustomLinkUrls WHERE link_id = " + link.getId(), null); + final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url FROM LinkUrls WHERE url NOT NULL AND link_id = " + link.getId(), null); while (linksCursor.moveToNext()) { linksMap.put(linksCursor.getString(0), linksCursor.getString(1)); } @@ -157,13 +151,13 @@ class SQLiteNetworkDatabase extends NetworkDatabase { if (dbValue == null) { if (myInsertCustomLinkUrlStatement == null) { myInsertCustomLinkUrlStatement = myDatabase.compileStatement( - "INSERT OR REPLACE INTO CustomLinkUrls(url,link_id,key) VALUES (?,?,?)"); + "INSERT OR REPLACE INTO LinkUrls(url,link_id,key) VALUES (?,?,?)"); } urlStatement = myInsertCustomLinkUrlStatement; } else if (!value.equals(dbValue)) { if (myUpdateCustomLinkUrlStatement == null) { myUpdateCustomLinkUrlStatement = myDatabase.compileStatement( - "UPDATE CustomLinkUrls SET url = ? WHERE link_id = ? AND key = ?"); + "UPDATE LinkUrls SET url = ? WHERE link_id = ? AND key = ?"); } urlStatement = myUpdateCustomLinkUrlStatement; } else { @@ -177,7 +171,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { for (String key: linksMap.keySet()) { if (myDeleteCustomLinkUrlStatement == null) { myDeleteCustomLinkUrlStatement = myDatabase.compileStatement( - "DELETE FROM CustomLinkUrls WHERE link_id = ? AND key = ?"); + "DELETE FROM LinkUrls WHERE link_id = ? AND key = ?"); } myDeleteCustomLinkUrlStatement.bindLong(1, id); myDeleteCustomLinkUrlStatement.bindString(2, key); @@ -199,7 +193,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { final long id = link.getId(); if (myDeleteAllCustomLinksStatement == null) { myDeleteAllCustomLinksStatement = myDatabase.compileStatement( - "DELETE FROM CustomLinkUrls WHERE link_id = ?"); + "DELETE FROM LinkUrls WHERE link_id = ?"); } myDeleteAllCustomLinksStatement.bindLong(1, id); myDeleteAllCustomLinksStatement.execute(); @@ -244,5 +238,15 @@ class SQLiteNetworkDatabase extends NetworkDatabase { "icon TEXT)"); myDatabase.execSQL("INSERT INTO CustomLinks (link_id,title,site_name,summary,icon) SELECT link_id,title,site_name,summary,icon FROM CustomLinks_Obsolete"); myDatabase.execSQL("DROP TABLE CustomLinks_Obsolete"); + + myDatabase.execSQL( + "CREATE TABLE LinkUrls(" + + "key TEXT NOT NULL," + + "link_id INTEGER NOT NULL REFERENCES CustomLinks(link_id)," + + "url TEXT," + + "update_time INTEGER," + + "CONSTRAINT LinkUrls_PK PRIMARY KEY (key, link_id))"); + myDatabase.execSQL("INSERT INTO LinkUrls (key,link_id,url) SELECT key,link_id,url FROM CustomLinkUrls"); + myDatabase.execSQL("DROP TABLE CustomLinkUrls"); } } diff --git a/src/org/geometerplus/android/util/SQLiteUtil.java b/src/org/geometerplus/android/util/SQLiteUtil.java new file mode 100644 index 000000000..c4f411e3b --- /dev/null +++ b/src/org/geometerplus/android/util/SQLiteUtil.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2009-2011 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.util; + +import java.util.Date; + +import android.database.sqlite.SQLiteStatement; +import android.database.Cursor; + +public abstract class SQLiteUtil { + public static void bindString(SQLiteStatement statement, int index, String value) { + if (value != null) { + statement.bindString(index, value); + } else { + statement.bindNull(index); + } + } + + public static void bindDate(SQLiteStatement statement, int index, Date value) { + if (value != null) { + statement.bindLong(index, value.getTime()); + } else { + statement.bindNull(index); + } + } + + public static Date getDate(Cursor cursor, int index) { + if (cursor.isNull(index)) { + return null; + } + return new Date(cursor.getLong(index)); + } +} diff --git a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java index e04e69d8c..806e09882 100644 --- a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java +++ b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java @@ -82,6 +82,9 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes if (MIME_APP_ATOM.equals(type) && "next".equals(rel)) { myNextURL = ZLNetworkUtil.url(myBaseURL, link.getHref()); } + if ("search".equals(rel)) { + System.err.println(type + " :: " + link.getHref()); + } } return false; } From dad7b7e8e4ff7ae83358c60703779e87494c94f9 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Thu, 3 Mar 2011 21:11:59 +0000 Subject: [PATCH 52/71] 'updated' field for all INetworkLink urls has been introduced --- .../network/NetworkCatalogActions.java | 2 +- .../network/SQLiteNetworkDatabase.java | 46 ++++++++++++------- .../android/fbreader/network/Util.java | 12 ++--- .../fbreader/network/AbstractNetworkLink.java | 25 +++++----- .../fbreader/network/ICustomNetworkLink.java | 4 +- .../fbreader/network/INetworkLink.java | 7 ++- .../fbreader/network/NetworkDatabase.java | 2 +- .../fbreader/network/NetworkLibrary.java | 4 +- .../fbreader/network/NetworkTree.java | 6 +-- .../litres/LitResAuthenticationManager.java | 8 ++-- .../fbreader/network/opds/OPDSCustomLink.java | 23 ++++------ .../fbreader/network/opds/OPDSLinkReader.java | 12 ++--- .../network/opds/OPDSLinkXMLReader.java | 25 +++++----- .../network/opds/OPDSNetworkLink.java | 10 ++-- 14 files changed, 97 insertions(+), 89 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 9cd0c37ef..485d35241 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -250,7 +250,7 @@ class NetworkCatalogActions extends NetworkTreeActions { { final ICustomNetworkLink link = (ICustomNetworkLink)((NetworkCatalogTree)tree).Item.Link; - final String textUrl = link.getLink(INetworkLink.URL_MAIN); + final String textUrl = link.getUrlInfo(INetworkLink.URL_MAIN).URL; if (textUrl != null) { activity.startActivity( new Intent(activity, AddCustomCatalogActivity.class) diff --git a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java index 901bccdf6..7afa673be 100644 --- a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java +++ b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java @@ -30,6 +30,7 @@ import org.geometerplus.zlibrary.ui.android.library.ZLAndroidApplication; import org.geometerplus.fbreader.network.ICustomNetworkLink; import org.geometerplus.fbreader.network.NetworkDatabase; +import org.geometerplus.fbreader.network.URLInfo; import org.geometerplus.android.util.SQLiteUtil; @@ -74,7 +75,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { @Override protected void loadCustomLinks(ICustomLinksHandler handler) { final Cursor cursor = myDatabase.rawQuery("SELECT link_id,title,site_name,summary,icon FROM CustomLinks", null); - final HashMap linksMap = new HashMap(); + final HashMap linksMap = new HashMap(); while (cursor.moveToNext()) { final int id = cursor.getInt(0); final String title = cursor.getString(1); @@ -83,9 +84,15 @@ class SQLiteNetworkDatabase extends NetworkDatabase { final String icon = cursor.getString(4); linksMap.clear(); - final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url FROM LinkUrls WHERE url NOT NULL AND link_id = " + id, null); + final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE url NOT NULL AND link_id = " + id, null); while (linksCursor.moveToNext()) { - linksMap.put(linksCursor.getString(0), linksCursor.getString(1)); + linksMap.put( + linksCursor.getString(0), + new URLInfo( + linksCursor.getString(1), + SQLiteUtil.getDate(linksCursor, 2) + ) + ); } linksCursor.close(); @@ -127,7 +134,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { SQLiteUtil.bindString(statement, 4, link.getIcon()); final long id; - final HashMap linksMap = new HashMap(); + final HashMap linksMap = new HashMap(); if (statement == myInsertCustomLinkStatement) { id = statement.executeInsert(); @@ -137,35 +144,42 @@ class SQLiteNetworkDatabase extends NetworkDatabase { statement.bindLong(5, id); statement.execute(); - final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url FROM LinkUrls WHERE url NOT NULL AND link_id = " + link.getId(), null); + final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE url NOT NULL AND link_id = " + link.getId(), null); while (linksCursor.moveToNext()) { - linksMap.put(linksCursor.getString(0), linksCursor.getString(1)); + linksMap.put( + linksCursor.getString(0), + new URLInfo( + linksCursor.getString(1), + SQLiteUtil.getDate(linksCursor, 2) + ) + ); } linksCursor.close(); } - for (String key: link.getLinkKeys()) { - final String value = link.getLink(key); - final String dbValue = linksMap.remove(key); + for (String key : link.getUrlKeys()) { + final URLInfo info = link.getUrlInfo(key); + final URLInfo dbInfo = linksMap.remove(key); final SQLiteStatement urlStatement; - if (dbValue == null) { + if (dbInfo == null) { if (myInsertCustomLinkUrlStatement == null) { myInsertCustomLinkUrlStatement = myDatabase.compileStatement( - "INSERT OR REPLACE INTO LinkUrls(url,link_id,key) VALUES (?,?,?)"); + "INSERT OR REPLACE INTO LinkUrls(url,update_time,link_id,key) VALUES (?,?,?,?)"); } urlStatement = myInsertCustomLinkUrlStatement; - } else if (!value.equals(dbValue)) { + } else if (!info.equals(dbInfo)) { if (myUpdateCustomLinkUrlStatement == null) { myUpdateCustomLinkUrlStatement = myDatabase.compileStatement( - "UPDATE LinkUrls SET url = ? WHERE link_id = ? AND key = ?"); + "UPDATE LinkUrls SET url = ?, update_time = ? WHERE link_id = ? AND key = ?"); } urlStatement = myUpdateCustomLinkUrlStatement; } else { continue; } - urlStatement.bindString(1, value); - urlStatement.bindLong(2, id); - urlStatement.bindString(3, key); + SQLiteUtil.bindString(urlStatement, 1, info.URL); + SQLiteUtil.bindDate(urlStatement, 2, info.Updated); + urlStatement.bindLong(3, id); + urlStatement.bindString(4, key); urlStatement.execute(); } for (String key: linksMap.keySet()) { diff --git a/src/org/geometerplus/android/fbreader/network/Util.java b/src/org/geometerplus/android/fbreader/network/Util.java index 20e07c009..bdfe5c80a 100644 --- a/src/org/geometerplus/android/fbreader/network/Util.java +++ b/src/org/geometerplus/android/fbreader/network/Util.java @@ -49,7 +49,7 @@ abstract class Util implements UserRegistrationConstants { return testService( activity, REGISTRATION_ACTION, - link.getLink(INetworkLink.URL_SIGN_UP) + link.getUrlInfo(INetworkLink.URL_SIGN_UP).URL ); } @@ -57,12 +57,12 @@ abstract class Util implements UserRegistrationConstants { try { final Intent intent = new Intent( REGISTRATION_ACTION, - Uri.parse(link.getLink(INetworkLink.URL_SIGN_UP)) + Uri.parse(link.getUrlInfo(INetworkLink.URL_SIGN_UP).URL) ); if (PackageUtil.canBeStarted(activity, intent)) { activity.startActivityForResult(new Intent( REGISTRATION_ACTION, - Uri.parse(link.getLink(INetworkLink.URL_SIGN_UP)) + Uri.parse(link.getUrlInfo(INetworkLink.URL_SIGN_UP).URL) ), USER_REGISTRATION_REQUEST_CODE); } } catch (ActivityNotFoundException e) { @@ -93,7 +93,7 @@ abstract class Util implements UserRegistrationConstants { return testService( activity, SMS_REFILLING_ACTION, - link.getLink(INetworkLink.URL_MAIN) + link.getUrlInfo(INetworkLink.URL_MAIN).URL ); } @@ -101,7 +101,7 @@ abstract class Util implements UserRegistrationConstants { try { final Intent intent = new Intent( SMS_REFILLING_ACTION, - Uri.parse(link.getLink(INetworkLink.URL_MAIN)) + Uri.parse(link.getUrlInfo(INetworkLink.URL_MAIN).URL) ); final NetworkAuthenticationManager mgr = link.authenticationManager(); if (mgr != null) { @@ -117,7 +117,7 @@ abstract class Util implements UserRegistrationConstants { } static boolean isBrowserAccountRefillingSupported(Activity activity, INetworkLink link) { - return link.getLink(INetworkLink.URL_REFILL_ACCOUNT) != null; + return link.getUrlInfo(INetworkLink.URL_REFILL_ACCOUNT).URL != null; } static void openInBrowser(Context context, String url) { diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index 6fa1c681c..0affdbc14 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -19,9 +19,7 @@ package org.geometerplus.fbreader.network; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; +import java.util.*; import org.geometerplus.zlibrary.core.util.ZLMiscUtil; @@ -31,7 +29,7 @@ public abstract class AbstractNetworkLink implements INetworkLink { protected String mySummary; protected String myIcon; protected final String myLanguage; - protected final TreeMap myLinks; + protected final TreeMap myInfos; /** * Creates new NetworkLink instance. @@ -41,15 +39,15 @@ public abstract class AbstractNetworkLink implements INetworkLink { * @param summary description of the corresponding library item. Can be null. * @param icon string contains link's icon data/url. Can be null. * @param language language of the catalog. If null we assume this catalog is multilanguage. - * @param links map contains URLs with their identifiers; must always contain one URL with URL_MAIN identifier + * @param infos map contains URL infos with their identifiers; must always contain one URL with URL_MAIN identifier */ - public AbstractNetworkLink(String siteName, String title, String summary, String icon, String language, Map links) { + public AbstractNetworkLink(String siteName, String title, String summary, String icon, String language, Map infos) { mySiteName = siteName; myTitle = title; mySummary = summary; myIcon = icon; myLanguage = language != null ? language : "multi"; - myLinks = new TreeMap(links); + myInfos = new TreeMap(infos); } public final String getSiteName() { @@ -72,12 +70,13 @@ public abstract class AbstractNetworkLink implements INetworkLink { return myLanguage; } - public final String getLink(String urlKey) { - return myLinks.get(urlKey); + public final URLInfo getUrlInfo(String urlKey) { + final URLInfo info = myInfos.get(urlKey); + return info != null ? info : URLInfo.NULL; } - public final Set getLinkKeys() { - return myLinks.keySet(); + public final Set getUrlKeys() { + return myInfos.keySet(); } public NetworkOperationData createOperationData(NetworkOperationData.OnNewItemListener listener) { @@ -96,7 +95,7 @@ public abstract class AbstractNetworkLink implements INetworkLink { + "; title=" + myTitle + "; summary=" + mySummary + "; icon=" + icon - + "; links=" + myLinks + + "; infos=" + myInfos + "}"; } @@ -114,7 +113,7 @@ public abstract class AbstractNetworkLink implements INetworkLink { || !myTitle.equals(lnk.myTitle) || !ZLMiscUtil.equals(mySummary, lnk.mySummary) || !ZLMiscUtil.equals(myIcon, lnk.myIcon) - || !ZLMiscUtil.mapsEquals(myLinks, lnk.myLinks)) { + || !ZLMiscUtil.mapsEquals(myInfos, lnk.myInfos)) { return false; } return true; diff --git a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java index 7bd1e623e..a33a74f0d 100644 --- a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java @@ -32,8 +32,8 @@ public interface ICustomNetworkLink extends INetworkLink { void setSummary(String summary); void setIcon(String icon); - void setLink(String urlKey, String url); - void removeLink(String urlKey); + void setUrl(String urlKey, String url); + void removeUrl(String urlKey); void reloadInfo() throws ZLNetworkException; diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index 820f01385..5244bb3ed 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -28,7 +28,6 @@ import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationMan public interface INetworkLink { - String URL_MAIN = "main"; String URL_SEARCH = "search"; String URL_SIGN_IN = "signIn"; @@ -41,15 +40,15 @@ public interface INetworkLink { String getTitle(); String getSummary(); String getIcon(); - String getLink(String urlKey); + + URLInfo getUrlInfo(String urlKey); + Set getUrlKeys(); /** * @return 2-letters language code or special token "multi" */ String getLanguage(); - Set getLinkKeys(); - /** * @param listener Network operation listener * @return instance, which represents the state of the network operation. diff --git a/src/org/geometerplus/fbreader/network/NetworkDatabase.java b/src/org/geometerplus/fbreader/network/NetworkDatabase.java index 3961a3529..ee32bc303 100644 --- a/src/org/geometerplus/fbreader/network/NetworkDatabase.java +++ b/src/org/geometerplus/fbreader/network/NetworkDatabase.java @@ -35,7 +35,7 @@ public abstract class NetworkDatabase { protected abstract void executeAsATransaction(Runnable actions); public interface ICustomLinksHandler { - void handleCustomLinkData(int id, String siteName, String title, String summary, String icon, Map links); + void handleCustomLinkData(int id, String siteName, String title, String summary, String icon, Map infos); } protected abstract void loadCustomLinks(ICustomLinksHandler handler); diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 51f790cb5..30f8a7655 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -179,8 +179,8 @@ public class NetworkLibrary { db.loadCustomLinks( new NetworkDatabase.ICustomLinksHandler() { public void handleCustomLinkData(int id, String siteName, - String title, String summary, String icon, Map links) { - final ICustomNetworkLink link = OPDSLinkReader.createCustomLink(id, siteName, title, summary, icon, links); + String title, String summary, String icon, Map infos) { + final ICustomNetworkLink link = OPDSLinkReader.createCustomLink(id, siteName, title, summary, icon, infos); if (link != null) { addLinkInternal(link); } diff --git a/src/org/geometerplus/fbreader/network/NetworkTree.java b/src/org/geometerplus/fbreader/network/NetworkTree.java index cb13a446f..9fd176885 100644 --- a/src/org/geometerplus/fbreader/network/NetworkTree.java +++ b/src/org/geometerplus/fbreader/network/NetworkTree.java @@ -25,6 +25,7 @@ import java.io.Serializable; import org.geometerplus.zlibrary.core.constants.MimeTypes; import org.geometerplus.zlibrary.core.image.ZLImage; +import org.geometerplus.zlibrary.core.util.ZLMiscUtil; import org.geometerplus.fbreader.tree.FBTree; @@ -50,10 +51,7 @@ public abstract class NetworkTree extends FBTree { return false; } final NetworkTree.Key key = (NetworkTree.Key)other; - if (Parent == null) { - return key.Parent == null && Id.equals(key.Id); - } - return Id.equals(key.Id) && Parent.equals(key.Parent); + return Id.equals(key.Id) && ZLMiscUtil.equals(Parent, key.Parent); } @Override diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java index 10a5994ba..5d54c2efe 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java @@ -89,7 +89,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { sid = mySidOption.getValue(); } - String url = Link.getLink(INetworkLink.URL_SIGN_IN); + String url = Link.getUrlInfo(INetworkLink.URL_SIGN_IN).URL; if (url == null) { throw new ZLNetworkException(NetworkException.ERROR_UNSUPPORTED_OPERATION); } @@ -119,7 +119,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { @Override public void authorise(String password) throws ZLNetworkException { - String url = Link.getLink(INetworkLink.URL_SIGN_IN); + String url = Link.getUrlInfo(INetworkLink.URL_SIGN_IN).URL; if (url == null) { throw new ZLNetworkException(NetworkException.ERROR_UNSUPPORTED_OPERATION); } @@ -241,7 +241,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { if (sid.length() == 0) { return null; } - final String url = Link.getLink(INetworkLink.URL_REFILL_ACCOUNT); + final String url = Link.getUrlInfo(INetworkLink.URL_REFILL_ACCOUNT).URL; if (url == null) { return null; } @@ -401,7 +401,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { @Override public void recoverPassword(String email) throws ZLNetworkException { - String url = Link.getLink(INetworkLink.URL_RECOVER_PASSWORD); + String url = Link.getUrlInfo(INetworkLink.URL_RECOVER_PASSWORD).URL; if (url == null) { throw new ZLNetworkException(NetworkException.ERROR_UNSUPPORTED_OPERATION); } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java index 3fbe25a3b..45ba04dce 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java @@ -32,14 +32,15 @@ import org.geometerplus.zlibrary.core.util.ZLMiscUtil; import org.geometerplus.fbreader.network.ICustomNetworkLink; import org.geometerplus.fbreader.network.INetworkLink; import org.geometerplus.fbreader.network.NetworkException; +import org.geometerplus.fbreader.network.URLInfo; class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { private int myId; private boolean myHasChanges; - OPDSCustomLink(int id, String siteName, String title, String summary, String icon, Map links) { - super(siteName, title, summary, icon, null, links, false); + OPDSCustomLink(int id, String siteName, String title, String summary, String icon, Map infos) { + super(siteName, title, summary, icon, null, infos, false); myId = id; } @@ -80,17 +81,13 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { myTitle = title; } - public final void setLink(String urlKey, String url) { - if (url == null) { - removeLink(urlKey); - } else { - final String oldUrl = myLinks.put(urlKey, url); - myHasChanges = myHasChanges || !url.equals(oldUrl); - } + public final void setUrl(String urlKey, String url) { + myInfos.put(urlKey, new URLInfo(url, new Date())); + myHasChanges = true; } - public final void removeLink(String urlKey) { - final String oldUrl = myLinks.remove(urlKey); + public final void removeUrl(String urlKey) { + final URLInfo oldUrl = myInfos.remove(urlKey); myHasChanges = myHasChanges || oldUrl != null; } @@ -101,7 +98,7 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { ZLNetworkException error = null; try { - ZLNetworkManager.Instance().perform(new ZLNetworkRequest(getLink(INetworkLink.URL_MAIN)) { + ZLNetworkManager.Instance().perform(new ZLNetworkRequest(getUrlInfo(INetworkLink.URL_MAIN).URL) { @Override public void handleStream(URLConnection connection, InputStream inputStream) throws IOException, ZLNetworkException { final CatalogInfoReader info = new CatalogInfoReader(URL, OPDSCustomLink.this, opensearchDescriptionURLs); @@ -151,7 +148,7 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { if (!descriptions.isEmpty()) { // TODO: May be do not use '%s'??? Use Description instead??? (this needs to rewrite SEARCH engine logic a little) - setLink(URL_SEARCH, descriptions.get(0).makeQuery("%s")); + setUrl(URL_SEARCH, descriptions.get(0).makeQuery("%s")); } if (error != null) { throw error; diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java index 3c9a786ec..ec93dd579 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java @@ -39,17 +39,17 @@ import org.geometerplus.fbreader.network.atom.ATOMUpdated; public class OPDSLinkReader { static final String CATALOGS_URL = "http://data.fbreader.org/catalogs/generic-1.2.xml"; - public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, Map links) { - if (siteName == null || title == null || links.get(INetworkLink.URL_MAIN) == null) { + public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, Map infos) { + if (siteName == null || title == null || infos.get(INetworkLink.URL_MAIN) == null) { return null; } - return new OPDSCustomLink(id, siteName, title, summary, icon, links); + return new OPDSCustomLink(id, siteName, title, summary, icon, infos); } public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, String url) { - final HashMap links = new HashMap(); - links.put(INetworkLink.URL_MAIN, url); - return new OPDSCustomLink(id, siteName, title, summary, icon, links); + final HashMap infos = new HashMap(); + infos.put(INetworkLink.URL_MAIN, new URLInfo(url)); + return new OPDSCustomLink(id, siteName, title, summary, icon, infos); } public static ICustomNetworkLink createCustomLink(String siteName, String title, String summary, String icon, String url) { diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java index 418507651..18d94161b 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java @@ -30,6 +30,7 @@ import org.geometerplus.zlibrary.core.xml.ZLStringMap; import org.geometerplus.fbreader.network.INetworkLink; import org.geometerplus.fbreader.network.NetworkLibrary; import org.geometerplus.fbreader.network.NetworkCatalogItem; +import org.geometerplus.fbreader.network.URLInfo; import org.geometerplus.fbreader.network.atom.ATOMLink; import org.geometerplus.fbreader.network.atom.ATOMUpdated; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; @@ -99,7 +100,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType final String language = entry.DCLanguage; String icon = null; - final HashMap links = new HashMap(); + final HashMap infos = new HashMap(); final HashMap urlConditions = new HashMap(); for (ATOMLink link: entry.Links) { @@ -116,26 +117,26 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType } } else if (rel == null) { if (type == MIME_APP_ATOM) { - links.put(INetworkLink.URL_MAIN, href); + infos.put(INetworkLink.URL_MAIN, new URLInfo(href)); } } else if (rel == "search") { if (type == MIME_APP_ATOM) { final OpenSearchDescription descr = OpenSearchDescription.createDefault(href); if (descr.isValid()) { // TODO: May be do not use '%s'??? Use Description instead??? (this needs to rewrite SEARCH engine logic a little) - links.put(INetworkLink.URL_SEARCH, descr.makeQuery("%s")); + infos.put(INetworkLink.URL_SEARCH, new URLInfo(descr.makeQuery("%s"))); } } } else if (rel == REL_LINK_SIGN_IN) { - links.put(INetworkLink.URL_SIGN_IN, href); + infos.put(INetworkLink.URL_SIGN_IN, new URLInfo(href)); } else if (rel == REL_LINK_SIGN_OUT) { - links.put(INetworkLink.URL_SIGN_OUT, href); + infos.put(INetworkLink.URL_SIGN_OUT, new URLInfo(href)); } else if (rel == REL_LINK_SIGN_UP) { - links.put(INetworkLink.URL_SIGN_UP, href); + infos.put(INetworkLink.URL_SIGN_UP, new URLInfo(href)); } else if (rel == REL_LINK_REFILL_ACCOUNT) { - links.put(INetworkLink.URL_REFILL_ACCOUNT, href); + infos.put(INetworkLink.URL_REFILL_ACCOUNT, new URLInfo(href)); } else if (rel == REL_LINK_RECOVER_PASSWORD) { - links.put(INetworkLink.URL_RECOVER_PASSWORD, href); + infos.put(INetworkLink.URL_RECOVER_PASSWORD, new URLInfo(href)); } else if (rel == REL_CONDITION_NEVER) { urlConditions.put(href, NetworkCatalogItem.Accessibility.NEVER); } else if (rel == REL_CONDITION_SIGNED_IN) { @@ -153,7 +154,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType sslCertificate = null; } - INetworkLink result = link(siteName, title, summary, icon, language, links, urlConditions, sslCertificate); + INetworkLink result = link(siteName, title, summary, icon, language, infos, urlConditions, sslCertificate); if (result != null) { myListener.onNewLink(result); } @@ -166,11 +167,11 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType String summary, String icon, String language, - Map links, + Map infos, HashMap urlConditions, String sslCertificate ) { - if (siteName == null || title == null || links.get(INetworkLink.URL_MAIN) == null) { + if (siteName == null || title == null || infos.get(INetworkLink.URL_MAIN) == null) { return null; } @@ -180,7 +181,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType summary, icon, language, - links, + infos, myHasStableIdentifiers ); diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index 4b0ce9e29..86dc08a35 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -49,8 +49,8 @@ public class OPDSNetworkLink extends AbstractNetworkLink { private final boolean myHasStableIdentifiers; OPDSNetworkLink(String siteName, String title, String summary, String icon, String language, - Map links, boolean hasStableIdentifiers) { - super(siteName, title, summary, icon, language, links); + Map infos, boolean hasStableIdentifiers) { + super(siteName, title, summary, icon, language, infos); myHasStableIdentifiers = hasStableIdentifiers; myBooksInBasketOption = new ZLStringListOption(siteName, "Basket", null); } @@ -123,7 +123,7 @@ public class OPDSNetworkLink extends AbstractNetworkLink { } public ZLNetworkRequest simpleSearchRequest(String pattern, NetworkOperationData data) { - final String url = getLink(URL_SEARCH); + final String url = getUrlInfo(URL_SEARCH).URL; if (url == null) { return null; } @@ -139,8 +139,8 @@ public class OPDSNetworkLink extends AbstractNetworkLink { } public NetworkCatalogItem libraryItem() { - TreeMap urlMap = new TreeMap(); - urlMap.put(NetworkCatalogItem.URL_CATALOG, getLink(URL_MAIN)); + TreeMap urlMap = new TreeMap(); + urlMap.put(NetworkCatalogItem.URL_CATALOG, getUrlInfo(URL_MAIN).URL); return new OPDSCatalogItem(this, getTitle(), getSummary(), getIcon(), urlMap, myExtraData); } From c33068229c4e8bd9e0c4b958d63968b2058cde39 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 4 Mar 2011 11:30:49 +0000 Subject: [PATCH 53/71] opensearch description processing has been simplified --- .../fbreader/network/NetworkLibraryActivity.java | 1 + .../network/opds/NetworkOPDSFeedReader.java | 3 --- .../fbreader/network/opds/OPDSCustomLink.java | 3 ++- .../network/opds/OpenSearchDescription.java | 16 ++++------------ .../network/opds/OpenSearchXMLReader.java | 7 ++----- 5 files changed, 9 insertions(+), 21 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index 4dc5cfe1c..f80e34d2e 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -51,6 +51,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { final static String ADD_CATALOG_SUMMARY_KEY = "summary"; final static String ADD_CATALOG_ICON_KEY = "icon"; final static String ADD_CATALOG_ID_KEY = "id"; + final static String ADD_CATALOG_URLS_BUNDLE_KEY = "urls"; private NetworkTree myTree; private volatile Intent myIntent; diff --git a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java index 806e09882..e04e69d8c 100644 --- a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java +++ b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java @@ -82,9 +82,6 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes if (MIME_APP_ATOM.equals(type) && "next".equals(rel)) { myNextURL = ZLNetworkUtil.url(myBaseURL, link.getHref()); } - if ("search".equals(rel)) { - System.err.println(type + " :: " + link.getHref()); - } } return false; } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java index 45ba04dce..9539312d3 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java @@ -133,7 +133,7 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { requests.add(new ZLNetworkRequest(url) { @Override public void handleStream(URLConnection connection, InputStream inputStream) throws IOException, ZLNetworkException { - new OpenSearchXMLReader(URL, descriptions, 20).read(inputStream); + new OpenSearchXMLReader(URL, descriptions).read(inputStream); } }); } @@ -149,6 +149,7 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { if (!descriptions.isEmpty()) { // TODO: May be do not use '%s'??? Use Description instead??? (this needs to rewrite SEARCH engine logic a little) setUrl(URL_SEARCH, descriptions.get(0).makeQuery("%s")); + System.err.println(descriptions.get(0).makeQuery("%s")); } if (error != null) { throw error; diff --git a/src/org/geometerplus/fbreader/network/opds/OpenSearchDescription.java b/src/org/geometerplus/fbreader/network/opds/OpenSearchDescription.java index d878f20f0..5dbd8de08 100644 --- a/src/org/geometerplus/fbreader/network/opds/OpenSearchDescription.java +++ b/src/org/geometerplus/fbreader/network/opds/OpenSearchDescription.java @@ -23,22 +23,20 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; class OpenSearchDescription { - public static OpenSearchDescription createDefault(String template) { - return new OpenSearchDescription(template, 20, -1, -1); + return new OpenSearchDescription(template, -1, -1); } public final String Template; public final int IndexOffset; public final int PageOffset; - public final int ItemsPerPage; + public final int ItemsPerPage = 20; - public OpenSearchDescription(String template, int itemsPerPage, int indexOffset, int pageOffset) { + OpenSearchDescription(String template, int indexOffset, int pageOffset) { Template = template; IndexOffset = indexOffset; PageOffset = pageOffset; - ItemsPerPage = itemsPerPage; } public boolean isValid() { @@ -62,13 +60,7 @@ class OpenSearchDescription { if (name == "searchTerms") { m.appendReplacement(query, searchTerms); } else if (name == "count") { - if (ItemsPerPage > 0) { - m.appendReplacement(query, String.valueOf(ItemsPerPage)); - } else if (optional) { - m.appendReplacement(query, ""); - } else { - return null; - } + m.appendReplacement(query, String.valueOf(ItemsPerPage)); } else if (optional) { m.appendReplacement(query, ""); } else if (name == "startIndex") { diff --git a/src/org/geometerplus/fbreader/network/opds/OpenSearchXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OpenSearchXMLReader.java index fe03b6c76..db5d65a7f 100644 --- a/src/org/geometerplus/fbreader/network/opds/OpenSearchXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OpenSearchXMLReader.java @@ -30,15 +30,12 @@ import org.geometerplus.zlibrary.core.xml.ZLStringMap; import org.geometerplus.zlibrary.core.xml.ZLXMLReaderAdapter; class OpenSearchXMLReader extends ZLXMLReaderAdapter { - private final List myDescriptions; - private final int myItemsPerPage; private final String myBaseURL; - public OpenSearchXMLReader(String baseUrl, List descriptions, int itemsPerPage) { + public OpenSearchXMLReader(String baseUrl, List descriptions) { myDescriptions = descriptions; - myItemsPerPage = itemsPerPage; myBaseURL = baseUrl; } @@ -115,7 +112,7 @@ class OpenSearchXMLReader extends ZLXMLReaderAdapter { final int indexOffset = parseInt(attributes.getValue("indexOffset")); final int pageOffset = parseInt(attributes.getValue("pageOffset")); final OpenSearchDescription descr = - new OpenSearchDescription(template, myItemsPerPage, indexOffset, pageOffset); + new OpenSearchDescription(template, indexOffset, pageOffset); if (descr.isValid()) { myDescriptions.add(descr); } From 401b38d7465ae665e18ef2cfb28e978581e33e0b Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 4 Mar 2011 13:10:15 +0000 Subject: [PATCH 54/71] cleanup --- src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java index 9539312d3..c5cd5a94a 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java @@ -60,7 +60,6 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { myHasChanges = false; } - public final void setIcon(String icon) { myHasChanges = myHasChanges || !ZLMiscUtil.equals(myIcon, icon); myIcon = icon; From 16fd2dd17efb026cc03ce0442e7b430d23fc1fe6 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 4 Mar 2011 16:04:58 +0000 Subject: [PATCH 55/71] URLInfo -> UrlInfo --- .../network/SQLiteNetworkDatabase.java | 14 ++--- .../fbreader/network/AbstractNetworkLink.java | 16 +++-- .../fbreader/network/INetworkLink.java | 6 +- .../fbreader/network/NetworkDatabase.java | 2 +- .../fbreader/network/NetworkLibrary.java | 2 +- .../fbreader/network/UrlInfo.java | 59 +++++++++++++++++++ .../fbreader/network/opds/OPDSCustomLink.java | 8 +-- .../fbreader/network/opds/OPDSLinkReader.java | 6 +- .../network/opds/OPDSLinkXMLReader.java | 20 +++---- .../network/opds/OPDSNetworkLink.java | 2 +- .../zlibrary/core/util/ZLMiscUtil.java | 4 ++ 11 files changed, 103 insertions(+), 36 deletions(-) create mode 100644 src/org/geometerplus/fbreader/network/UrlInfo.java diff --git a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java index 7afa673be..f9294616d 100644 --- a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java +++ b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java @@ -30,7 +30,7 @@ import org.geometerplus.zlibrary.ui.android.library.ZLAndroidApplication; import org.geometerplus.fbreader.network.ICustomNetworkLink; import org.geometerplus.fbreader.network.NetworkDatabase; -import org.geometerplus.fbreader.network.URLInfo; +import org.geometerplus.fbreader.network.UrlInfo; import org.geometerplus.android.util.SQLiteUtil; @@ -75,7 +75,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { @Override protected void loadCustomLinks(ICustomLinksHandler handler) { final Cursor cursor = myDatabase.rawQuery("SELECT link_id,title,site_name,summary,icon FROM CustomLinks", null); - final HashMap linksMap = new HashMap(); + final HashMap linksMap = new HashMap(); while (cursor.moveToNext()) { final int id = cursor.getInt(0); final String title = cursor.getString(1); @@ -88,7 +88,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { while (linksCursor.moveToNext()) { linksMap.put( linksCursor.getString(0), - new URLInfo( + new UrlInfo( linksCursor.getString(1), SQLiteUtil.getDate(linksCursor, 2) ) @@ -134,7 +134,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { SQLiteUtil.bindString(statement, 4, link.getIcon()); final long id; - final HashMap linksMap = new HashMap(); + final HashMap linksMap = new HashMap(); if (statement == myInsertCustomLinkStatement) { id = statement.executeInsert(); @@ -148,7 +148,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { while (linksCursor.moveToNext()) { linksMap.put( linksCursor.getString(0), - new URLInfo( + new UrlInfo( linksCursor.getString(1), SQLiteUtil.getDate(linksCursor, 2) ) @@ -158,8 +158,8 @@ class SQLiteNetworkDatabase extends NetworkDatabase { } for (String key : link.getUrlKeys()) { - final URLInfo info = link.getUrlInfo(key); - final URLInfo dbInfo = linksMap.remove(key); + final UrlInfo info = link.getUrlInfo(key); + final UrlInfo dbInfo = linksMap.remove(key); final SQLiteStatement urlStatement; if (dbInfo == null) { if (myInsertCustomLinkUrlStatement == null) { diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index 0affdbc14..9ac1fe186 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -29,7 +29,7 @@ public abstract class AbstractNetworkLink implements INetworkLink { protected String mySummary; protected String myIcon; protected final String myLanguage; - protected final TreeMap myInfos; + protected final TreeMap myInfos; /** * Creates new NetworkLink instance. @@ -41,13 +41,13 @@ public abstract class AbstractNetworkLink implements INetworkLink { * @param language language of the catalog. If null we assume this catalog is multilanguage. * @param infos map contains URL infos with their identifiers; must always contain one URL with URL_MAIN identifier */ - public AbstractNetworkLink(String siteName, String title, String summary, String icon, String language, Map infos) { + public AbstractNetworkLink(String siteName, String title, String summary, String icon, String language, Map infos) { mySiteName = siteName; myTitle = title; mySummary = summary; myIcon = icon; myLanguage = language != null ? language : "multi"; - myInfos = new TreeMap(infos); + myInfos = new TreeMap(infos); } public final String getSiteName() { @@ -70,9 +70,13 @@ public abstract class AbstractNetworkLink implements INetworkLink { return myLanguage; } - public final URLInfo getUrlInfo(String urlKey) { - final URLInfo info = myInfos.get(urlKey); - return info != null ? info : URLInfo.NULL; + public final HashMap urlInfoMap() { + return new HashMap(myInfos); + } + + public final UrlInfo getUrlInfo(String urlKey) { + final UrlInfo info = myInfos.get(urlKey); + return info != null ? info : UrlInfo.NULL; } public final Set getUrlKeys() { diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index 5244bb3ed..84149b020 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -19,8 +19,7 @@ package org.geometerplus.fbreader.network; -import java.util.List; -import java.util.Set; +import java.util.*; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; @@ -41,7 +40,8 @@ public interface INetworkLink { String getSummary(); String getIcon(); - URLInfo getUrlInfo(String urlKey); + HashMap urlInfoMap(); + UrlInfo getUrlInfo(String urlKey); Set getUrlKeys(); /** diff --git a/src/org/geometerplus/fbreader/network/NetworkDatabase.java b/src/org/geometerplus/fbreader/network/NetworkDatabase.java index ee32bc303..dba07628d 100644 --- a/src/org/geometerplus/fbreader/network/NetworkDatabase.java +++ b/src/org/geometerplus/fbreader/network/NetworkDatabase.java @@ -35,7 +35,7 @@ public abstract class NetworkDatabase { protected abstract void executeAsATransaction(Runnable actions); public interface ICustomLinksHandler { - void handleCustomLinkData(int id, String siteName, String title, String summary, String icon, Map infos); + void handleCustomLinkData(int id, String siteName, String title, String summary, String icon, Map infos); } protected abstract void loadCustomLinks(ICustomLinksHandler handler); diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 30f8a7655..c40dc812d 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -179,7 +179,7 @@ public class NetworkLibrary { db.loadCustomLinks( new NetworkDatabase.ICustomLinksHandler() { public void handleCustomLinkData(int id, String siteName, - String title, String summary, String icon, Map infos) { + String title, String summary, String icon, Map infos) { final ICustomNetworkLink link = OPDSLinkReader.createCustomLink(id, siteName, title, summary, icon, infos); if (link != null) { addLinkInternal(link); diff --git a/src/org/geometerplus/fbreader/network/UrlInfo.java b/src/org/geometerplus/fbreader/network/UrlInfo.java new file mode 100644 index 000000000..3ee954304 --- /dev/null +++ b/src/org/geometerplus/fbreader/network/UrlInfo.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2010-2011 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.fbreader.network; + +import java.util.Date; +import java.io.Serializable; + +import org.geometerplus.zlibrary.core.util.ZLMiscUtil; + +public final class UrlInfo implements Serializable { + public static final UrlInfo NULL = new UrlInfo(null, null); + + public final String URL; + public final Date Updated; + + public UrlInfo(String url, Date updated) { + URL = url; + Updated = updated; + } + + public UrlInfo(String url) { + this(url, new Date()); + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof UrlInfo)) { + return false; + } + + final UrlInfo info = (UrlInfo)o; + return ZLMiscUtil.equals(URL, info.URL) && ZLMiscUtil.equals(Updated, info.Updated); + } + + @Override + public int hashCode() { + return ZLMiscUtil.hashCode(URL) + ZLMiscUtil.hashCode(Updated); + } +} diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java index c5cd5a94a..1399578f0 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java @@ -32,14 +32,14 @@ import org.geometerplus.zlibrary.core.util.ZLMiscUtil; import org.geometerplus.fbreader.network.ICustomNetworkLink; import org.geometerplus.fbreader.network.INetworkLink; import org.geometerplus.fbreader.network.NetworkException; -import org.geometerplus.fbreader.network.URLInfo; +import org.geometerplus.fbreader.network.UrlInfo; class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { private int myId; private boolean myHasChanges; - OPDSCustomLink(int id, String siteName, String title, String summary, String icon, Map infos) { + OPDSCustomLink(int id, String siteName, String title, String summary, String icon, Map infos) { super(siteName, title, summary, icon, null, infos, false); myId = id; } @@ -81,12 +81,12 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { } public final void setUrl(String urlKey, String url) { - myInfos.put(urlKey, new URLInfo(url, new Date())); + myInfos.put(urlKey, new UrlInfo(url, new Date())); myHasChanges = true; } public final void removeUrl(String urlKey) { - final URLInfo oldUrl = myInfos.remove(urlKey); + final UrlInfo oldUrl = myInfos.remove(urlKey); myHasChanges = myHasChanges || oldUrl != null; } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java index ec93dd579..e8d427e34 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java @@ -39,7 +39,7 @@ import org.geometerplus.fbreader.network.atom.ATOMUpdated; public class OPDSLinkReader { static final String CATALOGS_URL = "http://data.fbreader.org/catalogs/generic-1.2.xml"; - public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, Map infos) { + public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, Map infos) { if (siteName == null || title == null || infos.get(INetworkLink.URL_MAIN) == null) { return null; } @@ -47,8 +47,8 @@ public class OPDSLinkReader { } public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, String url) { - final HashMap infos = new HashMap(); - infos.put(INetworkLink.URL_MAIN, new URLInfo(url)); + final HashMap infos = new HashMap(); + infos.put(INetworkLink.URL_MAIN, new UrlInfo(url)); return new OPDSCustomLink(id, siteName, title, summary, icon, infos); } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java index 18d94161b..6b61d7b05 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java @@ -30,7 +30,7 @@ import org.geometerplus.zlibrary.core.xml.ZLStringMap; import org.geometerplus.fbreader.network.INetworkLink; import org.geometerplus.fbreader.network.NetworkLibrary; import org.geometerplus.fbreader.network.NetworkCatalogItem; -import org.geometerplus.fbreader.network.URLInfo; +import org.geometerplus.fbreader.network.UrlInfo; import org.geometerplus.fbreader.network.atom.ATOMLink; import org.geometerplus.fbreader.network.atom.ATOMUpdated; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; @@ -100,7 +100,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType final String language = entry.DCLanguage; String icon = null; - final HashMap infos = new HashMap(); + final HashMap infos = new HashMap(); final HashMap urlConditions = new HashMap(); for (ATOMLink link: entry.Links) { @@ -117,26 +117,26 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType } } else if (rel == null) { if (type == MIME_APP_ATOM) { - infos.put(INetworkLink.URL_MAIN, new URLInfo(href)); + infos.put(INetworkLink.URL_MAIN, new UrlInfo(href)); } } else if (rel == "search") { if (type == MIME_APP_ATOM) { final OpenSearchDescription descr = OpenSearchDescription.createDefault(href); if (descr.isValid()) { // TODO: May be do not use '%s'??? Use Description instead??? (this needs to rewrite SEARCH engine logic a little) - infos.put(INetworkLink.URL_SEARCH, new URLInfo(descr.makeQuery("%s"))); + infos.put(INetworkLink.URL_SEARCH, new UrlInfo(descr.makeQuery("%s"))); } } } else if (rel == REL_LINK_SIGN_IN) { - infos.put(INetworkLink.URL_SIGN_IN, new URLInfo(href)); + infos.put(INetworkLink.URL_SIGN_IN, new UrlInfo(href)); } else if (rel == REL_LINK_SIGN_OUT) { - infos.put(INetworkLink.URL_SIGN_OUT, new URLInfo(href)); + infos.put(INetworkLink.URL_SIGN_OUT, new UrlInfo(href)); } else if (rel == REL_LINK_SIGN_UP) { - infos.put(INetworkLink.URL_SIGN_UP, new URLInfo(href)); + infos.put(INetworkLink.URL_SIGN_UP, new UrlInfo(href)); } else if (rel == REL_LINK_REFILL_ACCOUNT) { - infos.put(INetworkLink.URL_REFILL_ACCOUNT, new URLInfo(href)); + infos.put(INetworkLink.URL_REFILL_ACCOUNT, new UrlInfo(href)); } else if (rel == REL_LINK_RECOVER_PASSWORD) { - infos.put(INetworkLink.URL_RECOVER_PASSWORD, new URLInfo(href)); + infos.put(INetworkLink.URL_RECOVER_PASSWORD, new UrlInfo(href)); } else if (rel == REL_CONDITION_NEVER) { urlConditions.put(href, NetworkCatalogItem.Accessibility.NEVER); } else if (rel == REL_CONDITION_SIGNED_IN) { @@ -167,7 +167,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType String summary, String icon, String language, - Map infos, + Map infos, HashMap urlConditions, String sslCertificate ) { diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index 86dc08a35..ca6c1daa5 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -49,7 +49,7 @@ public class OPDSNetworkLink extends AbstractNetworkLink { private final boolean myHasStableIdentifiers; OPDSNetworkLink(String siteName, String title, String summary, String icon, String language, - Map infos, boolean hasStableIdentifiers) { + Map infos, boolean hasStableIdentifiers) { super(siteName, title, summary, icon, language, infos); myHasStableIdentifiers = hasStableIdentifiers; myBooksInBasketOption = new ZLStringListOption(siteName, "Basket", null); diff --git a/src/org/geometerplus/zlibrary/core/util/ZLMiscUtil.java b/src/org/geometerplus/zlibrary/core/util/ZLMiscUtil.java index 7ca090cb0..082c60f7e 100644 --- a/src/org/geometerplus/zlibrary/core/util/ZLMiscUtil.java +++ b/src/org/geometerplus/zlibrary/core/util/ZLMiscUtil.java @@ -27,6 +27,10 @@ public abstract class ZLMiscUtil { return (o0 == null) ? (o1 == null) : o0.equals(o1); } + public static int hashCode(Object o) { + return o != null ? o.hashCode() : 0; + } + public static boolean listsEquals(List list1, List list2) { if (list1 == null) { return list2 == null || list2.isEmpty(); From ad05ea1664f0e52d4e32e624d4b1edec7cd028f6 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 4 Mar 2011 17:37:29 +0000 Subject: [PATCH 56/71] fixed custom catalog search --- .../network/AddCustomCatalogActivity.java | 74 +++++++++---------- .../network/NetworkCatalogActions.java | 19 ++--- .../network/NetworkLibraryActivity.java | 58 +++++++++------ .../fbreader/network/AbstractNetworkLink.java | 8 +- .../fbreader/network/ICustomNetworkLink.java | 3 + .../fbreader/network/INetworkLink.java | 1 - .../fbreader/network/NetworkLibrary.java | 8 +- .../fbreader/network/opds/OPDSLinkReader.java | 13 ---- .../network/opds/OPDSNetworkLink.java | 1 + 9 files changed, 90 insertions(+), 95 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java index 56c4b13fd..4781d517c 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java @@ -19,6 +19,8 @@ package org.geometerplus.android.fbreader.network; +import java.util.HashMap; + import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; @@ -35,15 +37,14 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.ui.android.R; -import org.geometerplus.fbreader.network.ICustomNetworkLink; +import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.opds.OPDSLinkReader; import org.geometerplus.android.util.UIUtil; public class AddCustomCatalogActivity extends Activity { private ZLResource myResource; - private Integer myCatalogId; - private String myIcon; + private volatile ICustomNetworkLink myLink; @Override public void onCreate(Bundle icicle) { @@ -83,21 +84,16 @@ public class AddCustomCatalogActivity extends Activity { ); final Intent intent = getIntent(); + myLink = NetworkLibraryActivity.getLinkFromIntent(intent); final Uri uri = intent.getData(); - myCatalogId = ICustomNetworkLink.INVALID_ID; - if (uri != null) { - myCatalogId = intent.getIntExtra( - NetworkLibraryActivity.ADD_CATALOG_ID_KEY, myCatalogId - ); - if (myCatalogId != ICustomNetworkLink.INVALID_ID) { - setTextById(R.id.add_custom_catalog_url, uri.toString()); - setTextById(R.id.add_custom_catalog_title, intent.getStringExtra(NetworkLibraryActivity.ADD_CATALOG_TITLE_KEY)); - setTextById(R.id.add_custom_catalog_summary, intent.getStringExtra(NetworkLibraryActivity.ADD_CATALOG_SUMMARY_KEY)); - myIcon = intent.getStringExtra(NetworkLibraryActivity.ADD_CATALOG_ICON_KEY); - } else { - loadInfoByUri(uri); - } + + if (myLink != null) { + setTextById(R.id.add_custom_catalog_url, myLink.getUrlInfo(INetworkLink.URL_MAIN).URL); + setTextById(R.id.add_custom_catalog_title, myLink.getTitle()); + setTextById(R.id.add_custom_catalog_summary, myLink.getSummary()); setExtraFieldsVisibility(true); + } else if (uri != null) { + loadInfoByUri(uri); } else { setExtraFieldsVisibility(false); } @@ -126,24 +122,22 @@ public class AddCustomCatalogActivity extends Activity { setErrorByKey("invalidUrl"); return; } - if (!getExtraFieldsVisibility()) { + if (myLink == null) { loadInfoByUri(uri); } else if (isEmptyString(title)) { setErrorByKey("titleIsEmpty"); } else { - startActivity( - new Intent( - NetworkLibraryActivity.ADD_CATALOG, - uri, - AddCustomCatalogActivity.this, - NetworkLibraryActivity.class - ) - .putExtra(NetworkLibraryActivity.ADD_CATALOG_TITLE_KEY, title) - .putExtra(NetworkLibraryActivity.ADD_CATALOG_SUMMARY_KEY, summary) - .putExtra(NetworkLibraryActivity.ADD_CATALOG_ICON_KEY, myIcon) - .putExtra(NetworkLibraryActivity.ADD_CATALOG_ID_KEY, myCatalogId) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP) - ); + myLink.setTitle(title); + myLink.setSummary(summary); + + Intent intent = new Intent( + NetworkLibraryActivity.ADD_CATALOG, + uri, + AddCustomCatalogActivity.this, + NetworkLibraryActivity.class + ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + NetworkLibraryActivity.addLinkToIntent(intent, myLink); + startActivity(intent); finish(); } } @@ -152,10 +146,6 @@ public class AddCustomCatalogActivity extends Activity { return s == null || s.length() == 0; } - private boolean getExtraFieldsVisibility() { - return findViewById(R.id.add_custom_catalog_title_group).getVisibility() == View.VISIBLE; - } - private void setExtraFieldsVisibility(boolean show) { final int visibility = show ? View.VISIBLE : View.GONE; runOnUiThread(new Runnable() { @@ -253,8 +243,11 @@ public class AddCustomCatalogActivity extends Activity { if (siteName.startsWith("www.")) { siteName = siteName.substring(4); } - final ICustomNetworkLink link = - OPDSLinkReader.createCustomLink(siteName, null, null, null, textUrl); + final HashMap infos = new HashMap(); + infos.put(INetworkLink.URL_MAIN, new UrlInfo(textUrl)); + myLink = OPDSLinkReader.createCustomLink( + ICustomNetworkLink.INVALID_ID, siteName, null, null, null, infos + ); final Runnable loadInfoRunnable = new Runnable() { private String myError; @@ -262,20 +255,19 @@ public class AddCustomCatalogActivity extends Activity { public void run() { try { myError = null; - link.reloadInfo(); + myLink.reloadInfo(); } catch (ZLNetworkException e) { myError = e.getMessage(); } runOnUiThread(new Runnable() { public void run() { if (myError == null) { - setTextById(R.id.add_custom_catalog_title, link.getTitle()); - setTextById(R.id.add_custom_catalog_summary, link.getSummary()); - myIcon = link.getIcon(); + setTextById(R.id.add_custom_catalog_title, myLink.getTitle()); + setTextById(R.id.add_custom_catalog_summary, myLink.getSummary()); setExtraFieldsVisibility(true); } else { runErrorDialog(myError); - myIcon = null; + myLink = null; } } }); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 485d35241..ffd1e2c72 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -248,19 +248,12 @@ class NetworkCatalogActions extends NetworkTreeActions { return true; case CUSTOM_CATALOG_EDIT: { - final ICustomNetworkLink link = - (ICustomNetworkLink)((NetworkCatalogTree)tree).Item.Link; - final String textUrl = link.getUrlInfo(INetworkLink.URL_MAIN).URL; - if (textUrl != null) { - activity.startActivity( - new Intent(activity, AddCustomCatalogActivity.class) - .setData(Uri.parse(textUrl)) - .putExtra(NetworkLibraryActivity.ADD_CATALOG_TITLE_KEY, link.getTitle()) - .putExtra(NetworkLibraryActivity.ADD_CATALOG_SUMMARY_KEY, link.getSummary()) - .putExtra(NetworkLibraryActivity.ADD_CATALOG_ICON_KEY, link.getIcon()) - .putExtra(NetworkLibraryActivity.ADD_CATALOG_ID_KEY, link.getId()) - ); - } + final Intent intent = new Intent(activity, AddCustomCatalogActivity.class); + NetworkLibraryActivity.addLinkToIntent( + intent, + (ICustomNetworkLink)((NetworkCatalogTree)tree).Item.Link + ); + activity.startActivity(intent); return true; } case CUSTOM_CATALOG_REMOVE: diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index f80e34d2e..5b8cbb06c 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -39,19 +39,43 @@ import org.geometerplus.zlibrary.ui.android.R; import org.geometerplus.android.util.UIUtil; -import org.geometerplus.fbreader.network.NetworkTree; -import org.geometerplus.fbreader.network.NetworkLibrary; -import org.geometerplus.fbreader.network.ICustomNetworkLink; +import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.opds.OPDSLinkReader; public class NetworkLibraryActivity extends NetworkBaseActivity { - final static String ADD_CATALOG = "android.fbreader.action.ADD_CATALOG"; + static final String ADD_CATALOG = "android.fbreader.action.ADD_CATALOG"; - final static String ADD_CATALOG_TITLE_KEY = "title"; - final static String ADD_CATALOG_SUMMARY_KEY = "summary"; - final static String ADD_CATALOG_ICON_KEY = "icon"; - final static String ADD_CATALOG_ID_KEY = "id"; - final static String ADD_CATALOG_URLS_BUNDLE_KEY = "urls"; + private static final String ADD_CATALOG_TITLE_KEY = "title"; + private static final String ADD_CATALOG_SUMMARY_KEY = "summary"; + private static final String ADD_CATALOG_ICON_KEY = "icon"; + private static final String ADD_CATALOG_ID_KEY = "id"; + private static final String ADD_CATALOG_URLS_MAP_KEY = "urls"; + + static void addLinkToIntent(Intent intent, ICustomNetworkLink link) { + final String textUrl = link.getUrlInfo(INetworkLink.URL_MAIN).URL; + intent.setData(Uri.parse(textUrl)); + intent + .putExtra(ADD_CATALOG_TITLE_KEY, link.getTitle()) + .putExtra(ADD_CATALOG_SUMMARY_KEY, link.getSummary()) + .putExtra(ADD_CATALOG_ICON_KEY, link.getIcon()) + .putExtra(ADD_CATALOG_ID_KEY, link.getId()) + .putExtra(ADD_CATALOG_URLS_MAP_KEY, link.urlInfoMap()); + } + + static ICustomNetworkLink getLinkFromIntent(Intent intent) { + final Uri uri = intent.getData(); + if (uri == null || !intent.hasExtra(ADD_CATALOG_ID_KEY)) { + return null; + } + return OPDSLinkReader.createCustomLink( + intent.getIntExtra(ADD_CATALOG_ID_KEY, ICustomNetworkLink.INVALID_ID), + uri.getHost(), + intent.getStringExtra(ADD_CATALOG_TITLE_KEY), + intent.getStringExtra(ADD_CATALOG_SUMMARY_KEY), + intent.getStringExtra(ADD_CATALOG_ICON_KEY), + (HashMap)intent.getSerializableExtra(ADD_CATALOG_URLS_MAP_KEY) + ); + } private NetworkTree myTree; private volatile Intent myIntent; @@ -74,19 +98,9 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { } private void processIntent(Intent intent) { - final String action = intent.getAction(); - if (ADD_CATALOG.equals(action)) { - final Uri uri = intent.getData(); - final String title = intent.getStringExtra(ADD_CATALOG_TITLE_KEY); - final String summary = intent.getStringExtra(ADD_CATALOG_SUMMARY_KEY); - final String icon = intent.getStringExtra(ADD_CATALOG_ICON_KEY); - final int id = intent.getIntExtra(ADD_CATALOG_ID_KEY, ICustomNetworkLink.INVALID_ID); - if (uri == null || title == null) { - return; - } - final ICustomNetworkLink link = OPDSLinkReader.createCustomLink( - id, uri.getHost(), title, summary, icon, uri.toString() - ); + if (ADD_CATALOG.equals(intent.getAction())) { + final ICustomNetworkLink link = getLinkFromIntent(intent); + System.err.println("LINK = " + link); if (link != null) { runOnUiThread(new Runnable() { public void run() { diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index 9ac1fe186..7eb54ddcb 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -90,10 +90,12 @@ public abstract class AbstractNetworkLink implements INetworkLink { @Override public String toString() { String icon = myIcon; - if (icon.length() > 64) { - icon = icon.substring(0, 61) + "..."; + if (icon != null) { + if (icon.length() > 64) { + icon = icon.substring(0, 61) + "..."; + } + icon = icon.replaceAll("\n", ""); } - icon = icon.replaceAll("\n", ""); return "AbstractNetworkLink: {" + "siteName=" + mySiteName + "; title=" + myTitle diff --git a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java index a33a74f0d..513e55408 100644 --- a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java @@ -21,6 +21,8 @@ package org.geometerplus.fbreader.network; import org.geometerplus.zlibrary.core.network.ZLNetworkException; +import java.util.HashMap; + public interface ICustomNetworkLink extends INetworkLink { public static final int INVALID_ID = -1; @@ -32,6 +34,7 @@ public interface ICustomNetworkLink extends INetworkLink { void setSummary(String summary); void setIcon(String icon); + HashMap urlInfoMap(); void setUrl(String urlKey, String url); void removeUrl(String urlKey); diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index 84149b020..cdea37814 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -40,7 +40,6 @@ public interface INetworkLink { String getSummary(); String getIcon(); - HashMap urlInfoMap(); UrlInfo getUrlInfo(String urlKey); Set getUrlKeys(); diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index c40dc812d..a14a60b94 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -180,8 +180,12 @@ public class NetworkLibrary { new NetworkDatabase.ICustomLinksHandler() { public void handleCustomLinkData(int id, String siteName, String title, String summary, String icon, Map infos) { - final ICustomNetworkLink link = OPDSLinkReader.createCustomLink(id, siteName, title, summary, icon, infos); - if (link != null) { + if (title != null && + siteName != null && + infos.get(INetworkLink.URL_MAIN) != null) { + final ICustomNetworkLink link = OPDSLinkReader.createCustomLink( + id, siteName, title, summary, icon, infos + ); addLinkInternal(link); } } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java index e8d427e34..e92e335a5 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java @@ -40,22 +40,9 @@ public class OPDSLinkReader { static final String CATALOGS_URL = "http://data.fbreader.org/catalogs/generic-1.2.xml"; public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, Map infos) { - if (siteName == null || title == null || infos.get(INetworkLink.URL_MAIN) == null) { - return null; - } return new OPDSCustomLink(id, siteName, title, summary, icon, infos); } - public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, String url) { - final HashMap infos = new HashMap(); - infos.put(INetworkLink.URL_MAIN, new UrlInfo(url)); - return new OPDSCustomLink(id, siteName, title, summary, icon, infos); - } - - public static ICustomNetworkLink createCustomLink(String siteName, String title, String summary, String icon, String url) { - return createCustomLink(ICustomNetworkLink.INVALID_ID, siteName, title, summary, icon, url); - } - public static final int CACHE_LOAD = 0; public static final int CACHE_UPDATE = 1; public static final int CACHE_CLEAR = 2; diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index ca6c1daa5..e29a03847 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -127,6 +127,7 @@ public class OPDSNetworkLink extends AbstractNetworkLink { if (url == null) { return null; } + System.err.println("URL = " + url); try { pattern = URLEncoder.encode(pattern, "utf-8"); } catch (UnsupportedEncodingException e) { From 5d2a9b1e113d3a50f209187268d41056440cf20c Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 4 Mar 2011 19:39:16 +0000 Subject: [PATCH 57/71] AbstractNetworkLink: myIcon -> 'icon' field in urls map --- .../network/AddCustomCatalogActivity.java | 8 ++--- .../network/NetworkLibraryActivity.java | 8 ++--- .../network/SQLiteNetworkDatabase.java | 35 ++++++++++++++----- .../fbreader/network/AbstractNetworkLink.java | 10 ++---- .../fbreader/network/ICustomNetworkLink.java | 3 +- .../fbreader/network/INetworkLink.java | 1 + .../fbreader/network/NetworkDatabase.java | 2 +- .../fbreader/network/NetworkLibrary.java | 8 ++--- .../fbreader/network/opds/OPDSCustomLink.java | 25 +++++-------- .../fbreader/network/opds/OPDSLinkReader.java | 4 --- .../network/opds/OPDSLinkXMLReader.java | 12 +++---- .../network/opds/OPDSNetworkLink.java | 5 ++- 12 files changed, 59 insertions(+), 62 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java index 4781d517c..2ae2cb52a 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java @@ -38,7 +38,7 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.ui.android.R; import org.geometerplus.fbreader.network.*; -import org.geometerplus.fbreader.network.opds.OPDSLinkReader; +import org.geometerplus.fbreader.network.opds.OPDSCustomLink; import org.geometerplus.android.util.UIUtil; @@ -245,8 +245,8 @@ public class AddCustomCatalogActivity extends Activity { } final HashMap infos = new HashMap(); infos.put(INetworkLink.URL_MAIN, new UrlInfo(textUrl)); - myLink = OPDSLinkReader.createCustomLink( - ICustomNetworkLink.INVALID_ID, siteName, null, null, null, infos + myLink = new OPDSCustomLink( + ICustomNetworkLink.INVALID_ID, siteName, null, null, infos ); final Runnable loadInfoRunnable = new Runnable() { @@ -255,7 +255,7 @@ public class AddCustomCatalogActivity extends Activity { public void run() { try { myError = null; - myLink.reloadInfo(); + myLink.reloadInfo(false); } catch (ZLNetworkException e) { myError = e.getMessage(); } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index 5b8cbb06c..83dc7dc82 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -40,14 +40,13 @@ import org.geometerplus.zlibrary.ui.android.R; import org.geometerplus.android.util.UIUtil; import org.geometerplus.fbreader.network.*; -import org.geometerplus.fbreader.network.opds.OPDSLinkReader; +import org.geometerplus.fbreader.network.opds.OPDSCustomLink; public class NetworkLibraryActivity extends NetworkBaseActivity { static final String ADD_CATALOG = "android.fbreader.action.ADD_CATALOG"; private static final String ADD_CATALOG_TITLE_KEY = "title"; private static final String ADD_CATALOG_SUMMARY_KEY = "summary"; - private static final String ADD_CATALOG_ICON_KEY = "icon"; private static final String ADD_CATALOG_ID_KEY = "id"; private static final String ADD_CATALOG_URLS_MAP_KEY = "urls"; @@ -57,7 +56,6 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { intent .putExtra(ADD_CATALOG_TITLE_KEY, link.getTitle()) .putExtra(ADD_CATALOG_SUMMARY_KEY, link.getSummary()) - .putExtra(ADD_CATALOG_ICON_KEY, link.getIcon()) .putExtra(ADD_CATALOG_ID_KEY, link.getId()) .putExtra(ADD_CATALOG_URLS_MAP_KEY, link.urlInfoMap()); } @@ -67,12 +65,12 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { if (uri == null || !intent.hasExtra(ADD_CATALOG_ID_KEY)) { return null; } - return OPDSLinkReader.createCustomLink( + + return new OPDSCustomLink( intent.getIntExtra(ADD_CATALOG_ID_KEY, ICustomNetworkLink.INVALID_ID), uri.getHost(), intent.getStringExtra(ADD_CATALOG_TITLE_KEY), intent.getStringExtra(ADD_CATALOG_SUMMARY_KEY), - intent.getStringExtra(ADD_CATALOG_ICON_KEY), (HashMap)intent.getSerializableExtra(ADD_CATALOG_URLS_MAP_KEY) ); } diff --git a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java index f9294616d..b96637cdf 100644 --- a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java +++ b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java @@ -44,7 +44,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { private void migrate() { final int version = myDatabase.getVersion(); - final int currentCodeVersion = 2; + final int currentCodeVersion = 3; if (version >= currentCodeVersion) { return; } @@ -54,6 +54,8 @@ class SQLiteNetworkDatabase extends NetworkDatabase { createTables(); case 1: updateTables1(); + case 2: + updateTables2(); } myDatabase.setTransactionSuccessful(); myDatabase.endTransaction(); @@ -74,14 +76,13 @@ class SQLiteNetworkDatabase extends NetworkDatabase { @Override protected void loadCustomLinks(ICustomLinksHandler handler) { - final Cursor cursor = myDatabase.rawQuery("SELECT link_id,title,site_name,summary,icon FROM CustomLinks", null); + final Cursor cursor = myDatabase.rawQuery("SELECT link_id,title,site_name,summary FROM Links", null); final HashMap linksMap = new HashMap(); while (cursor.moveToNext()) { final int id = cursor.getInt(0); final String title = cursor.getString(1); final String siteName = cursor.getString(2); final String summary = cursor.getString(3); - final String icon = cursor.getString(4); linksMap.clear(); final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE url NOT NULL AND link_id = " + id, null); @@ -96,7 +97,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { } linksCursor.close(); - handler.handleCustomLinkData(id, siteName, title, summary, icon, linksMap); + handler.handleCustomLinkData(id, siteName, title, summary, linksMap); } cursor.close(); } @@ -114,14 +115,14 @@ class SQLiteNetworkDatabase extends NetworkDatabase { if (link.getId() == ICustomNetworkLink.INVALID_ID) { if (myInsertCustomLinkStatement == null) { myInsertCustomLinkStatement = myDatabase.compileStatement( - "INSERT INTO CustomLinks (title,site_name,summary,icon) VALUES (?,?,?,?)" + "INSERT INTO Links (title,site_name,summary) VALUES (?,?,?)" ); } statement = myInsertCustomLinkStatement; } else { if (myUpdateCustomLinkStatement == null) { myUpdateCustomLinkStatement = myDatabase.compileStatement( - "UPDATE CustomLinks SET title = ?, site_name = ?, summary =?, icon = ? " + "UPDATE Links SET title = ?, site_name = ?, summary =? " + "WHERE link_id = ?" ); } @@ -131,7 +132,6 @@ class SQLiteNetworkDatabase extends NetworkDatabase { statement.bindString(1, link.getTitle()); statement.bindString(2, link.getSiteName()); SQLiteUtil.bindString(statement, 3, link.getSummary()); - SQLiteUtil.bindString(statement, 4, link.getIcon()); final long id; final HashMap linksMap = new HashMap(); @@ -214,7 +214,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { if (myDeleteCustomLinkStatement == null) { myDeleteCustomLinkStatement = myDatabase.compileStatement( - "DELETE FROM CustomLinks WHERE link_id = ?" + "DELETE FROM Links WHERE link_id = ?" ); } myDeleteCustomLinkStatement.bindLong(1, id); @@ -263,4 +263,23 @@ class SQLiteNetworkDatabase extends NetworkDatabase { myDatabase.execSQL("INSERT INTO LinkUrls (key,link_id,url) SELECT key,link_id,url FROM CustomLinkUrls"); myDatabase.execSQL("DROP TABLE CustomLinkUrls"); } + + private void updateTables2() { + myDatabase.execSQL( + "CREATE TABLE Links(" + + "link_id INTEGER PRIMARY KEY," + + "title TEXT NOT NULL," + + "site_name TEXT NOT NULL," + + "summary TEXT)"); + myDatabase.execSQL("INSERT INTO Links (link_id,title,site_name,summary) SELECT link_id,title,site_name,summary FROM CustomLinks"); + final Cursor cursor = myDatabase.rawQuery("SELECT link_id,icon FROM CustomLinks", null); + while (cursor.moveToNext()) { + final int id = cursor.getInt(0); + final String url = cursor.getString(1); + myDatabase.execSQL("INSERT INTO LinkUrls (key,link_id,url) VALUES " + + "('icon'," + id + ",'" + url + "')"); + } + cursor.close(); + myDatabase.execSQL("DROP TABLE CustomLinks"); + } } diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index 7eb54ddcb..43e5af913 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -27,7 +27,6 @@ public abstract class AbstractNetworkLink implements INetworkLink { protected String mySiteName; protected String myTitle; protected String mySummary; - protected String myIcon; protected final String myLanguage; protected final TreeMap myInfos; @@ -37,15 +36,13 @@ public abstract class AbstractNetworkLink implements INetworkLink { * @param siteName name of the corresponding website. Must be not null. * @param title title of the corresponding library item. Must be not null. * @param summary description of the corresponding library item. Can be null. - * @param icon string contains link's icon data/url. Can be null. * @param language language of the catalog. If null we assume this catalog is multilanguage. * @param infos map contains URL infos with their identifiers; must always contain one URL with URL_MAIN identifier */ - public AbstractNetworkLink(String siteName, String title, String summary, String icon, String language, Map infos) { + public AbstractNetworkLink(String siteName, String title, String summary, String language, Map infos) { mySiteName = siteName; myTitle = title; mySummary = summary; - myIcon = icon; myLanguage = language != null ? language : "multi"; myInfos = new TreeMap(infos); } @@ -63,7 +60,7 @@ public abstract class AbstractNetworkLink implements INetworkLink { } public final String getIcon() { - return myIcon; + return getUrlInfo(URL_ICON).URL; } public final String getLanguage() { @@ -89,7 +86,7 @@ public abstract class AbstractNetworkLink implements INetworkLink { @Override public String toString() { - String icon = myIcon; + String icon = getIcon(); if (icon != null) { if (icon.length() > 64) { icon = icon.substring(0, 61) + "..."; @@ -118,7 +115,6 @@ public abstract class AbstractNetworkLink implements INetworkLink { if (!mySiteName.equals(lnk.mySiteName) || !myTitle.equals(lnk.myTitle) || !ZLMiscUtil.equals(mySummary, lnk.mySummary) - || !ZLMiscUtil.equals(myIcon, lnk.myIcon) || !ZLMiscUtil.mapsEquals(myInfos, lnk.myInfos)) { return false; } diff --git a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java index 513e55408..c32a92af8 100644 --- a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java @@ -32,13 +32,12 @@ public interface ICustomNetworkLink extends INetworkLink { void setSiteName(String name); void setTitle(String title); void setSummary(String summary); - void setIcon(String icon); HashMap urlInfoMap(); void setUrl(String urlKey, String url); void removeUrl(String urlKey); - void reloadInfo() throws ZLNetworkException; + void reloadInfo(boolean urlsOnly) throws ZLNetworkException; // returns true if next methods have changed link's data: // setSiteName, setTitle, setSummary, setIcon, setLink, removeLink diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index cdea37814..25629a776 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -29,6 +29,7 @@ import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationMan public interface INetworkLink { String URL_MAIN = "main"; String URL_SEARCH = "search"; + String URL_ICON = "icon"; String URL_SIGN_IN = "signIn"; String URL_SIGN_OUT = "signOut"; String URL_SIGN_UP = "signUp"; diff --git a/src/org/geometerplus/fbreader/network/NetworkDatabase.java b/src/org/geometerplus/fbreader/network/NetworkDatabase.java index dba07628d..5c50013c8 100644 --- a/src/org/geometerplus/fbreader/network/NetworkDatabase.java +++ b/src/org/geometerplus/fbreader/network/NetworkDatabase.java @@ -35,7 +35,7 @@ public abstract class NetworkDatabase { protected abstract void executeAsATransaction(Runnable actions); public interface ICustomLinksHandler { - void handleCustomLinkData(int id, String siteName, String title, String summary, String icon, Map infos); + void handleCustomLinkData(int id, String siteName, String title, String summary, Map infos); } protected abstract void loadCustomLinks(ICustomLinksHandler handler); diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index a14a60b94..2580690e5 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -31,9 +31,9 @@ import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.fbreader.tree.FBTree; import org.geometerplus.fbreader.network.tree.*; +import org.geometerplus.fbreader.network.opds.OPDSCustomLink; import org.geometerplus.fbreader.network.opds.OPDSLinkReader; - public class NetworkLibrary { private static NetworkLibrary ourInstance; @@ -179,12 +179,12 @@ public class NetworkLibrary { db.loadCustomLinks( new NetworkDatabase.ICustomLinksHandler() { public void handleCustomLinkData(int id, String siteName, - String title, String summary, String icon, Map infos) { + String title, String summary, Map infos) { if (title != null && siteName != null && infos.get(INetworkLink.URL_MAIN) != null) { - final ICustomNetworkLink link = OPDSLinkReader.createCustomLink( - id, siteName, title, summary, icon, infos + final ICustomNetworkLink link = new OPDSCustomLink( + id, siteName, title, summary, infos ); addLinkInternal(link); } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java index 1399578f0..582b29ba2 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java @@ -34,13 +34,13 @@ import org.geometerplus.fbreader.network.INetworkLink; import org.geometerplus.fbreader.network.NetworkException; import org.geometerplus.fbreader.network.UrlInfo; -class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { +public class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { private int myId; private boolean myHasChanges; - OPDSCustomLink(int id, String siteName, String title, String summary, String icon, Map infos) { - super(siteName, title, summary, icon, null, infos, false); + public OPDSCustomLink(int id, String siteName, String title, String summary, Map infos) { + super(siteName, title, summary, null, infos, false); myId = id; } @@ -60,11 +60,6 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { myHasChanges = false; } - public final void setIcon(String icon) { - myHasChanges = myHasChanges || !ZLMiscUtil.equals(myIcon, icon); - myIcon = icon; - } - public final void setSiteName(String name) { myHasChanges = myHasChanges || !ZLMiscUtil.equals(mySiteName, name); mySiteName = name; @@ -90,8 +85,7 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { myHasChanges = myHasChanges || oldUrl != null; } - - public void reloadInfo() throws ZLNetworkException { + public void reloadInfo(boolean urlsOnly) throws ZLNetworkException { final LinkedList opensearchDescriptionURLs = new LinkedList(); final List descriptions = Collections.synchronizedList(new LinkedList()); @@ -110,12 +104,8 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { throw new ZLNetworkException(NetworkException.ERROR_NO_REQUIRED_INFORMATION); } myTitle = info.Title; - if (info.Icon != null) { - myIcon = info.Icon; - } - if (info.Summary != null) { - mySummary = info.Summary; - } + setUrl(URL_ICON, info.Icon); + mySummary = info.Summary; if (info.DirectOpenSearchDescription != null) { descriptions.add(info.DirectOpenSearchDescription); } @@ -148,7 +138,8 @@ class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLink { if (!descriptions.isEmpty()) { // TODO: May be do not use '%s'??? Use Description instead??? (this needs to rewrite SEARCH engine logic a little) setUrl(URL_SEARCH, descriptions.get(0).makeQuery("%s")); - System.err.println(descriptions.get(0).makeQuery("%s")); + } else { + setUrl(URL_SEARCH, null); } if (error != null) { throw error; diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java index e92e335a5..ca017cebf 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkReader.java @@ -39,10 +39,6 @@ import org.geometerplus.fbreader.network.atom.ATOMUpdated; public class OPDSLinkReader { static final String CATALOGS_URL = "http://data.fbreader.org/catalogs/generic-1.2.xml"; - public static ICustomNetworkLink createCustomLink(int id, String siteName, String title, String summary, String icon, Map infos) { - return new OPDSCustomLink(id, siteName, title, summary, icon, infos); - } - public static final int CACHE_LOAD = 0; public static final int CACHE_UPDATE = 1; public static final int CACHE_CLEAR = 2; diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java index 6b61d7b05..c9b06758c 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java @@ -99,7 +99,6 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType final String summary = entry.Content; final String language = entry.DCLanguage; - String icon = null; final HashMap infos = new HashMap(); final HashMap urlConditions = new HashMap(); @@ -109,11 +108,12 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType final String rel = link.getRel(); if (rel == REL_IMAGE_THUMBNAIL || rel == REL_THUMBNAIL) { if (type == MIME_IMAGE_PNG || type == MIME_IMAGE_JPEG) { - icon = href; + infos.put(INetworkLink.URL_ICON, new UrlInfo(href)); } } else if ((rel != null && rel.startsWith(REL_IMAGE_PREFIX)) || rel == REL_COVER) { - if (icon == null && (type == MIME_IMAGE_PNG || type == MIME_IMAGE_JPEG)) { - icon = href; + if (infos.get(INetworkLink.URL_ICON) == null && + (type == MIME_IMAGE_PNG || type == MIME_IMAGE_JPEG)) { + infos.put(INetworkLink.URL_ICON, new UrlInfo(href)); } } else if (rel == null) { if (type == MIME_APP_ATOM) { @@ -154,7 +154,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType sslCertificate = null; } - INetworkLink result = link(siteName, title, summary, icon, language, infos, urlConditions, sslCertificate); + INetworkLink result = link(siteName, title, summary, language, infos, urlConditions, sslCertificate); if (result != null) { myListener.onNewLink(result); } @@ -165,7 +165,6 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType String siteName, String title, String summary, - String icon, String language, Map infos, HashMap urlConditions, @@ -179,7 +178,6 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType siteName, title, summary, - icon, language, infos, myHasStableIdentifiers diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index e29a03847..7dc7da109 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -48,9 +48,9 @@ public class OPDSNetworkLink extends AbstractNetworkLink { private final boolean myHasStableIdentifiers; - OPDSNetworkLink(String siteName, String title, String summary, String icon, String language, + OPDSNetworkLink(String siteName, String title, String summary, String language, Map infos, boolean hasStableIdentifiers) { - super(siteName, title, summary, icon, language, infos); + super(siteName, title, summary, language, infos); myHasStableIdentifiers = hasStableIdentifiers; myBooksInBasketOption = new ZLStringListOption(siteName, "Basket", null); } @@ -127,7 +127,6 @@ public class OPDSNetworkLink extends AbstractNetworkLink { if (url == null) { return null; } - System.err.println("URL = " + url); try { pattern = URLEncoder.encode(pattern, "utf-8"); } catch (UnsupportedEncodingException e) { From 34119928a0b3590ff6cabd179e576b2656545492 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 4 Mar 2011 20:25:04 +0000 Subject: [PATCH 58/71] removed INetworkLink.getIcon() method --- .../geometerplus/fbreader/network/AbstractNetworkLink.java | 6 +----- src/org/geometerplus/fbreader/network/INetworkLink.java | 1 - .../geometerplus/fbreader/network/opds/OPDSNetworkLink.java | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index 43e5af913..83c81677a 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -59,10 +59,6 @@ public abstract class AbstractNetworkLink implements INetworkLink { return mySummary; } - public final String getIcon() { - return getUrlInfo(URL_ICON).URL; - } - public final String getLanguage() { return myLanguage; } @@ -86,7 +82,7 @@ public abstract class AbstractNetworkLink implements INetworkLink { @Override public String toString() { - String icon = getIcon(); + String icon = getUrlInfo(URL_ICON).URL; if (icon != null) { if (icon.length() > 64) { icon = icon.substring(0, 61) + "..."; diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index 25629a776..c2918cacb 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -39,7 +39,6 @@ public interface INetworkLink { String getSiteName(); String getTitle(); String getSummary(); - String getIcon(); UrlInfo getUrlInfo(String urlKey); Set getUrlKeys(); diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index 7dc7da109..532153c8e 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -141,7 +141,7 @@ public class OPDSNetworkLink extends AbstractNetworkLink { public NetworkCatalogItem libraryItem() { TreeMap urlMap = new TreeMap(); urlMap.put(NetworkCatalogItem.URL_CATALOG, getUrlInfo(URL_MAIN).URL); - return new OPDSCatalogItem(this, getTitle(), getSummary(), getIcon(), urlMap, myExtraData); + return new OPDSCatalogItem(this, getTitle(), getSummary(), getUrlInfo(URL_ICON).URL, urlMap, myExtraData); } public NetworkAuthenticationManager authenticationManager() { From c5f9ea0bd454cb121a6087d0c7e83bdb9ea0d771 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 4 Mar 2011 22:23:23 +0000 Subject: [PATCH 59/71] custom links search; custom links update --- ChangeLog | 2 ++ .../network/SQLiteNetworkDatabase.java | 6 ++--- .../fbreader/network/ICustomNetworkLink.java | 1 + .../fbreader/network/NetworkLibrary.java | 18 +++++++++---- .../fbreader/network/opds/OPDSCustomLink.java | 26 ++++++++++++++++--- 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index a24794d63..bd1047a2e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ * opds:// URLs support has been implemented * Unexpected search call has been fixed * Ignore case comparison for zip entry names +* Fixed custom OPDS link search +* Periodical update of custom links information has been added ===== 0.99.13 (Feb 13, 2011) ===== * Fixed book/position forgetting bug diff --git a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java index b96637cdf..9880ed79c 100644 --- a/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java +++ b/src/org/geometerplus/android/fbreader/network/SQLiteNetworkDatabase.java @@ -85,7 +85,7 @@ class SQLiteNetworkDatabase extends NetworkDatabase { final String summary = cursor.getString(3); linksMap.clear(); - final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE url NOT NULL AND link_id = " + id, null); + final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE link_id = " + id, null); while (linksCursor.moveToNext()) { linksMap.put( linksCursor.getString(0), @@ -141,10 +141,10 @@ class SQLiteNetworkDatabase extends NetworkDatabase { link.setId((int) id); } else { id = link.getId(); - statement.bindLong(5, id); + statement.bindLong(4, id); statement.execute(); - final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE url NOT NULL AND link_id = " + link.getId(), null); + final Cursor linksCursor = myDatabase.rawQuery("SELECT key,url,update_time FROM LinkUrls WHERE link_id = " + link.getId(), null); while (linksCursor.moveToNext()) { linksMap.put( linksCursor.getString(0), diff --git a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java index c32a92af8..b99172214 100644 --- a/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/ICustomNetworkLink.java @@ -37,6 +37,7 @@ public interface ICustomNetworkLink extends INetworkLink { void setUrl(String urlKey, String url); void removeUrl(String urlKey); + boolean isObsolete(long milliSeconds); void reloadInfo(boolean urlsOnly) throws ZLNetworkException; // returns true if next methods have changed link's data: diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index 2580690e5..ef501b12c 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -244,6 +244,15 @@ public class NetworkLibrary { } } } + for (INetworkLink link : myLinks) { + if (link instanceof ICustomNetworkLink) { + final ICustomNetworkLink customLink = (ICustomNetworkLink)link; + if (customLink.isObsolete(12 * 60 * 60 * 1000)) { // 12 hours + customLink.reloadInfo(true); + NetworkDatabase.Instance().saveCustomLink(customLink); + } + } + } } } @@ -253,12 +262,11 @@ public class NetworkLibrary { // synchronize() method MUST be called after this method public void finishBackgroundUpdate() { synchronized (myBackgroundLock) { - if (myBackgroundLinks == null) { - return; - } synchronized (myLinks) { - removeAllLoadedLinks(); - myLinks.addAll(myBackgroundLinks); + if (myBackgroundLinks != null) { + removeAllLoadedLinks(); + myLinks.addAll(myBackgroundLinks); + } invalidateChildren(); } } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java index 582b29ba2..da09d6138 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java @@ -85,13 +85,29 @@ public class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLin myHasChanges = myHasChanges || oldUrl != null; } - public void reloadInfo(boolean urlsOnly) throws ZLNetworkException { + public boolean isObsolete(long milliSeconds) { + final long old = System.currentTimeMillis() - milliSeconds; + + final Date searchUpdateDate = getUrlInfo(URL_SEARCH).Updated; + if (searchUpdateDate == null || searchUpdateDate.getTime() < old) { + return true; + } + + final Date iconUpdateDate = getUrlInfo(URL_ICON).Updated; + if (iconUpdateDate == null || iconUpdateDate.getTime() < old) { + return true; + } + + return false; + } + + public void reloadInfo(final boolean urlsOnly) throws ZLNetworkException { final LinkedList opensearchDescriptionURLs = new LinkedList(); final List descriptions = Collections.synchronizedList(new LinkedList()); ZLNetworkException error = null; try { - ZLNetworkManager.Instance().perform(new ZLNetworkRequest(getUrlInfo(INetworkLink.URL_MAIN).URL) { + ZLNetworkManager.Instance().perform(new ZLNetworkRequest(getUrlInfo(URL_MAIN).URL) { @Override public void handleStream(URLConnection connection, InputStream inputStream) throws IOException, ZLNetworkException { final CatalogInfoReader info = new CatalogInfoReader(URL, OPDSCustomLink.this, opensearchDescriptionURLs); @@ -103,12 +119,14 @@ public class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLin if (info.Title == null) { throw new ZLNetworkException(NetworkException.ERROR_NO_REQUIRED_INFORMATION); } - myTitle = info.Title; setUrl(URL_ICON, info.Icon); - mySummary = info.Summary; if (info.DirectOpenSearchDescription != null) { descriptions.add(info.DirectOpenSearchDescription); } + if (!urlsOnly) { + myTitle = info.Title; + mySummary = info.Summary; + } } }); } catch (ZLNetworkException e) { From 77705fa133de333eee2730b7286dea209fcec1ca Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Mar 2011 00:15:36 +0000 Subject: [PATCH 60/71] cleanup --- .../network/AddCustomCatalogActivity.java | 6 +---- .../fbreader/network/NetworkLibrary.java | 22 ------------------- .../fbreader/network/opds/OPDSCustomLink.java | 9 +++++++- 3 files changed, 9 insertions(+), 28 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java index 2ae2cb52a..0326fac4d 100644 --- a/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/AddCustomCatalogActivity.java @@ -234,15 +234,11 @@ public class AddCustomCatalogActivity extends Activity { } setTextById(R.id.add_custom_catalog_url, textUrl); - String siteName = uri.getHost(); + final String siteName = uri.getHost(); if (isEmptyString(siteName)) { setErrorByKey("invalidUrl"); return; } - - if (siteName.startsWith("www.")) { - siteName = siteName.substring(4); - } final HashMap infos = new HashMap(); infos.put(INetworkLink.URL_MAIN, new UrlInfo(textUrl)); myLink = new OPDSCustomLink( diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index ef501b12c..eed8369dd 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -499,26 +499,4 @@ public class NetworkLibrary { NetworkDatabase.Instance().deleteCustomLink(link); invalidateChildren(); } - - public boolean hasCustomLinkTitle(String title, INetworkLink exceptFor) { - synchronized (myLinks) { - for (INetworkLink link : myLinks) { - if (link != exceptFor && link.getTitle().equals(title)) { - return true; - } - } - } - return false; - } - - public boolean hasCustomLinkSite(String siteName, INetworkLink exceptFor) { - synchronized (myLinks) { - for (INetworkLink link : myLinks) { - if (link != exceptFor && link.getSiteName().equals(siteName)) { - return true; - } - } - } - return false; - } } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java index da09d6138..9ecf0be44 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSCustomLink.java @@ -39,8 +39,15 @@ public class OPDSCustomLink extends OPDSNetworkLink implements ICustomNetworkLin private boolean myHasChanges; + private static String removeWWWPrefix(String siteName) { + if (siteName != null && siteName.startsWith("www.")) { + return siteName.substring(4); + } + return siteName; + } + public OPDSCustomLink(int id, String siteName, String title, String summary, Map infos) { - super(siteName, title, summary, null, infos, false); + super(removeWWWPrefix(siteName), title, summary, null, infos, false); myId = id; } From 0fef5a1ee271c4f2515dbc80b36c018103475eaa Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Mar 2011 17:03:14 +0000 Subject: [PATCH 61/71] TopUpTree has been moved to an abstract level --- .../fbreader/network/NetworkBaseActivity.java | 5 +++ .../network/NetworkCatalogActions.java | 2 +- .../network/NetworkCatalogActivity.java | 41 ++----------------- .../network/RefillAccountActions.java | 11 ++--- .../fbreader/network/NetworkLibraryItem.java | 1 - .../fbreader/network/TopUpItem.java | 33 +++++++++++++++ .../network/opds/NetworkOPDSFeedReader.java | 2 + .../fbreader/network/opds/OPDSConstants.java | 1 + .../network/tree/NetworkCatalogRootTree.java | 3 +- .../network/tree/NetworkCatalogTree.java | 3 -- .../network/tree/NetworkTreeFactory.java | 2 + .../network/tree/TopUpTree.java} | 33 +++++---------- 12 files changed, 66 insertions(+), 71 deletions(-) create mode 100644 src/org/geometerplus/fbreader/network/TopUpItem.java rename src/org/geometerplus/{android/fbreader/network/RefillAccountTree.java => fbreader/network/tree/TopUpTree.java} (58%) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java index 7ae3475c5..4d5c2449b 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java @@ -40,6 +40,7 @@ import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.tree.NetworkBookTree; import org.geometerplus.fbreader.network.tree.AddCustomCatalogItemTree; import org.geometerplus.fbreader.network.tree.SearchItemTree; +import org.geometerplus.fbreader.network.tree.TopUpTree; import org.geometerplus.android.fbreader.tree.ZLAndroidTree; @@ -114,6 +115,10 @@ abstract class NetworkBaseActivity extends ListActivity implements NetworkView.E coverView.setImageResource(R.drawable.ic_list_searchresult); return; } + if (tree instanceof TopUpTree) { + coverView.setImageResource(R.drawable.ic_list_library_wallet); + return; + } if (tree instanceof ZLAndroidTree) { coverView.setImageResource(((ZLAndroidTree)tree).getCoverResourceId()); return; diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index ffd1e2c72..2bb0f084f 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -244,7 +244,7 @@ class NetworkCatalogActions extends NetworkTreeActions { doSignOut(activity, (NetworkCatalogTree)tree); return true; case REFILL_ACCOUNT_ITEM_ID: - new RefillAccountActions().runStandalone(activity, ((RefillAccountTree)activity.getDefaultTree()).Link); + //new RefillAccountActions().runStandalone(activity, ((RefillAccountTree)activity.getDefaultTree()).Link); return true; case CUSTOM_CATALOG_EDIT: { diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index 203e52a80..ceb183535 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -67,7 +67,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR setupTitle(); if (myTree instanceof NetworkCatalogTree && Util.isAccountRefillingSupported(this, ((NetworkCatalogTree)myTree).Item.Link)) { - setDefaultTree(new RefillAccountTree((NetworkCatalogTree)myTree)); + //setDefaultTree(new RefillAccountTree((NetworkCatalogTree)myTree)); } } @@ -121,43 +121,15 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR } private final class CatalogAdapter extends BaseAdapter { - private ArrayList mySpecialItems; - - public CatalogAdapter() { - if (myTree instanceof NetworkCatalogRootTree) { - final NetworkCatalogRootTree rootTree = (NetworkCatalogRootTree)myTree; - mySpecialItems = new ArrayList(); - if (Util.isAccountRefillingSupported(NetworkCatalogActivity.this, rootTree.Item.Link)) { - mySpecialItems.add(new RefillAccountTree(rootTree)); - } - if (mySpecialItems.size() > 0) { - mySpecialItems.trimToSize(); - } else { - mySpecialItems = null; - } - } - } - public final int getCount() { - return myTree.subTrees().size() + - ((mySpecialItems != null && !myInProgress) ? mySpecialItems.size() : 0); + return myTree.subTrees().size(); } public final NetworkTree getItem(int position) { - if (position < 0) { + if (position < 0 || position >= myTree.subTrees().size()) { return null; } - if (position < myTree.subTrees().size()) { - return (NetworkTree) myTree.subTrees().get(position); - } - if (myInProgress) { - return null; - } - position -= myTree.subTrees().size(); - if (mySpecialItems != null && position < mySpecialItems.size()) { - return mySpecialItems.get(position); - } - return null; + return (NetworkTree)myTree.subTrees().get(position); } public final long getItemId(int position) { @@ -171,11 +143,6 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR void onModelChanged() { notifyDataSetChanged(); - if (mySpecialItems != null) { - for (NetworkTree tree: mySpecialItems) { - tree.invalidateChildren(); // call to update secondString - } - } } } diff --git a/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java b/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java index ab458905f..78b025c8d 100644 --- a/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java +++ b/src/org/geometerplus/android/fbreader/network/RefillAccountActions.java @@ -26,9 +26,9 @@ import android.view.ContextMenu; import org.geometerplus.fbreader.network.INetworkLink; import org.geometerplus.fbreader.network.NetworkTree; +import org.geometerplus.fbreader.network.tree.TopUpTree; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; - class RefillAccountActions extends NetworkTreeActions { public static final int REFILL_VIA_SMS_ITEM_ID = 0; public static final int REFILL_VIA_BROWSER_ITEM_ID = 1; @@ -36,12 +36,12 @@ class RefillAccountActions extends NetworkTreeActions { @Override public boolean canHandleTree(NetworkTree tree) { - return tree instanceof RefillAccountTree; + return tree instanceof TopUpTree; } @Override public void buildContextMenu(Activity activity, ContextMenu menu, NetworkTree tree) { - buildContextMenu(activity, menu, ((RefillAccountTree)tree).Link); + buildContextMenu(activity, menu, ((TopUpTree)tree).Item.Link); } public void buildContextMenu(Activity activity, ContextMenu menu, INetworkLink link) { @@ -57,7 +57,7 @@ class RefillAccountActions extends NetworkTreeActions { @Override public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) { - return getDefaultActionCode(activity, ((RefillAccountTree)tree).Link); + return getDefaultActionCode(activity, ((TopUpTree)tree).Item.Link); } private int getDefaultActionCode(Activity activity, INetworkLink link) { final boolean sms = Util.isSmsAccountRefillingSupported(activity, link); @@ -89,9 +89,10 @@ class RefillAccountActions extends NetworkTreeActions { @Override public boolean runAction(NetworkBaseActivity activity, NetworkTree tree, int actionCode) { - final INetworkLink link = ((RefillAccountTree)tree).Link; + final INetworkLink link = ((TopUpTree)tree).Item.Link; return runAction(activity, link, actionCode); } + public boolean runAction(Activity activity, INetworkLink link, int actionCode) { Runnable refillRunnable = null; switch (actionCode) { diff --git a/src/org/geometerplus/fbreader/network/NetworkLibraryItem.java b/src/org/geometerplus/fbreader/network/NetworkLibraryItem.java index cb312615c..42e0dc9b1 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibraryItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibraryItem.java @@ -20,7 +20,6 @@ package org.geometerplus.fbreader.network; public abstract class NetworkLibraryItem { - public final INetworkLink Link; public final String Title; public final String Summary; diff --git a/src/org/geometerplus/fbreader/network/TopUpItem.java b/src/org/geometerplus/fbreader/network/TopUpItem.java new file mode 100644 index 000000000..8b0dcf83f --- /dev/null +++ b/src/org/geometerplus/fbreader/network/TopUpItem.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2010-2011 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.fbreader.network; + +import org.geometerplus.zlibrary.core.resources.ZLResource; + +public class TopUpItem extends NetworkLibraryItem { + public TopUpItem(INetworkLink link, String cover) { + super( + link, + ZLResource.resource("networkView").getResource("refillTitle").getValue(), + ZLResource.resource("networkView").getResource("refillSummary").getValue(), + cover + ); + } +} diff --git a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java index e04e69d8c..2c004d2c3 100644 --- a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java +++ b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java @@ -467,6 +467,8 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes urlMap, opdsLink.getCondition(entry.Id.Uri) ); + } else if (REL_TOPUP.equals(litresRel)) { + return new TopUpItem(opdsLink, coverURL); } else { return null; } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSConstants.java b/src/org/geometerplus/fbreader/network/opds/OPDSConstants.java index a66838957..0153e326d 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSConstants.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSConstants.java @@ -25,6 +25,7 @@ interface OPDSConstants { String REL_BOOKSHELF = "http://data.fbreader.org/rel/bookshelf"; String REL_RECOMMENDATIONS = "http://data.fbreader.org/rel/recommendations"; String REL_BASKET = "http://data.fbreader.org/rel/basket"; + String REL_TOPUP = "http://data.fbreader.org/rel/topup"; //String REL_SUBSCRIPTIONS = "http://opds-spec.org/subscriptions"; // Entry level / catalog types diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogRootTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogRootTree.java index 7528becb3..987521723 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogRootTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogRootTree.java @@ -22,8 +22,7 @@ package org.geometerplus.fbreader.network.tree; import org.geometerplus.fbreader.network.*; public class NetworkCatalogRootTree extends NetworkCatalogTree { - public NetworkCatalogRootTree(RootTree parent, INetworkLink link, int position) { - super(parent, (NetworkCatalogItem) link.libraryItem(), position); + super(parent, (NetworkCatalogItem)link.libraryItem(), position); } } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java index 265a9a573..0c9ba1121 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java @@ -28,7 +28,6 @@ import org.geometerplus.fbreader.tree.FBTree; import org.geometerplus.fbreader.network.*; public class NetworkCatalogTree extends NetworkTree { - public final NetworkCatalogItem Item; public final ArrayList ChildrenItems = new ArrayList(); @@ -62,7 +61,6 @@ public class NetworkCatalogTree extends NetworkTree { return createCover(Item); } - public boolean isContentValid() { if (myLoadedTime < 0) { return false; @@ -80,7 +78,6 @@ public class NetworkCatalogTree extends NetworkTree { } } - public void updateVisibility() { final LinkedList toRemove = new LinkedList(); diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkTreeFactory.java b/src/org/geometerplus/fbreader/network/tree/NetworkTreeFactory.java index b9231a9c9..a06104d8e 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkTreeFactory.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkTreeFactory.java @@ -80,6 +80,8 @@ public class NetworkTreeFactory { } return new NetworkBookTree(parent, book, position, showAuthors); + } else if (item instanceof TopUpItem) { + return new TopUpTree(parent, (TopUpItem)item); } return null; } diff --git a/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java b/src/org/geometerplus/fbreader/network/tree/TopUpTree.java similarity index 58% rename from src/org/geometerplus/android/fbreader/network/RefillAccountTree.java rename to src/org/geometerplus/fbreader/network/tree/TopUpTree.java index 4f132ac9c..3e2040f4c 100644 --- a/src/org/geometerplus/android/fbreader/network/RefillAccountTree.java +++ b/src/org/geometerplus/fbreader/network/tree/TopUpTree.java @@ -17,42 +17,35 @@ * 02110-1301, USA. */ -package org.geometerplus.android.fbreader.network; +package org.geometerplus.fbreader.network.tree; import org.geometerplus.zlibrary.core.network.ZLNetworkException; -import org.geometerplus.zlibrary.core.resources.ZLResource; -import org.geometerplus.fbreader.network.INetworkLink; -import org.geometerplus.fbreader.network.NetworkLibraryItem; +import org.geometerplus.fbreader.network.TopUpItem; import org.geometerplus.fbreader.network.NetworkTree; -import org.geometerplus.fbreader.network.tree.NetworkCatalogTree; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; -import org.geometerplus.zlibrary.ui.android.R; +public class TopUpTree extends NetworkTree { + public final TopUpItem Item; -import org.geometerplus.android.fbreader.tree.ZLAndroidTree; - -class RefillAccountTree extends NetworkTree implements ZLAndroidTree { - public final INetworkLink Link; - - public RefillAccountTree(NetworkCatalogTree parentTree) { + TopUpTree(NetworkCatalogTree parentTree, TopUpItem item) { super(parentTree); - Link = parentTree.Item.Link; + Item = item; } @Override public String getName() { - return ZLResource.resource("networkView").getResource("refillTitle").getValue(); + return Item.Title; } @Override public String getSummary() { - final NetworkAuthenticationManager mgr = Link.authenticationManager(); + final NetworkAuthenticationManager mgr = Item.Link.authenticationManager(); try { if (mgr.isAuthorised(false)) { final String account = mgr.currentAccount(); if (account != null) { - return ZLResource.resource("networkView").getResource("refillSummary").getValue().replace("%s", account); + return Item.Summary.replace("%s", account); } } } catch (ZLNetworkException e) { @@ -61,12 +54,8 @@ class RefillAccountTree extends NetworkTree implements ZLAndroidTree { } @Override - public NetworkLibraryItem getHoldedItem() { - return null; - } - - public int getCoverResourceId() { - return R.drawable.ic_list_library_wallet; + public TopUpItem getHoldedItem() { + return Item; } @Override From 6663a21c01dde4033429dbeb2f92c5b8458914db Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Mar 2011 17:21:02 +0000 Subject: [PATCH 62/71] removed unused icons --- icons/library/ic_list_library_basket.png | Bin 2220 -> 0 bytes icons/library/ic_list_library_basket_empty.png | Bin 2864 -> 0 bytes icons/library/ic_list_library_wallet.png | Bin 3346 -> 0 bytes .../fbreader/network/NetworkBaseActivity.java | 5 ----- .../fbreader/network/tree/TopUpTree.java | 6 ++++++ 5 files changed, 6 insertions(+), 5 deletions(-) delete mode 100644 icons/library/ic_list_library_basket.png delete mode 100644 icons/library/ic_list_library_basket_empty.png delete mode 100644 icons/library/ic_list_library_wallet.png diff --git a/icons/library/ic_list_library_basket.png b/icons/library/ic_list_library_basket.png deleted file mode 100644 index e5632d0a5ba5f0b72ba95b89430c6f46d1037f6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2220 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 diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java index 4d5c2449b..7ae3475c5 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java @@ -40,7 +40,6 @@ import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.tree.NetworkBookTree; import org.geometerplus.fbreader.network.tree.AddCustomCatalogItemTree; import org.geometerplus.fbreader.network.tree.SearchItemTree; -import org.geometerplus.fbreader.network.tree.TopUpTree; import org.geometerplus.android.fbreader.tree.ZLAndroidTree; @@ -115,10 +114,6 @@ abstract class NetworkBaseActivity extends ListActivity implements NetworkView.E coverView.setImageResource(R.drawable.ic_list_searchresult); return; } - if (tree instanceof TopUpTree) { - coverView.setImageResource(R.drawable.ic_list_library_wallet); - return; - } if (tree instanceof ZLAndroidTree) { coverView.setImageResource(((ZLAndroidTree)tree).getCoverResourceId()); return; diff --git a/src/org/geometerplus/fbreader/network/tree/TopUpTree.java b/src/org/geometerplus/fbreader/network/tree/TopUpTree.java index 3e2040f4c..9e3099862 100644 --- a/src/org/geometerplus/fbreader/network/tree/TopUpTree.java +++ b/src/org/geometerplus/fbreader/network/tree/TopUpTree.java @@ -19,6 +19,7 @@ package org.geometerplus.fbreader.network.tree; +import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.TopUpItem; @@ -53,6 +54,11 @@ public class TopUpTree extends NetworkTree { return null; } + @Override + protected ZLImage createCover() { + return createCover(Item); + } + @Override public TopUpItem getHoldedItem() { return Item; From 837bc84f6243de991a063a0bbe17feca6fdecddd Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Mar 2011 17:28:43 +0000 Subject: [PATCH 63/71] topup summary update --- .../android/fbreader/network/NetworkCatalogActivity.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index ceb183535..1f7f6d469 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -31,6 +31,7 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.NetworkLibrary; import org.geometerplus.fbreader.network.NetworkTree; import org.geometerplus.fbreader.network.tree.*; +import org.geometerplus.fbreader.tree.FBTree; public class NetworkCatalogActivity extends NetworkBaseActivity implements UserRegistrationConstants { public static final String CATALOG_KEY_KEY = "org.geometerplus.android.fbreader.network.CatalogKey"; @@ -143,6 +144,11 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR void onModelChanged() { notifyDataSetChanged(); + for (FBTree child : myTree.subTrees()) { + if (child instanceof TopUpTree) { + child.invalidateChildren(); + } + } } } From aec9eaa656ce6384c1ea3df268b5144d6780a173 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Mar 2011 18:11:11 +0000 Subject: [PATCH 64/71] topup action fully restored --- .../fbreader/network/NetworkBaseActivity.java | 41 +++++++------------ .../network/NetworkCatalogActions.java | 4 +- .../network/NetworkCatalogActivity.java | 38 ++++++++++++++--- .../android/fbreader/network/NetworkView.java | 14 ++++--- 4 files changed, 59 insertions(+), 38 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java index 7ae3475c5..a7c8b1a80 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java @@ -187,42 +187,31 @@ abstract class NetworkBaseActivity extends ListActivity implements NetworkView.E @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - NetworkTree tree = null; + System.err.println("onCreateContextMenu -1"); if (menuInfo != null) { final int position = ((AdapterView.AdapterContextMenuInfo)menuInfo).position; - tree = (NetworkTree)getListAdapter().getItem(position); - } else { - tree = getDefaultTree(); - } - if (tree != null) { - final NetworkTreeActions actions = NetworkView.Instance().getActions(tree); - if (actions != null) { - actions.buildContextMenu(this, menu, tree); + final NetworkTree tree = (NetworkTree)getListAdapter().getItem(position); + if (tree != null) { + final NetworkTreeActions actions = NetworkView.Instance().getActions(tree); + if (actions != null) { + actions.buildContextMenu(this, menu, tree); + return; + } } } - } - - private NetworkTree myDefaultTree; - protected NetworkTree getDefaultTree() { - return myDefaultTree; - } - protected void setDefaultTree(NetworkTree tree) { - myDefaultTree = tree; + super.onCreateContextMenu(menu, view, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { - NetworkTree tree = null; if (item != null && item.getMenuInfo() != null) { final int position = ((AdapterView.AdapterContextMenuInfo)item.getMenuInfo()).position; - tree = (NetworkTree)getListAdapter().getItem(position); - } else { - tree = getDefaultTree(); - } - if (tree != null) { - final NetworkTreeActions actions = NetworkView.Instance().getActions(tree); - if (actions != null && actions.runAction(this, tree, item.getItemId())) { - return true; + final NetworkTree tree = (NetworkTree)getListAdapter().getItem(position); + if (tree != null) { + final NetworkTreeActions actions = NetworkView.Instance().getActions(tree); + if (actions != null && actions.runAction(this, tree, item.getItemId())) { + return true; + } } } return super.onContextItemSelected(item); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 2bb0f084f..3ea360933 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -71,7 +71,7 @@ class NetworkCatalogActions extends NetworkTreeActions { @Override public void buildContextMenu(Activity activity, ContextMenu menu, NetworkTree tree) { - final NetworkCatalogTree catalogTree = (NetworkCatalogTree) tree; + final NetworkCatalogTree catalogTree = (NetworkCatalogTree)tree; final NetworkCatalogItem item = catalogTree.Item; menu.setHeaderTitle(tree.getName()); @@ -244,7 +244,7 @@ class NetworkCatalogActions extends NetworkTreeActions { doSignOut(activity, (NetworkCatalogTree)tree); return true; case REFILL_ACCOUNT_ITEM_ID: - //new RefillAccountActions().runStandalone(activity, ((RefillAccountTree)activity.getDefaultTree()).Link); + new RefillAccountActions().runStandalone(activity, ((NetworkCatalogTree)tree).Item.Link); return true; case CUSTOM_CATALOG_EDIT: { diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index 1f7f6d469..787dcea45 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -28,8 +28,7 @@ import android.content.Intent; import org.geometerplus.zlibrary.core.network.ZLNetworkException; -import org.geometerplus.fbreader.network.NetworkLibrary; -import org.geometerplus.fbreader.network.NetworkTree; +import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.tree.*; import org.geometerplus.fbreader.tree.FBTree; @@ -66,10 +65,39 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR setListAdapter(new CatalogAdapter()); getListView().invalidateViews(); setupTitle(); - if (myTree instanceof NetworkCatalogTree && - Util.isAccountRefillingSupported(this, ((NetworkCatalogTree)myTree).Item.Link)) { - //setDefaultTree(new RefillAccountTree((NetworkCatalogTree)myTree)); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { + System.err.println("onCreateContextMenu 0"); + if (menuInfo == null && myTree instanceof NetworkCatalogTree) { + System.err.println("onCreateContextMenu 1"); + final INetworkLink link = ((NetworkCatalogTree)myTree).Item.Link; + if (Util.isAccountRefillingSupported(this, link)) { + System.err.println("onCreateContextMenu 2"); + final RefillAccountActions actions = NetworkView.Instance().getTopUpActions(); + if (actions != null) { + System.err.println("onCreateContextMenu 3"); + actions.buildContextMenu(this, menu, link); + return; + } + } } + super.onCreateContextMenu(menu, view, menuInfo); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + if ((item == null || item.getMenuInfo() == null) && myTree instanceof NetworkCatalogTree) { + final INetworkLink link = ((NetworkCatalogTree)myTree).Item.Link; + if (Util.isAccountRefillingSupported(this, link)) { + final RefillAccountActions actions = NetworkView.Instance().getTopUpActions(); + if (actions != null && actions.runAction(this, link, item.getItemId())) { + return true; + } + } + } + return super.onContextItemSelected(item); } @Override diff --git a/src/org/geometerplus/android/fbreader/network/NetworkView.java b/src/org/geometerplus/android/fbreader/network/NetworkView.java index 9a96abf6f..1247c7c7a 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkView.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkView.java @@ -45,12 +45,13 @@ class NetworkView { return ourInstance; } + private volatile boolean myInitialized; + private final ArrayList myActions = new ArrayList(); + private RefillAccountActions myTopUpActions; + private NetworkView() { } - - private volatile boolean myInitialized; - public boolean isInitialized() { return myInitialized; } @@ -65,7 +66,8 @@ class NetworkView { myActions.add(new NetworkBookActions()); myActions.add(new NetworkCatalogActions()); myActions.add(new SearchItemActions()); - myActions.add(new RefillAccountActions()); + myTopUpActions = new RefillAccountActions(); + myActions.add(myTopUpActions); myActions.add(new AddCustomCatalogItemActions()); myActions.trimToSize(); @@ -89,7 +91,9 @@ class NetworkView { * NetworkLibraryItem's actions */ - private final ArrayList myActions = new ArrayList(); + public RefillAccountActions getTopUpActions() { + return myTopUpActions; + } public NetworkTreeActions getActions(NetworkTree tree) { for (NetworkTreeActions actions: myActions) { From ee68b9750f802686cb0c1e49a449d3ddc1c89106 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 5 Mar 2011 23:51:46 +0000 Subject: [PATCH 65/71] new actions in main menu for basket catalog --- assets/resources/application/en.xml | 2 + .../network/NetworkCatalogActions.java | 9 +++- .../network/NetworkCatalogActivity.java | 4 -- .../fbreader/network/AbstractNetworkLink.java | 43 +++++++++++++++++++ .../BasketItem.java} | 8 ++-- .../network/opds/NetworkOPDSFeedReader.java | 3 +- .../network/opds/OPDSNetworkLink.java | 43 ------------------- 7 files changed, 58 insertions(+), 54 deletions(-) rename src/org/geometerplus/fbreader/network/{authentication/litres/LitResBasketItem.java => opds/BasketItem.java} (83%) diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index a6716c999..7f81db258 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -113,6 +113,8 @@ + + diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 3ea360933..86d3835bb 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -40,11 +40,11 @@ import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.tree.NetworkTreeFactory; import org.geometerplus.fbreader.network.tree.NetworkCatalogTree; import org.geometerplus.fbreader.network.tree.NetworkCatalogRootTree; +import org.geometerplus.fbreader.network.opds.BasketItem; import org.geometerplus.fbreader.network.authentication.*; class NetworkCatalogActions extends NetworkTreeActions { - public static final int OPEN_CATALOG_ITEM_ID = 0; public static final int OPEN_IN_BROWSER_ITEM_ID = 1; public static final int RELOAD_ITEM_ID = 2; @@ -56,6 +56,9 @@ class NetworkCatalogActions extends NetworkTreeActions { public static final int CUSTOM_CATALOG_EDIT = 7; public static final int CUSTOM_CATALOG_REMOVE = 8; + public static final int BASKET_CLEAR = 9; + public static final int BASKET_BUY_ALL_BOOKS = 10; + @Override public boolean canHandleTree(NetworkTree tree) { return tree instanceof NetworkCatalogTree; @@ -153,6 +156,10 @@ class NetworkCatalogActions extends NetworkTreeActions { addOptionsItem(menu, SIGNUP_ITEM_ID, "signUp"); addOptionsItem(menu, SIGNOUT_ITEM_ID, "signOut", ""); addOptionsItem(menu, REFILL_ACCOUNT_ITEM_ID, "refillAccount"); + if (((NetworkCatalogTree)tree).Item instanceof BasketItem) { + addOptionsItem(menu, BASKET_CLEAR, "clearBasket"); + addOptionsItem(menu, BASKET_BUY_ALL_BOOKS, "buyAllBooks"); + } return true; } diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java index 787dcea45..d96eeeb56 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActivity.java @@ -69,15 +69,11 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - System.err.println("onCreateContextMenu 0"); if (menuInfo == null && myTree instanceof NetworkCatalogTree) { - System.err.println("onCreateContextMenu 1"); final INetworkLink link = ((NetworkCatalogTree)myTree).Item.Link; if (Util.isAccountRefillingSupported(this, link)) { - System.err.println("onCreateContextMenu 2"); final RefillAccountActions actions = NetworkView.Instance().getTopUpActions(); if (actions != null) { - System.err.println("onCreateContextMenu 3"); actions.buildContextMenu(this, menu, link); return; } diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index 83c81677a..d7c041720 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -22,6 +22,7 @@ package org.geometerplus.fbreader.network; import java.util.*; import org.geometerplus.zlibrary.core.util.ZLMiscUtil; +import org.geometerplus.zlibrary.core.options.ZLStringListOption; public abstract class AbstractNetworkLink implements INetworkLink { protected String mySiteName; @@ -30,6 +31,9 @@ public abstract class AbstractNetworkLink implements INetworkLink { protected final String myLanguage; protected final TreeMap myInfos; + private boolean mySupportsBasket; + private final ZLStringListOption myBooksInBasketOption; + /** * Creates new NetworkLink instance. * @@ -45,6 +49,7 @@ public abstract class AbstractNetworkLink implements INetworkLink { mySummary = summary; myLanguage = language != null ? language : "multi"; myInfos = new TreeMap(infos); + myBooksInBasketOption = new ZLStringListOption(siteName, "Basket", null); } public final String getSiteName() { @@ -76,6 +81,44 @@ public abstract class AbstractNetworkLink implements INetworkLink { return myInfos.keySet(); } + public final void setSupportsBasket() { + mySupportsBasket = true; + } + + public final boolean supportsBasket() { + return mySupportsBasket; + } + + public final void addToBasket(NetworkBookItem book) { + if (supportsBasket() && book.Id != null && !"".equals(book.Id)) { + List ids = myBooksInBasketOption.getValue(); + if (!ids.contains(book.Id)) { + ids = new ArrayList(ids); + ids.add(book.Id); + myBooksInBasketOption.setValue(ids); + } + } + } + + public final void removeFromBasket(NetworkBookItem book) { + if (supportsBasket() && book.Id != null && !"".equals(book.Id)) { + List ids = myBooksInBasketOption.getValue(); + if (ids.contains(book.Id)) { + ids = new ArrayList(ids); + ids.remove(book.Id); + myBooksInBasketOption.setValue(ids); + } + } + } + + public final boolean isBookInBasket(NetworkBookItem book) { + return myBooksInBasketOption.getValue().contains(book.Id); + } + + public final List booksInBasket() { + return myBooksInBasketOption.getValue(); + } + public NetworkOperationData createOperationData(NetworkOperationData.OnNewItemListener listener) { return new NetworkOperationData(this, listener); } diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java b/src/org/geometerplus/fbreader/network/opds/BasketItem.java similarity index 83% rename from src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java rename to src/org/geometerplus/fbreader/network/opds/BasketItem.java index c308f4cb9..331d63e17 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBasketItem.java +++ b/src/org/geometerplus/fbreader/network/opds/BasketItem.java @@ -17,7 +17,7 @@ * 02110-1301, USA. */ -package org.geometerplus.fbreader.network.authentication.litres; +package org.geometerplus.fbreader.network.opds; import java.util.Map; @@ -28,10 +28,10 @@ import org.geometerplus.fbreader.network.NetworkBookItem; import org.geometerplus.fbreader.network.opds.OPDSNetworkLink; import org.geometerplus.fbreader.network.opds.OPDSCatalogItem; -public class LitResBasketItem extends OPDSCatalogItem { - public LitResBasketItem(INetworkLink link, String title, String summary, String cover, Map urlByType, Accessibility accessibility) { +public class BasketItem extends OPDSCatalogItem { + BasketItem(OPDSNetworkLink link, String title, String summary, String cover, Map urlByType, Accessibility accessibility) { super(link, title, summary, cover, urlByType, accessibility, CatalogType.BY_SERIES); - ((OPDSNetworkLink)link).setSupportsBasket(); + link.setSupportsBasket(); } @Override diff --git a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java index 2c004d2c3..ba6803c05 100644 --- a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java +++ b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java @@ -26,7 +26,6 @@ import org.geometerplus.zlibrary.core.util.ZLNetworkUtil; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.atom.*; -import org.geometerplus.fbreader.network.authentication.litres.LitResBasketItem; import org.geometerplus.fbreader.network.authentication.litres.LitResBookshelfItem; import org.geometerplus.fbreader.network.authentication.litres.LitResRecommendationsItem; @@ -459,7 +458,7 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes opdsLink.getCondition(entry.Id.Uri) ); } else if (REL_BASKET.equals(litresRel)) { - return new LitResBasketItem( + return new BasketItem( opdsLink, entry.Title, annotation, diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index 532153c8e..4e3aaf6e9 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -30,7 +30,6 @@ import org.geometerplus.zlibrary.core.util.ZLMiscUtil; import org.geometerplus.zlibrary.core.util.ZLNetworkUtil; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; -import org.geometerplus.zlibrary.core.options.ZLStringListOption; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; @@ -43,16 +42,12 @@ public class OPDSNetworkLink extends AbstractNetworkLink { private final Map myExtraData = new HashMap(); private NetworkAuthenticationManager myAuthenticationManager; - private boolean mySupportsBasket; - private final ZLStringListOption myBooksInBasketOption; - private final boolean myHasStableIdentifiers; OPDSNetworkLink(String siteName, String title, String summary, String language, Map infos, boolean hasStableIdentifiers) { super(siteName, title, summary, language, infos); myHasStableIdentifiers = hasStableIdentifiers; - myBooksInBasketOption = new ZLStringListOption(siteName, "Basket", null); } final void setRelationAliases(Map relationAliases) { @@ -148,44 +143,6 @@ public class OPDSNetworkLink extends AbstractNetworkLink { return myAuthenticationManager; } - public final void setSupportsBasket() { - mySupportsBasket = true; - } - - public final boolean supportsBasket() { - return mySupportsBasket; - } - - public final void addToBasket(NetworkBookItem book) { - if (supportsBasket() && book.Id != null && !"".equals(book.Id)) { - List ids = myBooksInBasketOption.getValue(); - if (!ids.contains(book.Id)) { - ids = new ArrayList(ids); - ids.add(book.Id); - myBooksInBasketOption.setValue(ids); - } - } - } - - public final void removeFromBasket(NetworkBookItem book) { - if (supportsBasket() && book.Id != null && !"".equals(book.Id)) { - List ids = myBooksInBasketOption.getValue(); - if (ids.contains(book.Id)) { - ids = new ArrayList(ids); - ids.remove(book.Id); - myBooksInBasketOption.setValue(ids); - } - } - } - - public final boolean isBookInBasket(NetworkBookItem book) { - return myBooksInBasketOption.getValue().contains(book.Id); - } - - public final List booksInBasket() { - return myBooksInBasketOption.getValue(); - } - public String rewriteUrl(String url, boolean isUrlExternal) { for (URLRewritingRule rule: myUrlRewritingRules) { if (rule.Apply != URLRewritingRule.APPLY_ALWAYS) { From 9bc23d1b27f593c49c8cfd17917ab7f7d0ee4bf6 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 6 Mar 2011 00:01:16 +0000 Subject: [PATCH 66/71] updated Thai translation --- assets/resources/application/th.xml | 10 +++++----- assets/resources/zlibrary/th.xml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/resources/application/th.xml b/assets/resources/application/th.xml index a503eab27..fa2355392 100644 --- a/assets/resources/application/th.xml +++ b/assets/resources/application/th.xml @@ -251,12 +251,12 @@ - - + + - - - + + + diff --git a/assets/resources/zlibrary/th.xml b/assets/resources/zlibrary/th.xml index 21594c60b..16a07e026 100644 --- a/assets/resources/zlibrary/th.xml +++ b/assets/resources/zlibrary/th.xml @@ -75,7 +75,7 @@ - + From bfc85cfd6a209fa197de43ee3bbee86b5cbf3578 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 6 Mar 2011 00:33:59 +0000 Subject: [PATCH 67/71] Basket interface has been separated; 'clear basket' action --- .../fbreader/network/NetworkBookActions.java | 9 ++--- .../network/NetworkCatalogActions.java | 24 ++++++++----- .../fbreader/network/AbstractNetworkLink.java | 35 ++++++++++++------- .../geometerplus/fbreader/network/Basket.java | 30 ++++++++++++++++ .../fbreader/network/INetworkLink.java | 6 +--- .../fbreader/network/NetworkCatalogItem.java | 2 +- .../litres/LitResRecommendationsItem.java | 16 +++++---- .../fbreader/network/opds/BasketItem.java | 2 +- 8 files changed, 85 insertions(+), 39 deletions(-) create mode 100644 src/org/geometerplus/fbreader/network/Basket.java diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java index 27500fa85..bf3c9c68c 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBookActions.java @@ -185,8 +185,9 @@ class NetworkBookActions extends NetworkTreeActions { final String price = ((BuyBookReference) reference).Price; actions.add(new Action(id, "buy", price)); } - if (book.Link.supportsBasket()) { - if (book.Link.isBookInBasket(book)) { + final Basket basket = book.Link.basket(); + if (basket != null) { + if (basket.contains(book)) { actions.add(new Action(REMOVE_BOOK_FROM_BASKET, "removeFromBasket")); } else { actions.add(new Action(ADD_BOOK_TO_BASKET, "addToBasket")); @@ -262,10 +263,10 @@ class NetworkBookActions extends NetworkTreeActions { NetworkView.Instance().showBookInfoActivity(activity, book); return true; case ADD_BOOK_TO_BASKET: - book.Link.addToBasket(book); + book.Link.basket().add(book); return true; case REMOVE_BOOK_FROM_BASKET: - book.Link.removeFromBasket(book); + book.Link.basket().remove(book); return true; } return false; diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 86d3835bb..c48209758 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -228,43 +228,49 @@ class NetworkCatalogActions extends NetworkTreeActions { if (consumeByVisibility(activity, tree, actionCode)) { return true; } + final NetworkCatalogTree catalogTree = (NetworkCatalogTree)tree; switch (actionCode) { case OPEN_CATALOG_ITEM_ID: - doExpandCatalog(activity, (NetworkCatalogTree)tree); + doExpandCatalog(activity, catalogTree); return true; case OPEN_IN_BROWSER_ITEM_ID: Util.openInBrowser( activity, - ((NetworkCatalogTree)tree).Item.URLByType.get(NetworkCatalogItem.URL_HTML_PAGE) + catalogTree.Item.URLByType.get(NetworkCatalogItem.URL_HTML_PAGE) ); return true; case RELOAD_ITEM_ID: - doReloadCatalog(activity, (NetworkCatalogTree)tree); + doReloadCatalog(activity, catalogTree); return true; case SIGNIN_ITEM_ID: - AuthenticationDialog.show(activity, ((NetworkCatalogTree)tree).Item.Link, null); + AuthenticationDialog.show(activity, catalogTree.Item.Link, null); return true; case SIGNUP_ITEM_ID: - Util.runRegistrationDialog(activity, ((NetworkCatalogTree)tree).Item.Link); + Util.runRegistrationDialog(activity, catalogTree.Item.Link); return true; case SIGNOUT_ITEM_ID: - doSignOut(activity, (NetworkCatalogTree)tree); + doSignOut(activity, catalogTree); return true; case REFILL_ACCOUNT_ITEM_ID: - new RefillAccountActions().runStandalone(activity, ((NetworkCatalogTree)tree).Item.Link); + new RefillAccountActions().runStandalone(activity, catalogTree.Item.Link); return true; case CUSTOM_CATALOG_EDIT: { final Intent intent = new Intent(activity, AddCustomCatalogActivity.class); NetworkLibraryActivity.addLinkToIntent( intent, - (ICustomNetworkLink)((NetworkCatalogTree)tree).Item.Link + (ICustomNetworkLink)catalogTree.Item.Link ); activity.startActivity(intent); return true; } case CUSTOM_CATALOG_REMOVE: - removeCustomLink((ICustomNetworkLink)((NetworkCatalogTree)tree).Item.Link); + removeCustomLink((ICustomNetworkLink)catalogTree.Item.Link); + return true; + case BASKET_CLEAR: + catalogTree.Item.Link.basket().clear(); + return true; + case BASKET_BUY_ALL_BOOKS: return true; } return false; diff --git a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java index d7c041720..681be324d 100644 --- a/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/AbstractNetworkLink.java @@ -24,15 +24,14 @@ import java.util.*; import org.geometerplus.zlibrary.core.util.ZLMiscUtil; import org.geometerplus.zlibrary.core.options.ZLStringListOption; -public abstract class AbstractNetworkLink implements INetworkLink { +public abstract class AbstractNetworkLink implements INetworkLink, Basket { protected String mySiteName; protected String myTitle; protected String mySummary; protected final String myLanguage; protected final TreeMap myInfos; - private boolean mySupportsBasket; - private final ZLStringListOption myBooksInBasketOption; + private ZLStringListOption myBooksInBasketOption; /** * Creates new NetworkLink instance. @@ -49,7 +48,6 @@ public abstract class AbstractNetworkLink implements INetworkLink { mySummary = summary; myLanguage = language != null ? language : "multi"; myInfos = new TreeMap(infos); - myBooksInBasketOption = new ZLStringListOption(siteName, "Basket", null); } public final String getSiteName() { @@ -82,15 +80,18 @@ public abstract class AbstractNetworkLink implements INetworkLink { } public final void setSupportsBasket() { - mySupportsBasket = true; + if (myBooksInBasketOption == null) { + myBooksInBasketOption = new ZLStringListOption(mySiteName, "Basket", null); + } } - public final boolean supportsBasket() { - return mySupportsBasket; + public final Basket basket() { + return myBooksInBasketOption != null ? this : null; } - public final void addToBasket(NetworkBookItem book) { - if (supportsBasket() && book.Id != null && !"".equals(book.Id)) { + // method from Basket interface + public final void add(NetworkBookItem book) { + if (book.Id != null && !"".equals(book.Id)) { List ids = myBooksInBasketOption.getValue(); if (!ids.contains(book.Id)) { ids = new ArrayList(ids); @@ -100,8 +101,9 @@ public abstract class AbstractNetworkLink implements INetworkLink { } } - public final void removeFromBasket(NetworkBookItem book) { - if (supportsBasket() && book.Id != null && !"".equals(book.Id)) { + // method from Basket interface + public final void remove(NetworkBookItem book) { + if (book.Id != null && !"".equals(book.Id)) { List ids = myBooksInBasketOption.getValue(); if (ids.contains(book.Id)) { ids = new ArrayList(ids); @@ -111,11 +113,18 @@ public abstract class AbstractNetworkLink implements INetworkLink { } } - public final boolean isBookInBasket(NetworkBookItem book) { + // method from Basket interface + public final void clear() { + myBooksInBasketOption.setValue(null); + } + + // method from Basket interface + public final boolean contains(NetworkBookItem book) { return myBooksInBasketOption.getValue().contains(book.Id); } - public final List booksInBasket() { + // method from Basket interface + public final List bookIds() { return myBooksInBasketOption.getValue(); } diff --git a/src/org/geometerplus/fbreader/network/Basket.java b/src/org/geometerplus/fbreader/network/Basket.java new file mode 100644 index 000000000..c99ef1e4b --- /dev/null +++ b/src/org/geometerplus/fbreader/network/Basket.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2010-2011 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.fbreader.network; + +import java.util.*; + +public interface Basket { + void add(NetworkBookItem book); + void remove(NetworkBookItem book); + boolean contains(NetworkBookItem book); + List bookIds(); + void clear(); +} diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index c2918cacb..2dadbdb57 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -60,11 +60,7 @@ public interface INetworkLink { NetworkCatalogItem libraryItem(); NetworkAuthenticationManager authenticationManager(); - boolean supportsBasket(); - void addToBasket(NetworkBookItem book); - void removeFromBasket(NetworkBookItem book); - boolean isBookInBasket(NetworkBookItem book); - List booksInBasket(); + Basket basket(); String rewriteUrl(String url, boolean isUrlExternal); } diff --git a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java index 2e9292d26..34e6c1ad5 100644 --- a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java @@ -131,7 +131,7 @@ public abstract class NetworkCatalogItem extends NetworkLibraryItem { return ZLBoolean3.B3_UNDEFINED; } case HAS_BOOKS: - if (Link.booksInBasket().size() > 0 || + if ((Link.basket() != null && Link.basket().bookIds().size() > 0) || (mgr != null && mgr.purchasedBooks().size() > 0)) { return ZLBoolean3.B3_TRUE; } else { diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java index 3996fb009..e8d73d99b 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResRecommendationsItem.java @@ -24,6 +24,7 @@ import java.util.Map; import org.geometerplus.zlibrary.core.util.ZLNetworkUtil; import org.geometerplus.fbreader.network.INetworkLink; +import org.geometerplus.fbreader.network.Basket; import org.geometerplus.fbreader.network.NetworkBookItem; import org.geometerplus.fbreader.network.opds.OPDSCatalogItem; import org.geometerplus.fbreader.network.opds.OPDSNetworkLink; @@ -47,13 +48,16 @@ public class LitResRecommendationsItem extends OPDSCatalogItem { } builder.append(book.Id); } - for (String bookId : Link.booksInBasket()) { - if (flag) { - builder.append(','); - } else { - flag = true; + final Basket basket = Link.basket(); + if (basket != null) { + for (String bookId : basket.bookIds()) { + if (flag) { + builder.append(','); + } else { + flag = true; + } + builder.append(bookId); } - builder.append(bookId); } return ZLNetworkUtil.appendParameter(URLByType.get(URL_CATALOG), "ids", builder.toString()); diff --git a/src/org/geometerplus/fbreader/network/opds/BasketItem.java b/src/org/geometerplus/fbreader/network/opds/BasketItem.java index 331d63e17..a54d7c619 100644 --- a/src/org/geometerplus/fbreader/network/opds/BasketItem.java +++ b/src/org/geometerplus/fbreader/network/opds/BasketItem.java @@ -38,7 +38,7 @@ public class BasketItem extends OPDSCatalogItem { protected String getUrl() { final StringBuilder builder = new StringBuilder(); boolean flag = false; - for (String bookId : Link.booksInBasket()) { + for (String bookId : Link.basket().bookIds()) { if (flag) { builder.append(','); } else { From a1d57259db9541b938258f65b6be4e9bb736d854 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 6 Mar 2011 01:03:03 +0000 Subject: [PATCH 68/71] 'empty basket' message --- assets/resources/application/cs.xml | 1 + assets/resources/application/de.xml | 1 + assets/resources/application/en.xml | 1 + assets/resources/application/fr.xml | 1 + assets/resources/application/gl.xml | 1 + assets/resources/application/hu.xml | 1 + assets/resources/application/it.xml | 1 + assets/resources/application/nl.xml | 1 + assets/resources/application/ru.xml | 1 + assets/resources/application/th.xml | 6 ++---- assets/resources/application/uk.xml | 1 + assets/resources/application/vi.xml | 1 + assets/resources/application/zh.xml | 1 + .../fbreader/network/NetworkCatalogActions.java | 12 ++++++++++-- 14 files changed, 24 insertions(+), 6 deletions(-) diff --git a/assets/resources/application/cs.xml b/assets/resources/application/cs.xml index 1f3675b06..2b8fc43f2 100644 --- a/assets/resources/application/cs.xml +++ b/assets/resources/application/cs.xml @@ -621,6 +621,7 @@ + diff --git a/assets/resources/application/de.xml b/assets/resources/application/de.xml index 798cce98b..ebf522992 100644 --- a/assets/resources/application/de.xml +++ b/assets/resources/application/de.xml @@ -622,6 +622,7 @@ + diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index 7f81db258..08f69ead0 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -624,6 +624,7 @@ + diff --git a/assets/resources/application/fr.xml b/assets/resources/application/fr.xml index e135a0364..44806484c 100644 --- a/assets/resources/application/fr.xml +++ b/assets/resources/application/fr.xml @@ -624,6 +624,7 @@ + diff --git a/assets/resources/application/gl.xml b/assets/resources/application/gl.xml index 0727f73fa..7458d6eed 100644 --- a/assets/resources/application/gl.xml +++ b/assets/resources/application/gl.xml @@ -621,6 +621,7 @@ + diff --git a/assets/resources/application/hu.xml b/assets/resources/application/hu.xml index 0ec9cff66..c32199118 100644 --- a/assets/resources/application/hu.xml +++ b/assets/resources/application/hu.xml @@ -621,6 +621,7 @@ + diff --git a/assets/resources/application/it.xml b/assets/resources/application/it.xml index a83e043da..38cb7876c 100644 --- a/assets/resources/application/it.xml +++ b/assets/resources/application/it.xml @@ -621,6 +621,7 @@ + diff --git a/assets/resources/application/nl.xml b/assets/resources/application/nl.xml index 53bb8f849..ce7b85808 100644 --- a/assets/resources/application/nl.xml +++ b/assets/resources/application/nl.xml @@ -621,6 +621,7 @@ + diff --git a/assets/resources/application/ru.xml b/assets/resources/application/ru.xml index 37a817825..912411bb8 100644 --- a/assets/resources/application/ru.xml +++ b/assets/resources/application/ru.xml @@ -620,6 +620,7 @@ + diff --git a/assets/resources/application/th.xml b/assets/resources/application/th.xml index fa2355392..ba0c33430 100644 --- a/assets/resources/application/th.xml +++ b/assets/resources/application/th.xml @@ -573,10 +573,6 @@ - - - - @@ -624,6 +620,8 @@ + + diff --git a/assets/resources/application/uk.xml b/assets/resources/application/uk.xml index 24f781809..6c8a7d4ed 100644 --- a/assets/resources/application/uk.xml +++ b/assets/resources/application/uk.xml @@ -621,6 +621,7 @@ + diff --git a/assets/resources/application/vi.xml b/assets/resources/application/vi.xml index 40e0f9e6c..c644c19fd 100644 --- a/assets/resources/application/vi.xml +++ b/assets/resources/application/vi.xml @@ -621,6 +621,7 @@ + diff --git a/assets/resources/application/zh.xml b/assets/resources/application/zh.xml index d772f0b45..9578ea31a 100644 --- a/assets/resources/application/zh.xml +++ b/assets/resources/application/zh.xml @@ -621,6 +621,7 @@ + diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index c48209758..09200ffe4 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -81,7 +81,8 @@ class NetworkCatalogActions extends NetworkTreeActions { boolean hasItems = false; final String catalogUrl = item.URLByType.get(NetworkCatalogItem.URL_CATALOG); - if (catalogUrl != null) { + if (catalogUrl != null && + (!(item instanceof BasketItem) || item.Link.basket().bookIds().size() > 0)) { addMenuItem(menu, OPEN_CATALOG_ITEM_ID, "openCatalog"); hasItems = true; } @@ -231,8 +232,15 @@ class NetworkCatalogActions extends NetworkTreeActions { final NetworkCatalogTree catalogTree = (NetworkCatalogTree)tree; switch (actionCode) { case OPEN_CATALOG_ITEM_ID: - doExpandCatalog(activity, catalogTree); + { + final NetworkCatalogItem item = catalogTree.Item; + if (item instanceof BasketItem && item.Link.basket().bookIds().size() == 0) { + UIUtil.showErrorMessage(activity, "emptyBasket"); + } else { + doExpandCatalog(activity, catalogTree); + } return true; + } case OPEN_IN_BROWSER_ITEM_ID: Util.openInBrowser( activity, From 5dad4526683c7db3929f900c237bea7e9c1001b2 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 6 Mar 2011 12:48:42 +0000 Subject: [PATCH 69/71] catalog info in NetworkBookInfoActivity; resources refactoring; Basket is disabled --- assets/resources/application/cs.xml | 1 + assets/resources/application/de.xml | 1 + assets/resources/application/en.xml | 1 + assets/resources/application/fr.xml | 1 + assets/resources/application/gl.xml | 1 + assets/resources/application/hu.xml | 1 + assets/resources/application/it.xml | 1 + assets/resources/application/nl.xml | 1 + assets/resources/application/ru.xml | 1 + assets/resources/application/th.xml | 1 + assets/resources/application/uk.xml | 1 + assets/resources/application/vi.xml | 1 + assets/resources/application/zh.xml | 1 + res/layout/network_book.xml | 116 +----------------- .../android/fbreader/BookInfoActivity.java | 2 +- .../network/NetworkBookInfoActivity.java | 59 ++++++--- .../network/opds/NetworkOPDSFeedReader.java | 3 + 17 files changed, 63 insertions(+), 130 deletions(-) diff --git a/assets/resources/application/cs.xml b/assets/resources/application/cs.xml index 2b8fc43f2..7a7f4d190 100644 --- a/assets/resources/application/cs.xml +++ b/assets/resources/application/cs.xml @@ -123,6 +123,7 @@ + diff --git a/assets/resources/application/de.xml b/assets/resources/application/de.xml index ebf522992..2a27a143a 100644 --- a/assets/resources/application/de.xml +++ b/assets/resources/application/de.xml @@ -124,6 +124,7 @@ + diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index 08f69ead0..5b880a09c 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -126,6 +126,7 @@ + diff --git a/assets/resources/application/fr.xml b/assets/resources/application/fr.xml index 44806484c..d3a53d408 100644 --- a/assets/resources/application/fr.xml +++ b/assets/resources/application/fr.xml @@ -126,6 +126,7 @@ + diff --git a/assets/resources/application/gl.xml b/assets/resources/application/gl.xml index 7458d6eed..9692dba8d 100644 --- a/assets/resources/application/gl.xml +++ b/assets/resources/application/gl.xml @@ -123,6 +123,7 @@ + diff --git a/assets/resources/application/hu.xml b/assets/resources/application/hu.xml index c32199118..2728284d9 100644 --- a/assets/resources/application/hu.xml +++ b/assets/resources/application/hu.xml @@ -123,6 +123,7 @@ + diff --git a/assets/resources/application/it.xml b/assets/resources/application/it.xml index 38cb7876c..1a886d7d4 100644 --- a/assets/resources/application/it.xml +++ b/assets/resources/application/it.xml @@ -123,6 +123,7 @@ + diff --git a/assets/resources/application/nl.xml b/assets/resources/application/nl.xml index ce7b85808..eb64c7c63 100644 --- a/assets/resources/application/nl.xml +++ b/assets/resources/application/nl.xml @@ -123,6 +123,7 @@ + diff --git a/assets/resources/application/ru.xml b/assets/resources/application/ru.xml index 912411bb8..e6e5b7b36 100644 --- a/assets/resources/application/ru.xml +++ b/assets/resources/application/ru.xml @@ -122,6 +122,7 @@ + diff --git a/assets/resources/application/th.xml b/assets/resources/application/th.xml index ba0c33430..315cbb2e2 100644 --- a/assets/resources/application/th.xml +++ b/assets/resources/application/th.xml @@ -123,6 +123,7 @@ + diff --git a/assets/resources/application/uk.xml b/assets/resources/application/uk.xml index 6c8a7d4ed..69b79ffa3 100644 --- a/assets/resources/application/uk.xml +++ b/assets/resources/application/uk.xml @@ -123,6 +123,7 @@ + diff --git a/assets/resources/application/vi.xml b/assets/resources/application/vi.xml index c644c19fd..aaa724007 100644 --- a/assets/resources/application/vi.xml +++ b/assets/resources/application/vi.xml @@ -123,6 +123,7 @@ + diff --git a/assets/resources/application/zh.xml b/assets/resources/application/zh.xml index 9578ea31a..f58b8e38f 100644 --- a/assets/resources/application/zh.xml +++ b/assets/resources/application/zh.xml @@ -123,6 +123,7 @@ + diff --git a/res/layout/network_book.xml b/res/layout/network_book.xml index 82f540d0d..034318973 100644 --- a/res/layout/network_book.xml +++ b/res/layout/network_book.xml @@ -101,116 +101,12 @@ android:paddingRight="10dp" android:paddingTop="10dp" > - - - - - - - - - - - - - - - - - - - - + + + + + + 0) { findViewById(R.id.network_book_authors).setVisibility(View.VISIBLE); @@ -142,22 +161,22 @@ public class NetworkBookInfoActivity extends Activity implements NetworkView.Eve } authorsText.append(author.DisplayName); } - ((TextView) findViewById(R.id.network_book_authors_value)).setText(authorsText); + setPairValueText(R.id.network_book_authors, authorsText); } else { findViewById(R.id.network_book_authors).setVisibility(View.GONE); } if (myBook.SeriesTitle != null) { - findViewById(R.id.network_book_series).setVisibility(View.VISIBLE); - ((TextView) findViewById(R.id.network_book_series_value)).setText(myBook.SeriesTitle); + findViewById(R.id.network_book_series_title).setVisibility(View.VISIBLE); + setPairValueText(R.id.network_book_series_title, myBook.SeriesTitle); if (myBook.IndexInSeries > 0) { - ((TextView) findViewById(R.id.network_book_series_index_value)).setText(String.valueOf(myBook.IndexInSeries)); + setPairValueText(R.id.network_book_series_index, String.valueOf(myBook.IndexInSeries)); findViewById(R.id.network_book_series_index).setVisibility(View.VISIBLE); } else { findViewById(R.id.network_book_series_index).setVisibility(View.GONE); } } else { - findViewById(R.id.network_book_series).setVisibility(View.GONE); + findViewById(R.id.network_book_series_title).setVisibility(View.GONE); findViewById(R.id.network_book_series_index).setVisibility(View.GONE); } @@ -170,15 +189,17 @@ public class NetworkBookInfoActivity extends Activity implements NetworkView.Eve } tagsText.append(tag); } - ((TextView) findViewById(R.id.network_book_tags_value)).setText(tagsText); + setPairValueText(R.id.network_book_tags, tagsText); } else { findViewById(R.id.network_book_tags).setVisibility(View.GONE); } + + setPairValueText(R.id.network_book_catalog, myBook.Link.getTitle()); } private final void setupCover() { final View rootView = findViewById(R.id.network_book_root); - final ImageView coverView = (ImageView) findViewById(R.id.network_book_cover); + final ImageView coverView = (ImageView)findViewById(R.id.network_book_cover); final DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); @@ -252,7 +273,7 @@ public class NetworkBookInfoActivity extends Activity implements NetworkView.Eve } final int buttonId = buttons[buttonNumber++]; - TextView button = (TextView) findViewById(buttonId); + TextView button = (TextView)findViewById(buttonId); button.setText(text); button.setVisibility(View.VISIBLE); button.setOnClickListener(new View.OnClickListener() { diff --git a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java index ba6803c05..b9437ca59 100644 --- a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java +++ b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java @@ -458,6 +458,8 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes opdsLink.getCondition(entry.Id.Uri) ); } else if (REL_BASKET.equals(litresRel)) { + return null; + /* return new BasketItem( opdsLink, entry.Title, @@ -466,6 +468,7 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes urlMap, opdsLink.getCondition(entry.Id.Uri) ); + */ } else if (REL_TOPUP.equals(litresRel)) { return new TopUpItem(opdsLink, coverURL); } else { From 247e6937adf5ee61b22cbc27ad4238f1c62463fe Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 6 Mar 2011 13:19:08 +0000 Subject: [PATCH 70/71] renaming: NetworkLibraryItem -> NetworkItem --- .../fbreader/network/ItemsLoadingHandler.java | 22 ++++---- .../network/ItemsLoadingRunnable.java | 4 +- .../network/NetworkCatalogActions.java | 6 +-- .../network/NetworkSearchActivity.java | 6 +-- .../android/fbreader/network/NetworkView.java | 2 +- .../fbreader/network/NetworkBookItem.java | 4 +- .../network/NetworkBookItemComparator.java | 4 +- .../fbreader/network/NetworkCatalogItem.java | 2 +- ...tworkLibraryItem.java => NetworkItem.java} | 6 +-- .../fbreader/network/NetworkLibrary.java | 2 +- .../network/NetworkOperationData.java | 2 +- .../fbreader/network/NetworkTree.java | 8 +-- .../fbreader/network/TopUpItem.java | 2 +- .../litres/LitResAuthenticationManager.java | 6 +-- .../litres/LitResBookshelfItem.java | 52 +++++++++---------- .../litres/LitResXMLReader.java | 4 +- .../network/opds/NetworkOPDSFeedReader.java | 8 +-- .../tree/AddCustomCatalogItemTree.java | 4 +- .../network/tree/NetworkAuthorTree.java | 2 +- .../network/tree/NetworkBookTree.java | 2 +- .../network/tree/NetworkCatalogTree.java | 8 +-- .../network/tree/NetworkSeriesTree.java | 4 +- .../network/tree/NetworkTreeFactory.java | 4 +- .../fbreader/network/tree/RootTree.java | 4 +- .../fbreader/network/tree/SearchItemTree.java | 2 +- 25 files changed, 85 insertions(+), 85 deletions(-) rename src/org/geometerplus/fbreader/network/{NetworkLibraryItem.java => NetworkItem.java} (88%) diff --git a/src/org/geometerplus/android/fbreader/network/ItemsLoadingHandler.java b/src/org/geometerplus/android/fbreader/network/ItemsLoadingHandler.java index 75e28c3d9..d048538de 100644 --- a/src/org/geometerplus/android/fbreader/network/ItemsLoadingHandler.java +++ b/src/org/geometerplus/android/fbreader/network/ItemsLoadingHandler.java @@ -29,7 +29,7 @@ import android.os.Message; import android.os.Handler; import org.geometerplus.fbreader.network.INetworkLink; -import org.geometerplus.fbreader.network.NetworkLibraryItem; +import org.geometerplus.fbreader.network.NetworkItem; abstract class ItemsLoadingHandler extends Handler { @@ -37,20 +37,20 @@ abstract class ItemsLoadingHandler extends Handler { private static final int WHAT_UPDATE_ITEMS = 0; private static final int WHAT_FINISHED = 1; - private final LinkedList myItems = new LinkedList(); - private final HashMap> myUncommitedItems = new HashMap>(); + private final LinkedList myItems = new LinkedList(); + private final HashMap> myUncommitedItems = new HashMap>(); private final Object myItemsMonitor = new Object(); private volatile boolean myFinishProcessed; private final Object myFinishMonitor = new Object(); - public final void addItem(INetworkLink link, NetworkLibraryItem item) { + public final void addItem(INetworkLink link, NetworkItem item) { synchronized (myItemsMonitor) { myItems.add(item); - LinkedList uncommited = myUncommitedItems.get(link); + LinkedList uncommited = myUncommitedItems.get(link); if (uncommited == null) { - uncommited = new LinkedList(); + uncommited = new LinkedList(); myUncommitedItems.put(link, uncommited); } uncommited.add(item); @@ -59,7 +59,7 @@ abstract class ItemsLoadingHandler extends Handler { public final void commitItems(INetworkLink link) { synchronized (myItemsMonitor) { - LinkedList uncommited = myUncommitedItems.get(link); + LinkedList uncommited = myUncommitedItems.get(link); if (uncommited != null) { uncommited.clear(); } @@ -98,9 +98,9 @@ abstract class ItemsLoadingHandler extends Handler { } private final void doProcessFinish(String errorMessage, boolean interrupted) { - HashSet uncommitedItems = new HashSet(); + HashSet uncommitedItems = new HashSet(); synchronized (myUncommitedItems) { - for (LinkedList items: myUncommitedItems.values()) { + for (LinkedList items: myUncommitedItems.values()) { uncommitedItems.addAll(items); } } @@ -124,9 +124,9 @@ abstract class ItemsLoadingHandler extends Handler { // callbacks - public abstract void onUpdateItems(List items); + public abstract void onUpdateItems(List items); public abstract void afterUpdateItems(); - public abstract void onFinish(String errorMessage, boolean interrupted, Set uncommitedItems); + public abstract void onFinish(String errorMessage, boolean interrupted, Set uncommitedItems); @Override diff --git a/src/org/geometerplus/android/fbreader/network/ItemsLoadingRunnable.java b/src/org/geometerplus/android/fbreader/network/ItemsLoadingRunnable.java index ffa82bab1..4c3f4ec9b 100644 --- a/src/org/geometerplus/android/fbreader/network/ItemsLoadingRunnable.java +++ b/src/org/geometerplus/android/fbreader/network/ItemsLoadingRunnable.java @@ -26,7 +26,7 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.INetworkLink; import org.geometerplus.fbreader.network.NetworkOperationData; -import org.geometerplus.fbreader.network.NetworkLibraryItem; +import org.geometerplus.fbreader.network.NetworkItem; abstract class ItemsLoadingRunnable implements Runnable { private final ItemsLoadingHandler myHandler; @@ -99,7 +99,7 @@ abstract class ItemsLoadingRunnable implements Runnable { doLoading(new NetworkOperationData.OnNewItemListener() { private long myUpdateTime; private int myItemsNumber; - public void onNewItem(INetworkLink link, NetworkLibraryItem item) { + public void onNewItem(INetworkLink link, NetworkItem item) { myHandler.addItem(link, item); ++myItemsNumber; final long now = System.currentTimeMillis(); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java index 09200ffe4..5343b6642 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkCatalogActions.java @@ -295,8 +295,8 @@ class NetworkCatalogActions extends NetworkTreeActions { } @Override - public void onUpdateItems(List items) { - for (NetworkLibraryItem item: items) { + public void onUpdateItems(List items) { + for (NetworkItem item: items) { myTree.ChildrenItems.add(item); NetworkTreeFactory.createNetworkTree(myTree, item); } @@ -311,7 +311,7 @@ class NetworkCatalogActions extends NetworkTreeActions { @Override public void onFinish(String errorMessage, boolean interrupted, - Set uncommitedItems) { + Set uncommitedItems) { if (interrupted && (!myTree.Item.supportsResumeLoading() || errorMessage != null)) { myTree.ChildrenItems.clear(); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java index a7bbc74c1..a88cdc60d 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkSearchActivity.java @@ -62,9 +62,9 @@ public class NetworkSearchActivity extends Activity { } @Override - public void onUpdateItems(List items) { + public void onUpdateItems(List items) { SearchResult result = myTree.getSearchResult(); - for (NetworkLibraryItem item: items) { + for (NetworkItem item: items) { if (item instanceof NetworkBookItem) { result.addBook((NetworkBookItem)item); } @@ -81,7 +81,7 @@ public class NetworkSearchActivity extends Activity { @Override public void onFinish(String errorMessage, boolean interrupted, - Set uncommitedItems) { + Set uncommitedItems) { if (interrupted) { myTree.setSearchResult(null); } else { diff --git a/src/org/geometerplus/android/fbreader/network/NetworkView.java b/src/org/geometerplus/android/fbreader/network/NetworkView.java index 1247c7c7a..77994cd7b 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkView.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkView.java @@ -88,7 +88,7 @@ class NetworkView { } /* - * NetworkLibraryItem's actions + * NetworkItem's actions */ public RefillAccountActions getTopUpActions() { diff --git a/src/org/geometerplus/fbreader/network/NetworkBookItem.java b/src/org/geometerplus/fbreader/network/NetworkBookItem.java index 6e8da3cbb..0381e2306 100644 --- a/src/org/geometerplus/fbreader/network/NetworkBookItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkBookItem.java @@ -25,7 +25,7 @@ import java.io.File; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; -public final class NetworkBookItem extends NetworkLibraryItem { +public final class NetworkBookItem extends NetworkItem { public static class AuthorData implements Comparable { public final String DisplayName; @@ -80,7 +80,7 @@ public final class NetworkBookItem extends NetworkLibraryItem { private final LinkedList myReferences; /** - * Creates new NetworkLibraryItem instance. + * Creates new NetworkItem instance. * * @param link corresponding NetworkLink object. Must be not null. * @param id string that uniquely identifies this book item. Must be not null. diff --git a/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java b/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java index db8981e73..faf44f04b 100644 --- a/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java +++ b/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java @@ -22,8 +22,8 @@ package org.geometerplus.fbreader.network; import java.util.Comparator; import java.util.LinkedList; -public final class NetworkBookItemComparator implements Comparator { - public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { +public final class NetworkBookItemComparator implements Comparator { + public int compare(NetworkItem item0, NetworkItem item1) { final boolean item0isABook = item0 instanceof NetworkBookItem; final boolean item1isABook = item1 instanceof NetworkBookItem; diff --git a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java index 34e6c1ad5..bd10505e3 100644 --- a/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkCatalogItem.java @@ -28,7 +28,7 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; -public abstract class NetworkCatalogItem extends NetworkLibraryItem { +public abstract class NetworkCatalogItem extends NetworkItem { // catalog types: public static enum CatalogType { diff --git a/src/org/geometerplus/fbreader/network/NetworkLibraryItem.java b/src/org/geometerplus/fbreader/network/NetworkItem.java similarity index 88% rename from src/org/geometerplus/fbreader/network/NetworkLibraryItem.java rename to src/org/geometerplus/fbreader/network/NetworkItem.java index 42e0dc9b1..1970da833 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibraryItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkItem.java @@ -19,7 +19,7 @@ package org.geometerplus.fbreader.network; -public abstract class NetworkLibraryItem { +public abstract class NetworkItem { public final INetworkLink Link; public final String Title; public final String Summary; @@ -28,14 +28,14 @@ public abstract class NetworkLibraryItem { //public org.geometerplus.fbreader.network.atom.ATOMEntry dbgEntry; /** - * Creates new NetworkLibraryItem instance. + * Creates new NetworkItem instance. * * @param link corresponding NetworkLink object. Must be not null. * @param title title of this library item. Must be not null. * @param summary description of this library item. Can be null. * @param cover cover url. Can be null. */ - protected NetworkLibraryItem(INetworkLink link, String title, String summary, String cover) { + protected NetworkItem(INetworkLink link, String title, String summary, String cover) { Link = link; Title = title; Summary = summary; diff --git a/src/org/geometerplus/fbreader/network/NetworkLibrary.java b/src/org/geometerplus/fbreader/network/NetworkLibrary.java index eed8369dd..8a0f18373 100644 --- a/src/org/geometerplus/fbreader/network/NetworkLibrary.java +++ b/src/org/geometerplus/fbreader/network/NetworkLibrary.java @@ -429,7 +429,7 @@ public class NetworkLibrary { LinkedList dataList = new LinkedList(); final NetworkOperationData.OnNewItemListener synchronizedListener = new NetworkOperationData.OnNewItemListener() { - public synchronized void onNewItem(INetworkLink link, NetworkLibraryItem item) { + public synchronized void onNewItem(INetworkLink link, NetworkItem item) { listener.onNewItem(link, item); } public synchronized boolean confirmInterrupt() { diff --git a/src/org/geometerplus/fbreader/network/NetworkOperationData.java b/src/org/geometerplus/fbreader/network/NetworkOperationData.java index 256336808..70adad9da 100644 --- a/src/org/geometerplus/fbreader/network/NetworkOperationData.java +++ b/src/org/geometerplus/fbreader/network/NetworkOperationData.java @@ -25,7 +25,7 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; public class NetworkOperationData { public interface OnNewItemListener { - void onNewItem(INetworkLink link, NetworkLibraryItem item); + void onNewItem(INetworkLink link, NetworkItem item); void commitItems(INetworkLink link); diff --git a/src/org/geometerplus/fbreader/network/NetworkTree.java b/src/org/geometerplus/fbreader/network/NetworkTree.java index 9fd176885..a6f3c5aa0 100644 --- a/src/org/geometerplus/fbreader/network/NetworkTree.java +++ b/src/org/geometerplus/fbreader/network/NetworkTree.java @@ -77,7 +77,7 @@ public abstract class NetworkTree extends FBTree { super(parent, position); } - public static ZLImage createCover(NetworkLibraryItem item) { + public static ZLImage createCover(NetworkItem item) { if (item.Cover == null) { return null; } @@ -121,7 +121,7 @@ public abstract class NetworkTree extends FBTree { } - public abstract NetworkLibraryItem getHoldedItem(); + public abstract NetworkItem getHoldedItem(); private Key myKey; /** @@ -146,13 +146,13 @@ public abstract class NetworkTree extends FBTree { */ protected abstract String getStringId(); - public void removeItems(Set items) { + public void removeItems(Set items) { if (items.isEmpty() || subTrees().isEmpty()) { return; } final LinkedList treesList = new LinkedList(); for (FBTree tree: subTrees()) { - final NetworkLibraryItem treeItem = ((NetworkTree)tree).getHoldedItem(); + final NetworkItem treeItem = ((NetworkTree)tree).getHoldedItem(); if (treeItem != null && items.contains(treeItem)) { treesList.add(tree); items.remove(treeItem); diff --git a/src/org/geometerplus/fbreader/network/TopUpItem.java b/src/org/geometerplus/fbreader/network/TopUpItem.java index 8b0dcf83f..b19978d45 100644 --- a/src/org/geometerplus/fbreader/network/TopUpItem.java +++ b/src/org/geometerplus/fbreader/network/TopUpItem.java @@ -21,7 +21,7 @@ package org.geometerplus.fbreader.network; import org.geometerplus.zlibrary.core.resources.ZLResource; -public class TopUpItem extends NetworkLibraryItem { +public class TopUpItem extends NetworkItem { public TopUpItem(INetworkLink link, String cover) { super( link, diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java index 5d54c2efe..d340b3372 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java @@ -39,7 +39,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { private String myInitializedDataSid; private String myAccount; - private final HashMap myPurchasedBooks = new HashMap(); + private final HashMap myPurchasedBooks = new HashMap(); public LitResAuthenticationManager(INetworkLink link, String sslCertificate) { super(link, sslCertificate); @@ -352,7 +352,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { return new LitResNetworkRequest( LitResUtil.url(Link, query), SSLCertificate, - new LitResXMLReader(Link, new LinkedList()) + new LitResXMLReader(Link, new LinkedList()) ); } @@ -363,7 +363,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { private void loadPurchasedBooksOnSuccess(LitResNetworkRequest purchasedBooksRequest) { LitResXMLReader reader = (LitResXMLReader)purchasedBooksRequest.Reader; myPurchasedBooks.clear(); - for (NetworkLibraryItem item: reader.Books) { + for (NetworkItem item: reader.Books) { if (item instanceof NetworkBookItem) { NetworkBookItem book = (NetworkBookItem)item; myPurchasedBooks.put(book.Id, book); diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java index 682b72c00..935c20481 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java @@ -27,16 +27,16 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.*; abstract class SortedCatalogItem extends NetworkCatalogItem { - private final List myChildren = new LinkedList(); + private final List myChildren = new LinkedList(); - private SortedCatalogItem(NetworkCatalogItem parent, ZLResource resource, List children) { + private SortedCatalogItem(NetworkCatalogItem parent, ZLResource resource, List children) { super(parent.Link, resource.getValue(), resource.getResource("summary").getValue(), "", parent.URLByType); - for (NetworkLibraryItem child : children) { + for (NetworkItem child : children) { if (accepts(child)) { myChildren.add(child); } } - final Comparator comparator = getComparator(); + final Comparator comparator = getComparator(); if (comparator != null) { Collections.sort(myChildren, comparator); } @@ -46,12 +46,12 @@ abstract class SortedCatalogItem extends NetworkCatalogItem { return myChildren.isEmpty(); } - protected abstract Comparator getComparator(); - protected boolean accepts(NetworkLibraryItem item) { + protected abstract Comparator getComparator(); + protected boolean accepts(NetworkItem item) { return item instanceof NetworkBookItem; } - public SortedCatalogItem(NetworkCatalogItem parent, String resourceKey, List children) { + public SortedCatalogItem(NetworkCatalogItem parent, String resourceKey, List children) { this(parent, ZLResource.resource("networkView").getResource(resourceKey), children); } @@ -61,7 +61,7 @@ abstract class SortedCatalogItem extends NetworkCatalogItem { @Override public void loadChildren(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException { - for (NetworkLibraryItem child : myChildren) { + for (NetworkItem child : myChildren) { listener.onNewItem(Link, child); } listener.commitItems(Link); @@ -69,25 +69,25 @@ abstract class SortedCatalogItem extends NetworkCatalogItem { } class ByAuthorCatalogItem extends SortedCatalogItem { - ByAuthorCatalogItem(NetworkCatalogItem parent, List children) { + ByAuthorCatalogItem(NetworkCatalogItem parent, List children) { super(parent, "byAuthor", children); } @Override - protected Comparator getComparator() { + protected Comparator getComparator() { return new NetworkBookItemComparator(); } } class ByTitleCatalogItem extends SortedCatalogItem { - ByTitleCatalogItem(NetworkCatalogItem parent, List children) { + ByTitleCatalogItem(NetworkCatalogItem parent, List children) { super(parent, "byTitle", children); } @Override - protected Comparator getComparator() { - return new Comparator() { - public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { + protected Comparator getComparator() { + return new Comparator() { + public int compare(NetworkItem item0, NetworkItem item1) { return item0.Title.compareTo(item1.Title); } }; @@ -95,14 +95,14 @@ class ByTitleCatalogItem extends SortedCatalogItem { } class ByDateCatalogItem extends SortedCatalogItem { - ByDateCatalogItem(NetworkCatalogItem parent, List children) { + ByDateCatalogItem(NetworkCatalogItem parent, List children) { super(parent, "byDate", children); } @Override - protected Comparator getComparator() { - return new Comparator() { - public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { + protected Comparator getComparator() { + return new Comparator() { + public int compare(NetworkItem item0, NetworkItem item1) { return 0; } }; @@ -110,14 +110,14 @@ class ByDateCatalogItem extends SortedCatalogItem { } class BySeriesCatalogItem extends SortedCatalogItem { - BySeriesCatalogItem(NetworkCatalogItem parent, List children) { + BySeriesCatalogItem(NetworkCatalogItem parent, List children) { super(parent, "bySeries", children); } @Override - protected Comparator getComparator() { - return new Comparator() { - public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { + protected Comparator getComparator() { + return new Comparator() { + public int compare(NetworkItem item0, NetworkItem item1) { final NetworkBookItem book0 = (NetworkBookItem)item0; final NetworkBookItem book1 = (NetworkBookItem)item1; int diff = book0.SeriesTitle.compareTo(book1.SeriesTitle); @@ -130,7 +130,7 @@ class BySeriesCatalogItem extends SortedCatalogItem { } @Override - protected boolean accepts(NetworkLibraryItem item) { + protected boolean accepts(NetworkItem item) { return item instanceof NetworkBookItem && ((NetworkBookItem)item).SeriesTitle != null; @@ -166,11 +166,11 @@ public class LitResBookshelfItem extends NetworkCatalogItem { } finally { myForceReload = true; // TODO: implement asynchronous loading - ArrayList children = - new ArrayList(mgr.purchasedBooks()); + ArrayList children = + new ArrayList(mgr.purchasedBooks()); if (children.size() <= 5) { Collections.sort(children, new NetworkBookItemComparator()); - for (NetworkLibraryItem item : children) { + for (NetworkItem item : children) { listener.onNewItem(Link, item); } } else { diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResXMLReader.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResXMLReader.java index 580b026d5..1662c31b3 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResXMLReader.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResXMLReader.java @@ -31,7 +31,7 @@ import org.geometerplus.fbreader.network.opds.HtmlToString; class LitResXMLReader extends LitResAuthenticationXMLReader { public final INetworkLink Link; - public final List Books; + public final List Books; private int myIndex; @@ -55,7 +55,7 @@ class LitResXMLReader extends LitResAuthenticationXMLReader { private HashMap myURLByType = new HashMap(); // TODO: remove private LinkedList myReferences = new LinkedList(); - public LitResXMLReader(INetworkLink link, List books) { + public LitResXMLReader(INetworkLink link, List books) { super(link.getSiteName()); Link = link; Books = books; diff --git a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java index b9437ca59..809a449fe 100644 --- a/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java +++ b/src/org/geometerplus/fbreader/network/opds/NetworkOPDSFeedReader.java @@ -42,7 +42,7 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes private int myItemsToLoad = -1; /** - * Creates new OPDSFeedReader instance that can be used to get NetworkLibraryItem objects from OPDS feeds. + * Creates new OPDSFeedReader instance that can be used to get NetworkItem objects from OPDS feeds. * * @param baseURL string that contains URL of the OPDS feed, that will be read using this instance of the reader * @param result network results buffer. Must be created using OPDSNetworkLink corresponding to the OPDS feed, @@ -203,7 +203,7 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes } } - NetworkLibraryItem item; + NetworkItem item; if (hasBookLink) { item = readBookItem(entry); } else { @@ -218,7 +218,7 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes private static final String AuthorPrefix = "author:"; private static final String AuthorsPrefix = "authors:"; - private NetworkLibraryItem readBookItem(OPDSEntry entry) { + private NetworkItem readBookItem(OPDSEntry entry) { final OPDSNetworkLink opdsNetworkLink = (OPDSNetworkLink)myData.Link; /*final String date; if (entry.DCIssued != null) { @@ -368,7 +368,7 @@ class NetworkOPDSFeedReader implements OPDSFeedReader, OPDSConstants, MimeTypes } } - private NetworkLibraryItem readCatalogItem(OPDSEntry entry) { + private NetworkItem readCatalogItem(OPDSEntry entry) { final OPDSNetworkLink opdsLink = (OPDSNetworkLink)myData.Link; String coverURL = null; String url = null; diff --git a/src/org/geometerplus/fbreader/network/tree/AddCustomCatalogItemTree.java b/src/org/geometerplus/fbreader/network/tree/AddCustomCatalogItemTree.java index 99d7bd670..8d6d3097d 100644 --- a/src/org/geometerplus/fbreader/network/tree/AddCustomCatalogItemTree.java +++ b/src/org/geometerplus/fbreader/network/tree/AddCustomCatalogItemTree.java @@ -21,7 +21,7 @@ package org.geometerplus.fbreader.network.tree; import org.geometerplus.zlibrary.core.resources.ZLResource; -import org.geometerplus.fbreader.network.NetworkLibraryItem; +import org.geometerplus.fbreader.network.NetworkItem; import org.geometerplus.fbreader.network.NetworkTree; public class AddCustomCatalogItemTree extends NetworkTree { @@ -40,7 +40,7 @@ public class AddCustomCatalogItemTree extends NetworkTree { } @Override - public NetworkLibraryItem getHoldedItem() { + public NetworkItem getHoldedItem() { return null; } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java index e16690223..b7c1ae976 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkAuthorTree.java @@ -120,7 +120,7 @@ public class NetworkAuthorTree extends NetworkTree { } @Override - public NetworkLibraryItem getHoldedItem() { + public NetworkItem getHoldedItem() { return null; } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java index c765fcb4c..5b3586547 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkBookTree.java @@ -69,7 +69,7 @@ public class NetworkBookTree extends NetworkTree { } @Override - public NetworkLibraryItem getHoldedItem() { + public NetworkItem getHoldedItem() { return Book; } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java index 0c9ba1121..097e391e1 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkCatalogTree.java @@ -29,7 +29,7 @@ import org.geometerplus.fbreader.network.*; public class NetworkCatalogTree extends NetworkTree { public final NetworkCatalogItem Item; - public final ArrayList ChildrenItems = new ArrayList(); + public final ArrayList ChildrenItems = new ArrayList(); private long myLoadedTime = -1; @@ -86,7 +86,7 @@ public class NetworkCatalogTree extends NetworkTree { int nodeCount = 0; for (int i = 0; i < ChildrenItems.size(); ++i) { - NetworkLibraryItem currentItem = ChildrenItems.get(i); + NetworkItem currentItem = ChildrenItems.get(i); if (!(currentItem instanceof NetworkCatalogItem)) { continue; } @@ -158,12 +158,12 @@ public class NetworkCatalogTree extends NetworkTree { } @Override - public NetworkLibraryItem getHoldedItem() { + public NetworkItem getHoldedItem() { return Item; } @Override - public void removeItems(Set items) { + public void removeItems(Set items) { ChildrenItems.removeAll(items); super.removeItems(items); } diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java b/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java index 8c4bb848f..3a9af37d0 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkSeriesTree.java @@ -87,12 +87,12 @@ public class NetworkSeriesTree extends NetworkTree { } @Override - public NetworkLibraryItem getHoldedItem() { + public NetworkItem getHoldedItem() { return null; } @Override - public void removeItems(Set items) { + public void removeItems(Set items) { super.removeItems(items); if (subTrees().isEmpty()) { removeSelf(); diff --git a/src/org/geometerplus/fbreader/network/tree/NetworkTreeFactory.java b/src/org/geometerplus/fbreader/network/tree/NetworkTreeFactory.java index a06104d8e..a61903512 100644 --- a/src/org/geometerplus/fbreader/network/tree/NetworkTreeFactory.java +++ b/src/org/geometerplus/fbreader/network/tree/NetworkTreeFactory.java @@ -25,11 +25,11 @@ import org.geometerplus.fbreader.network.*; public class NetworkTreeFactory { - public static NetworkTree createNetworkTree(NetworkCatalogTree parent, NetworkLibraryItem item) { + public static NetworkTree createNetworkTree(NetworkCatalogTree parent, NetworkItem item) { return createNetworkTree(parent, item, -1); } - public static NetworkTree createNetworkTree(NetworkCatalogTree parent, NetworkLibraryItem item, int position) { + public static NetworkTree createNetworkTree(NetworkCatalogTree parent, NetworkItem item, int position) { final int subtreesSize = parent.subTrees().size(); if (position == -1) { position = subtreesSize; diff --git a/src/org/geometerplus/fbreader/network/tree/RootTree.java b/src/org/geometerplus/fbreader/network/tree/RootTree.java index b7b93506f..09a4a6a69 100644 --- a/src/org/geometerplus/fbreader/network/tree/RootTree.java +++ b/src/org/geometerplus/fbreader/network/tree/RootTree.java @@ -19,7 +19,7 @@ package org.geometerplus.fbreader.network.tree; -import org.geometerplus.fbreader.network.NetworkLibraryItem; +import org.geometerplus.fbreader.network.NetworkItem; import org.geometerplus.fbreader.network.NetworkTree; public final class RootTree extends NetworkTree { @@ -29,7 +29,7 @@ public final class RootTree extends NetworkTree { } @Override - public NetworkLibraryItem getHoldedItem() { + public NetworkItem getHoldedItem() { return null; } diff --git a/src/org/geometerplus/fbreader/network/tree/SearchItemTree.java b/src/org/geometerplus/fbreader/network/tree/SearchItemTree.java index 7d7adff0e..183aa41ef 100644 --- a/src/org/geometerplus/fbreader/network/tree/SearchItemTree.java +++ b/src/org/geometerplus/fbreader/network/tree/SearchItemTree.java @@ -90,7 +90,7 @@ public class SearchItemTree extends NetworkTree { } @Override - public NetworkLibraryItem getHoldedItem() { + public NetworkItem getHoldedItem() { return null; } From 8f8fda2b9d3e7344d07ec0bc6c989a0402015e1a Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 6 Mar 2011 13:58:40 +0000 Subject: [PATCH 71/71] updated TODO --- TODO.network | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/TODO.network b/TODO.network index 088b8dd55..131e829d9 100644 --- a/TODO.network +++ b/TODO.network @@ -1,3 +1,27 @@ +DONE show 'empty basket' message without opening of catalog +* update basket view if basket content is changed +* basket summary +DONE show recommendation item if basket is not empty +* new actions in main menu: clear; buy all +* update recommendations list after each basket updating/purchasing +* update recommendations list visibility after each basket updating/purchasing +* remove book from basket on purchasing + +* search item behaviour like search item in local library +* separate search for each catalog (if search URL is presented) +* menu search button should be available for all catalog levels + +* float point numbers as series index +* replace AuthenticationCatalog by AuthenticationActivity +* 'recently visited catalogs' item +* load search URL for catalogs from these catalogs, not from our generic file +DONE show library name in network book activity + +* litres: credit card top up +* litres: terminal (?) top up +* litres: similar books link + +------------------------------ NP: оповещение об изменениях в namespace'ах происходит после того, как был обработан тег, объявляющий эти namespace'ы... Нужно сделать: @@ -5,22 +29,8 @@ NP: оповещение об изменениях в namespace'ах проис 2) вызов namespaceMapChangedHandler после вызова endElementHandler 3) вызов namespaceMapChangedHandler для пустых тегов -** Записать изменения в ChangeLog - -DONE Network library: Объединять книги по сериям - ** в сериях книги нужно сортировать по индексу - NP: а где это происходит??? - -DONE Возможность открывать локальные файлы из всяких файл-менеджеров -DONE На этой странице есть ссылка на epub-файл "для ПК". http://www.zone4iphone.ru/index.php?p_id=7&b_id=18413 - Проверить скачивание книги браузером и возможность чтения из папки, куда файл был скачан. - DONE добавлять в библиотеку (сделать таблицу добавленных вручную книг) - ------------------------------ -** пополнение счета в litres с помощью sms - ** сделать как "подкаталог" для элемента "пополнить счет" - ** восстановление пароля (use default e-mail) ** сделать отдельную ветку (?) для скачанных samples ** (?) удалять sample при покупке/скачивании полного варианта @@ -57,5 +67,4 @@ DELAYED что делать, когда мало памяти??? ----------------------------- другое: -DONE layout для китайских текстов * поддержка hufdic в mobipocket