From f5547cc4ac1ef7e9b3bb40cbfaf6eb05c7b51664 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Jun 2012 18:24:22 +0400 Subject: [PATCH] revert ics fragment stuff --- .classpath | 2 +- AndroidManifest.xml | 6 +- libs/android-support-v4.jar | Bin 271788 -> 247894 bytes src/org/fox/ttrss/ArticleFragment.java | 10 +- src/org/fox/ttrss/ArticlePager.java | 10 +- src/org/fox/ttrss/DummyFragment.java | 2 +- src/org/fox/ttrss/FeedCategoriesFragment.java | 2 +- src/org/fox/ttrss/FeedsFragment.java | 9 +- src/org/fox/ttrss/HeadlinesFragment.java | 3 +- src/org/fox/ttrss/MainActivity.java | 228 +++++++++++------- .../fox/ttrss/offline/OfflineActivity.java | 197 +++++++++------ .../ttrss/offline/OfflineArticleFragment.java | 4 +- .../ttrss/offline/OfflineArticlePager.java | 11 +- .../ttrss/offline/OfflineFeedsFragment.java | 4 +- .../offline/OfflineHeadlinesFragment.java | 4 +- .../ttrss/util/FragmentStatePagerAdapter.java | 226 ----------------- 16 files changed, 306 insertions(+), 412 deletions(-) delete mode 100644 src/org/fox/ttrss/util/FragmentStatePagerAdapter.java diff --git a/.classpath b/.classpath index 3356ec9f..05a903b5 100644 --- a/.classpath +++ b/.classpath @@ -5,7 +5,7 @@ - + diff --git a/AndroidManifest.xml b/AndroidManifest.xml index fdab6e89..3d539814 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,10 +1,10 @@ + android:versionCode="72" + android:versionName="0.5.7" > - + diff --git a/libs/android-support-v4.jar b/libs/android-support-v4.jar index 1fbeba0932023ad6f4b851f533261eee0cb66798..d006198e6abd489276ad3c69eec894d141c2289f 100644 GIT binary patch delta 20064 zcmZu(2OyQ-`@i?TH+%0rqU@2KJu^aNWQ0nQ5lV~3tyGkER-%IZA`@ek^=RD){jPsoHKIionz$?3AB7*Q5U~%H#RK&qP_Q67mhayBsn_hZw}9;A&~SI&3V3rz1lZ(E4?FUO-F6 z*Fgn1gdP51i<5?Hr15%W?&r{7EHY1oQ>cug8}Kq@;!B7T$Fc$j5g=CswPBfzhnHQhvB;P7T712Cgj{&w`_qa0KAsE9U!H1*ZY1L8Pl;EH&-H(PPwFT2>n*&n zR5_U#<98nlS;Ud`B4X2cGJLF}=W#NjN1P1FuXlM$MxNFV{cRM2=NB|CsBmsnJ~Fj06uQJO9b5bKeXD ze(-+~51WcoKK<%>2B(RU!Z}05a|YXEMjQiXZKkhlWDrLV2BatWWz-nRT{oQgn74E3 zaqL{hyr6res~@{nXibA0zxd&)@Q_}Hk3(N00=yGO5@M#-aZXvho3vxTB;Uv{Y{ zwq6WMkO^z8Ho?yxh+WX_gqs3FHCwyE963j-|%EZg$o?` z>{k9V>lAQ$V^hnzHkG{{DxaMR8|rajjcg{inU1$Sn&eOY zeP4q>tRlc=gwlnKB^7PLtG~k^2^9-QOFsMr>EUc;3+3lu?J*|o>Rdorx>+_vdm5BG;F_6m-TUHwhW zbnE1|lm63orr>j-PvyD%g3qRejOtC_;*V-R*)W{B|Lw^;jy+Og4Of@LLOF&%kMlj) z@AV||RG({Ae%R+5U9YvY9|U;SJu}piegijp^tlp(y~x1_x4s@JJTU&Yz^fuSzo59P z{YmDLcikngT~&S+dP^!?Zs2tvjX!!m>fjxsM{Dd$Q_-sr&9gO`UEe1@KDn!G;G*@+ z?98)|4KJRSU0qI3f1zP}-)L-t>BXtU^vRR810w8;#9FqncgpogYRyBzn#(YvOjj{OMM? zVPt~gh0;gcY^f3RETz%-prJ>vK879V;K@lfOwv$D>x*2PG7meb|6?LrqPs@# zgkL%q=w;e5Z#gIQEXuVbYauI2gfVd2Nh7CPoUB3_1D}hAdbkuZdviB-izWGdR&7^R z;`iG5$iK5;4z@~slhN9X!;*rY#JIi37|O3lR1&>JtS&B^!i{`5A;Prgwp$0M;u>CN zJ^wmJx~{?PDGy^~%e)}!-k|1|x=jo>dH?F!Ag4-c{1>Yq4JXe7pP z@$>#OnTj7Kn2+X|(Oq#5BP6p&UADG>Y@1{vW4fd+Zn!OPH(k{&&U*3rM2)ZA$noE% zwYRRS84xz!>`nX{_x*gNZd9+y$<}tU1}`ecwh6GOPHzS=I@I|jX3If<>O5VbPl&R+Fz86 zj4p}#^@qWCv^CSz!ODC4m1@iftg0E0@05qM4#(_JHLNyE0y=AI0xah_mqAqvsiw=q94kxW`d6m{@D& zsVc(q6{CCJP3W1%IgUs(*&c#KuXu^3X0&gwxMi`-@$*g+C%8?%8~HtL-9pkzvAPre zT;N4imi<+p4{H3kxv;&SD#Ooe3RUCcJk$or6rL*9(h`VD)`MCx@ zqpZ1uLmS;h{I*BBro&c)!q|7L^%nF7+?O?#*)K$eT`|`0Bwl&0J{^Qjd4C?-^5@aM zuctRXI+uRDSpB?yrfzPM0OJPCu|R#o?8DEu>9d!Q^V{D)DPTHzKY=GINXcW1rJ~d5 zE`Pg>KsY_L~FwB6J?^z_k!Y1JUiDJ<+NY@ZMeMpRPyjhBr_k^73&zu zoDMqq!ozhLsv4ml);)Q=BJEI^nt+KuUjqYaa=uQ4`08200sYN&i*Mv>9J4>X@FP4< zbn@%EQV?sBuze8M~}(ofy4y=HcfPOL74cQ$t&HfwUw zym%u&Fm#}4i_?#S_JRbh3>8)NM<78jV2StMoJr`+MR zaUyjF=jlFo2=CN4yLHE2`)laTF|%8>>eu=HRx2o)X|~O=EGnO3AK1M+=uxreyGwQX zgc0GuvmX1y473FT6LmWr{23qo&HO7A_|Rj|UB8mf{1oB94WdWoGcuc9@3XkxjJ_hC z@H@|`MBtuFp;o6*Nq2tprcT|i5$AE%5)qfk#68^Dbd+$9FY~1!>+&o#1Hw{w}#&@%Kw2QaL zv@|ZFT($bbo-KW>yd0!a2NSa+?c*26vg$96rEE0!(dxXQMmGDVXDcowpCw^$E7_W& z6+wV!XV05qTe(us+nQAI7o2!__Z@lu37MULN7g>~}G{e+YG&}7d#)`MH zvzBa)BMmz6=U<}xKIdjlm)04${r1)v zlbKh3ky>Y$=?|fI5ryAoY$kNwOT|vt6W1+^o~^ER&}ORPx#-xR6Qb3rgt@JqiBFe# zKX5NZz4QCW*P1dy@~lUq9jb}rEJYUCKelJ6&ht#wZM(Nka4h6kK-3o|=Fqb&r!0A% zdI}KUONCD~Op1+GDcBZ#VZB(s!*zlfmp|*TV%=?lZuzB^ zWy@Cte#K;pxtw^8`L&=aIJW8C?Mj`Jx|yx?ic`D2<+-~(qn~ul1kuxN7^s~P?U}qD zEZY!4a+B3QZZKTJ1F5~=J1N+%$iHkP(=^k0w~l&5nC$ zhL`3p%D2W}nTS1l@lW}cbZ26?qc{u3Pd@%3%MKi&`SUX7^7QGvNIL%@R&&9Z&vqWb zHpcqZy^!P`V*JjfcVn;Dfh|uvb?Qg^JVz6>h2BpV8%gHg*FAsYIFp7mIvMs{S~QWR@A;LD<*ikcxO@2#a?nxv3~-z zulnnCzrYr^iSKzC*ZoGs4N1vQFTUz}0?tJ0sa zvgf1S7WUV-dA`|Hr$09uRJDBY#g(M{(F5nd&o%z#4zl1Z+n9Ftm54j+vA;1!!@rtK zcfAMW1x_CgR)P2!1Wa#Ad*ZJM18Gm#=Qj>L_D--BKe|?fjDIE20-&Akm z%=tL@Yv_^IJ!J6;ZpNFDbtjiFQy-5zTuVzO6O9)&k2puxMIKYKzK!wV8?~PGOfyz4 zRS-IuFFJ!a zjjyNPaC$r3I>lAVPZ(a>dFM^}IC-3N$8BNnD?v9aYy2GwW@O4e{}}x2IKT8hso_ET zjYQJa-Sh#IvdU#QBVU$*0-v1rG3ygI{^$kBg`6HCej9V!UZI2^k8z)PIP2){TVK%h zCePhHt~Tz&zR}MtrIj-2`sY-7ZJ(__<1H9V_Zxcn>Zp$G{`t4=gcgPmrsfLbBe!^t zwn=5zHdGj85;SBPkJKXYZQtJ#^{Sotb@t_05%;eC7q@ z8eGT5!_SP``l90OA`G}(Uv|!4WZ(R}${;Jl_MP4@{8&RllA+g3>t0=RABn8(Lfd?@ zRJc2KeA13QcklRMP?0NoL{+8ey zR+!ATc*=9N&#bwZCqnHCA8|?ZRekYe%htiP+_^SB_Y|4!%>D0rHkii-jk6KjkJq}x zS&ch`GwA!anP9gC1^d1ceZuj4hJR6Ea`UHsU3I_ZXD_inX0}n)!T!C!U1N%Y*P8vW z45NjLF45f#MHtSeu-WgI?*H6bS z#IPmBrbmCS!o)`=Zfx7C0j2Mt_aUS~@p`P@PZ%0^(ogiVJmA_KSo>kU?xkguzn$Bk z^l_DRRDU(IQiD$Xjb3KeRoqsR5=`Ee@v7UQEc#BDYqxk#uZ2sUi$TuW#W5A185YfJ zJO<_qF26;7+s2&Is^D(OztxSMQ#jWV7hP|EmgHK`nOD!+QNUY!zz}z(xO*3g&~0p~ z6dSN>AxNTlW6QIRK@nd@Pvr!@wx^T2dg69xd8EM4f;{2U;MwWJHe#Ba$Ar@}H_P2% zhQo&R^%o-KbW0jOG#tCj)0DPjsG$XB%%jifC~f$B_AhV5P&??^g2mYaru zS5_kSGW@Zvsvh0`vX@?t#lnf1yHq~!;9+ZJvK=C|56|k*zsft?JX?BU7E@?S$g3ST zG**%e?6NI4@&D!BD@XL7xRbIw*N52D@A08Qt}1+QdFu^tI6G701JwB>dJB7QTGlVM zhaVVR#Ivpj+}M{E{I11rxOXYZO2@`5_DSCn6${TeH)35=METs~18{u(7(@3C22TZx zUFm0zYl?E-XWJCWwx=Cuo|_wEWk@(5&xcQ#9-8IUS-usPSQVD^CoEB=W>0*L>EIbV zzC(um;n?`yGTV0XYwz+?u81(?pW34}A1wA<7|S`tHBkHc2D?u zY5tALtE~xgHf(XuF0;S-CDNryCP;jAlaj%A!Fws9x({tsGMJ^UGQaHQ*WZ6mo-krs zpu4~P(3$A<_{Zy(=(UEnu6ulqP@7#mmczF!sUvjN;gHyI+1fzK@1O6N@wGl48|#L=I=SATpTrmEBeIf(JY_7e~Rzn@wC8A&iUav3lH9}CuEMCu(ZEa zZ>@Xj_kP@52hUU4*cs zU_yC;RhtEzmh8tkWY{d*dy}mp?6=~pD^+%u0uras?_83-I#Sg-qVV9>J~8Pb|DXe8IVr{;Q2dm}2kN z+@z*IqrdJucup8BdKmmP;mxw@=WP6v$KJ*xeeJ#@qt5X&MN>LsbYDICtDA@Kir*F# zbKLn0WA{r(`oO1v{>Q^ZF&Q#4)n|N9a3)orKR&G%_hW0=d^uBmD=GIdajA&md&F1yg$tsK_j42yHs&1fwdi^uGxKT4Jw-CrfmEW9zGp{) zmn+Ytl~-g{{-|({@{w#l3w-IOx7&@*G@oV(oo6&BEX!RT&hTHTerb4^y`?SplWanY zsZ&g|-3f+_b+)*_vihGkZh9A+TjqZ9`R>I=CE0b)Mf!t0z@K@{m5+Z_1LiMmE$qiRxNB*$NOc*j>}`g3LXv-?A9ARy#j7HD12I$ zUM7qMUMyQ8=x3k(UYf%7SM1ReXXck}&Tj~JHZASA_p$mz>tB2I1s{!AqnwU~!NVK> z(hJU3hb6@Chs1NIcg^w3TWoSMKGkRq%kuZ}&E~Va|G3B4vqx;LCEFSN6UvUf zJET_DSx`{ndf`IrI`yRA3^BJa&(~}@aM>%QUw3CoOWTh>>j^$ZmEmXSHPkvsHEfj5 zzj>EyS=RJRPMi7 z7HL0)rGH?COsb&Sn_1C9jfTEg*GJB{2OWMWW)OTe#J){xv_IY>ob21IF-=mmpY>4a zdvra5<;|;3RhBMotNf+Sr`j}s$NL|CETk(@!ldhA_Bl|=&iM<$p~S<||E`wDoo=VJ zUgOgxoGBHTj@}C&l`j!Y>9ap}Pw8-mZhX4KmyXj%uvK@Sw9O?CKK*S*II4eKd|yV< z_BPKN=3i4!TVm&JMd=5=kdALU*C#mR?v2yAq~287sr%J_{E?yKV-kI0qvXS^Lub;9 zp)HqZKVQ3fFY2be)lW-;M(#aktpPiiu{y=!8~dlVI5!NB_m-ygz32)Rd@Itn9CAZ) zs^PLm^1S{-8PTxx_i4(JMxnZWPJ&zR)Eu(jP-~?kFdB6Tl%@->3Y4>Sj|kq%Qf^Uu zwiz_>hLZV&^OD@94$-n?ADg~VwUaPcB^7)6sU3lr z{Aq9WJ;u_MbdAh!qgxMFC#CtkJ6%@Z)orI^)$++XI*`4=r|62~+=u0Z1lOZ?A1xGo zbbWu%t>w>_>c6TFMl|`_^lC0km%no<4Xg+nPj0;{WLhD%`;+_2CrL?OF8g@l5aDMr zMVwty*B*%Ft}lTNA5MZQrCZ?$~cxyyE_v|%q-r1awKCi#Hee*iU z%bC|~E7ei>?4YqsT)oB}u`c>YJE~lc?Fx{1t2I|IosKnYse8-T%A;vqGPc>%>2qo2 z^+Y45I-3c0U3%3A!&QD*j}2VCT4oWtEA4J~^N)@@qV`0ei@r7N%d}*$=If1dRwK=C~xSuT6_5s zZl~~wJl&Gp2@iI>?qrf*@^RQo&ycEbcXmJ+gNf0_VE)~PBA0_hH*qp#a5>0BhhBOn znu4E|HsQQj(4ULu)?6Mkz~Xdx2C||RE&xX*UqGi>$*Es(MNG(zBpKXD8lv+=M*%7L z3TRBNTpMAwYh1DfM zr810oYjgN)Wy?a(!qjx%G0e8G!IuIlCl!Z_JYDtQPZ!(VHFUc4sD<(Kizvu+pQUAz zYTNcpC)1AfwO8_gzi!Z>L=e3^Z!GY+`2uN=(LJ#b2e(Qmw#hR^y59)&jaoh`(XMfv z)1zz0Y_R1qr`i(Tt=DuwP8+xIMz#VxOkTr2J~Ow8QyhAmBFclDIf#jCu|^Xn_}-l!bIKNSdG zSIIr$E9_(9(#M+HL->yw(SgYOleZBu#vMV9rM;Y1CW|ITGd^=yNP z>V;8U*fZ}P$<t%0n0DxYR}FGqPx*^{!xT4-W)89M0Fvt5u+ll)(weLJI63GF zHK~#O1&UKFkQvHJj0b>Jf8ki+R(iY$xpg}(h^ibc zH5r(q2cBfW^OEa*a5#1p7Fc8|a48p_i;Q2!>7$j0Xwrk2ye_ZxEsk}K|4wX%Hd9}1 z0L5sKYBHs;)Ck}u$cyHX7({)8g7RJmT;vI9BACgN-cU2csw1Re2_ZbFU}B(hI1?aF z)LQZa8S=)hd0m3sa|GH>bvBq&fW`bF4md>&Sa38R>Zi`Mwg9Vd3*(vK>KurNEP4uB zpjr*84pq~vBrwqT0hGjmx)78&WJZ8|Ef2y|OB!&}KVV{Hj#!8bkCMOUrK%tU6)DsV z`X}RUKFFXoxZ!_ONr_MkmHr=^gliBtVY^*urz*#(fsoNh!K3u8?d%DW7!S5f91?62 z(!@IlI%U0%kQG7_wI4oF&aZ0J9lihdV`^B>_xB9A#Kw{^Y%)Y8CM*Dv>Elnk~ zN|F7;b1g#!M+~xMT=(m7xJ!Dv`S(0k`(Qnzw~twvWn5Zs{A5oABQFqCVn3j zm|0W`Rx4QgZp3&r@2MpVc|fl4+lh;*-)~{fI@I&`x-lfDI36^-7U9F9?(Q1GmB?yd zWMinQ^*#TF>bLWzd1a3IdU7v(iJo&GlL=`82Xdc;IGpuwep%P<+h^eP>C$_reM{T> zN3Ru*4k_~qq4b)G?MTCF4rN#^yc?;r zw$GPOec_vUl1oa^KhU(xplrM6-N)^_nOPTi8*>Le_A?=_@5cPmejK=@HFfmrpyWXQ zly!uzX5$?$<)qIWB&BYiTIT(>b%T3Wm0ir(Jyykz{BXHCgZDCfk2}ciIE|%Lpq%G% ze)*sRVg6Hr;KT)xH!BIqO&&;rib18I7(mnZgPo9aIMb zma_WDZwny{n)jV1o?xYtc-F0XNeeLoyn6+8CbyenQ&6y^_*u3!_9yYM!>P>>8>xfW3MBvqOcrka3bBz- zT4MRA>l-Pvtv?`HGT9s(i}I5bwXxRdx1d<5k=S|8P$iu8mm?K($x(S3Ie|c9Zh&1_ z6U&PZlKc6w>{OuOh$Te^wvkX-q|AAFbSnT=Ul#TrgVvMjL*828;iIxX66Q*t08xl<>9MU^(H1W=NPA!as-zAo|nG5{-p~ zVF>{&AL+{UUn&%~DM|D@qW1`510D`*gXl=S6TeW+BnB}j)C>v*+0G671f2j9<=~nj zh!;+ogyhH`w%7)$<-i@xR5X-o1cFVmksaPO0@0NOU~h6D2P;xM_BDFM0)pkp4))mR zRKbn{h+rO4TURg@Ts&3|PH2W0VTnmd2wt$k<1>kt7)lJ)?RKsnHUx5I@ZN5fULi z{z`{Rgi#pOOxebbJx;aWq-P5iC?)+srZK|B03>O0)EgZq-&VmIuR}f9@>>=L=Ci@q zMO>&xWKXk!2+R% z`=`LBVz?c9iaIl}87oUv72_nm|9E_5v!e(m-U~2B&!yl+LMgbo7urM`zblGzkqDJ0 zbm%O|T;Q2@2WpBBT*kUiIiFrNhSCZUaS(p&qMY#MeN*5{c{0IqEEb*ARbcUEgV|FNY`6VQWuucQIPBagbt~# zfR!3aWTo8hfMnp){UDTr^||P7Oq4lc_D=(mBZeNX>4DfuV>hTKWlvtBM0sT2XM z1ROF1F_X9k^ifBlJ2%GJS7k5$+iyIJZeHvN+G;U3d=(d z(!#E%2Ij24_}Y^U49-7bxv`NFBqYsH0~`hF(M3k`9$7-U$iPF?0!aoXB#&yKKRqZ{ zh^gMtx)n6Dt3`vKbefGi41=Q~x)eyYz0^WN24lvk)u5;;6VH6(ByaJ+?!>M=u%OG3 zomk^ng=iv!EN7<1nNohvd;)7I@tgfhy@AZg^vc*|ss|`_k>X5J6{8n^?Y2{x2Q~}} zatbi8o`B0zmLYcXo%>iDR22C`9#$T;4moJAlE@cf6REj`?0eLS^>FoH5Er(G*z6Vm zQqr2teh<52WivyLo&}y*4fMPT7Mv73c?e4nODur(d}|isgb&PvJtprQmVt@_>@laQ zr$Asi*v%I}^&CHsZCP_fDNWTtsrG8o z;5)=J0r=Y-BtRw+urSpKAWaqaj>a;OA6&xfp@X29OOab|U=yg&DN6wL3&#>94L?f9 z{zR-LA3TO_rpiIitUxypIeQOwJ2NtmG!hU)03SE(^Bcs&FcBNXh?u-G%TFG-iWNjv zkpUd){tP1rAHdB|Zpp@Wu01sq*`}n(U}htg36u~gEGH$HYm1gWd@vm=2FJ}pO5|Q2 zY#h}#%99VkDMyZs#;zRykyHDM$I-x(%|o!dD|v$W9UOYpkO+YKEd@Vlz^)@JR%3TE zQPUPITXeAa4fexI#-SO#GL^gxo?>>Au{mh5p}eauMFxVJaBNr{59Z(N?(n?^NE=P4 z&kc|vTC-#tAvN?nuSQ50)tc4_8T@Cnl7&YbL72e1@4WDv^>}Je=>2-U5H1l5I~L*i zD6hP$QQnK^lAyfMu4lvV&4^1A+C7s|1$F z+w(B<1~9yVWp!8$2Cvb}!Drq>Oo+1m68Z`T;CS2z6o%0#BeShx0?Op!)(HqN%Y^y& zru|xak+nZyk~oN&yu9Gud&XpTs>#XX0Lhz`ab?t>A~-Pkf}5gAP|;!QKfhB##R=`Z zP6oI(&|@&FG~$1A!)Qw%4abqc~R{RSbR$KnNjy?AxpLWgP~S$AZDg(~u5q zK}o^0K0lfsKPb3F?NHsIKga`nuQ&(pT?giJ-B+a}Z9*PI#lZ=AmUF=AmHZft7L5wW zovSL=!HgVuG1Nw3E+9+WAGLok7oHmt6A+sfxdC`{2#>+2(};-(ppeSKo;-L#gmf(R z@v9y{ItmPkN+TKMB{FX)?+P7Q-R%MH|fUL=?v;D{wMW zMz%2kk)27X=M;7Vcce1_c$6f2Ky-G$3`Eodh-x&Rc27Zr0y?7H5|oW*ZGTLIhScmj z>MYPA6@}U8sh0m5Jd%_LMALz%Sp^#U6F1g4H((te&7FNstqiq*P7&}}($e2Vp@UAF zB>Y;K3SI5M@!TK)+aE-p7W%_m6nYK#E*}-jT|+O^Pyi!}0f?s&eeyOcIzj+cG>WsP zgNwI5X2f7Fa{n)CiyTV4lwcqJl}zbl0e;4F&Or^|IOrN5=E9GEDBLUzCCb=RSTGo0jARi|Jlqc z8dkW18PA16Qb3T-p>w-f@ZyNAhYx&Cx*>$Y@R)zQNkT zo5mqNO3R&v(lQi7fc8C!>FxqmYaD=;qtVc;iHZX2lnX6UNa+ma2Wr5tFaR}*Fqwa4 z`Fe1I;X@WE3+Ta0quz<9*ydu14iA_^BJhv^{@?aNk+@bVxLH~Asj-2vU%*KY={61u zt^|6g5Rkb*odb;#HK#I|ptk+I!WKlYoaG)qPiV6QDFaCDFMe z5irN-yUK#LJmEhgfB^Arl_Vgr+_%ci0E5mawbIy0fH|R%)j1$o0+bI5AK5KTZyu~c zL$J6u(-`0twn~rmYtdiKgL^5PaOGiIAhNK5#EOdxDaxXbtuhPnt1J5k?+y=NyUQX4 zu!3UmjuZbVVZ1nXt6AG~qpi>TPOs84z@VMV1sA@B(4rnwaC#wu6)aWJ|J~*S&d}oJ zhC!>24kie!fHtPM*DG#Sv;Yj+c2w7MQle#&xH`uVy9=+ZzcZp>F7y_ybRJ6ojvI~J z1m(2Ql(EW8?Zx#`WYTA?4hz5m#~>D1Rb&OwLrS8y<*Xq9ojrQwq_Xz>1hZ1Y9+S69 z#{h4U#IvI{Q!^rl59DSd_@dqQpRJ__%|PM*%6;Dm3E>R$DRPBq&PPb(us^}H&pG4nFZ2l0%QFCO?4grHANncMHUeI@;zF7;Yj_hQ)}dzi|_rXJ!5=;1zJOQw9n? zfiK#{Jy?RUARRVJPZB+pHQwpDJOW_E0D9Wu8APVg1MHwz3ENIU>rwR?6jT+Zs4T=I zgFm1R=-k$CU@o}=t?F6hR!IT@t0N?gCuEJohS0g+W^Wl~zh`RBGj05#QYA923FldGf!7bmZqAs1=n@2^orSxvm-7PCqUhO%MvkS?m~k>|F}wmi-vEy$4Ug{oH9Wi%+-r86i56hzz5x`6s+b14GAQBP5?rvK0K_!{ z=(OT0hY)i3>QAurkY#TJ8ojvmkCb8I)i$#xVoBPG_xRgDj1oX)LW8RP6DkIHAL*c> zzdH>Jj{sR8M$oyHRx}rKr1iNa(Yz1HdIBKPF21L8tGapM1Fs>lw^A~)g@Wtq!m1uN z*vlTvj+}W>;LL-7fbe?_Go@akb3+qgPH~wsCx%u5(9hn806DwGaQ8)E&<1eGp#^g2 zFQN>DR2m*^p+;t11lzA~!1gqNeG82b_CW9^M)35$(g&ACeC8yXwcicchy~|G+D)zw zkI=7Nq`;s(P6w-gS;^X9iaAH?naTx-M+F%XH(jcg2M5tHW>BPxV zu>XCeBF|+szx569oCAi^o?M++s9M&+w&T>5q1F(3ZVzya7-%n;(`bP?5o$_Lbkmwu z_Oun?4dO-TC_W%g_)4sqzcd61V+E*+=qQ($wR5s8O-$We0tN7pDH10i+j$4mPr!=vNt(DSn zXfFs3MRd4(@#S>@brL8n)-<9mWlVdc;kquFXE{Bjl0LE_<4H&+pCrt47zLoT=dJ9NCX{^dpSiPVSMe};2Z@m`)yd9jy z_Rs(b*IEUvgj_1DwEXGe!FDSAH$NOwC^hjC$j1XT+`DvXxi=%)O!-*LDcSfKxQBMt z73;5||F_`(P%OM?yk?Gay@4PJ1Cc;{{^WbvHWQHEPk|4uXh8fhLm5F9too1+rkq0% zG~vFcBK-jUC_wK+!;`0 zAh@@o)=N7ImTUW0c~=1=cQ?WavXSH6VMl@cgap9;NrTKS=)cm1;bYwpwPzF90i^Fd z^j{)r1u+;K8pJ!!{Nr0A^DjjvOU$Z11JtvkLtt3_3NpNM%fyf7sqT03ae%lG zJZaH3Mrz}!8mN~~=t25>*s%R!U}folcEQwZsCeqtC_N0Wqy*PwOF!kncPs@JO1Ykb z!S&Qyg2XmJ&OkX}7rcG|ZX$rIPQ&5Uk0PPGNC59`fkcrYww}gsy#?scfTc@&?hqP8>A^<92j_oS z$qZv~>c$CuplV0%jfLT4Fo*!|DzPiG2CA)qhiThjio;YEc9?FAx`Xw{{85hs$}a%r zv}d)qpHbyC;IbO_c>`&n8Fb|}P(JnrnFC?fCZ1-aBR&Nk!j_(us<`|HkW7!SC1F99 z9D;9J{L_y?fNuv_6^bi=Rftf!8hIfv;c+S-s_yr>~A# zlnnt&KMk?Vu3R`!j%qy74yM z1Me>ZeYD(4HpVuBDe)dtoYs##MI?pwj1BBNb2y!B^%$ zJ|I1)*m*$klm{gMcXGV&p`n#IwqIbbftQw<1MM47nB|G?s~H3h5EMobl>f;&5n6iWnieg@ zd1?0^S_1_kfRQ$m=fqc;q~PCk;2{`sL*O(pRYww?18zXBZv~J<^!9L_JO$*~0|21B zuK9FJugXF$b)}JLJ*Yn#%>?KZfLCaBKa*LN&kKt$LQ)95kjX-xGbn1;!3mePs_Mz3 z^xztJJ?uSB&4%3le)>HCg$1zBa19y^=BLss9(ovD_o|9hY-?-yWbX{{5CMJ%8hUWD z1D8~5f&^~c)lh#J&j5cgsIB7Vf!)TzVUHq@fFnI{1REj;SjDuvMzR5|e&o6teLj>R zs9l={APxZ#v`m(kt4#bbxP@j!9?nn{l}i9cy3HyIR(Np$)zi8NAS{;5Vjkx6$GKA+=#>AMx5wx>tGoBlE|w*fq3(lQ+k_{RjU)P+&^9t2Qu4&cI%vi5;IUOtDd>p;XY Rm?rRN2DGbe4}+Lt{tr1fE7kx2 delta 42913 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≈qeXv{vEA2Xu=spQP;yXG;ol@wXgX)O>hjM@#Ag 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 Sfx!3p{Z$$WbRCDe2mS-B%t}=N diff --git a/src/org/fox/ttrss/ArticleFragment.java b/src/org/fox/ttrss/ArticleFragment.java index 098ff6f9..00823f60 100644 --- a/src/org/fox/ttrss/ArticleFragment.java +++ b/src/org/fox/ttrss/ArticleFragment.java @@ -1,5 +1,6 @@ package org.fox.ttrss; +import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.text.SimpleDateFormat; @@ -15,27 +16,32 @@ import org.jsoup.select.Elements; import android.annotation.SuppressLint; import android.app.Activity; -import android.app.Fragment; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; import android.text.Html; import android.text.method.LinkMovementMethod; +import android.util.Log; import android.util.TypedValue; import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.view.ContextMenu.ContextMenuInfo; import android.webkit.WebSettings; import android.webkit.WebView; +import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; import android.widget.TextView; +import android.widget.Toast; +import android.widget.AdapterView.AdapterContextMenuInfo; public class ArticleFragment extends Fragment { @SuppressWarnings("unused") diff --git a/src/org/fox/ttrss/ArticlePager.java b/src/org/fox/ttrss/ArticlePager.java index 6cf62836..cc47128b 100644 --- a/src/org/fox/ttrss/ArticlePager.java +++ b/src/org/fox/ttrss/ArticlePager.java @@ -1,12 +1,12 @@ package org.fox.ttrss; import org.fox.ttrss.types.Article; -import org.fox.ttrss.util.FragmentStatePagerAdapter; import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; @@ -57,7 +57,7 @@ public class ArticlePager extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.article_pager, container, false); - m_adapter = new PagerAdapter(getActivity().getFragmentManager()); + m_adapter = new PagerAdapter(getActivity().getSupportFragmentManager()); ViewPager pager = (ViewPager) view.findViewById(R.id.article_pager); @@ -96,7 +96,7 @@ public class ArticlePager extends Fragment { public void onAttach(Activity activity) { super.onAttach(activity); - m_hf = (HeadlinesFragment) getActivity().getFragmentManager().findFragmentById(R.id.headlines_fragment); + m_hf = (HeadlinesFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.headlines_fragment); m_onlineServices = (OnlineServices)activity; } diff --git a/src/org/fox/ttrss/DummyFragment.java b/src/org/fox/ttrss/DummyFragment.java index d484f398..d23af2aa 100644 --- a/src/org/fox/ttrss/DummyFragment.java +++ b/src/org/fox/ttrss/DummyFragment.java @@ -1,7 +1,7 @@ package org.fox.ttrss; -import android.app.Fragment; import android.os.Bundle; +import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/src/org/fox/ttrss/FeedCategoriesFragment.java b/src/org/fox/ttrss/FeedCategoriesFragment.java index b2b378bc..bfe137e9 100644 --- a/src/org/fox/ttrss/FeedCategoriesFragment.java +++ b/src/org/fox/ttrss/FeedCategoriesFragment.java @@ -10,12 +10,12 @@ import java.util.List; import org.fox.ttrss.types.FeedCategory; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; diff --git a/src/org/fox/ttrss/FeedsFragment.java b/src/org/fox/ttrss/FeedsFragment.java index 92beaf97..9d18feba 100644 --- a/src/org/fox/ttrss/FeedsFragment.java +++ b/src/org/fox/ttrss/FeedsFragment.java @@ -7,6 +7,7 @@ import java.io.InputStream; import java.lang.reflect.Type; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLConnection; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -20,8 +21,14 @@ import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.protocol.ClientContext; +import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.fox.ttrss.types.Feed; @@ -29,7 +36,6 @@ import org.fox.ttrss.types.FeedCategory; import org.fox.ttrss.util.EasySSLSocketFactory; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; @@ -40,6 +46,7 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; diff --git a/src/org/fox/ttrss/HeadlinesFragment.java b/src/org/fox/ttrss/HeadlinesFragment.java index acfeeb27..5ca0a961 100644 --- a/src/org/fox/ttrss/HeadlinesFragment.java +++ b/src/org/fox/ttrss/HeadlinesFragment.java @@ -1,5 +1,6 @@ package org.fox.ttrss; +import java.io.File; import java.lang.reflect.Type; import java.net.MalformedURLException; import java.net.URL; @@ -17,7 +18,6 @@ import org.fox.ttrss.types.Feed; import org.jsoup.Jsoup; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -26,6 +26,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; import android.text.Html; import android.text.Html.ImageGetter; import android.text.method.LinkMovementMethod; diff --git a/src/org/fox/ttrss/MainActivity.java b/src/org/fox/ttrss/MainActivity.java index 23e06513..4564b9f9 100644 --- a/src/org/fox/ttrss/MainActivity.java +++ b/src/org/fox/ttrss/MainActivity.java @@ -19,11 +19,8 @@ import org.fox.ttrss.util.AppRater; import org.fox.ttrss.util.DatabaseHelper; import android.animation.LayoutTransition; -import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; -import android.app.Fragment; -import android.app.FragmentTransaction; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -39,6 +36,9 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.ActionMode; import android.view.KeyEvent; @@ -60,7 +60,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; -public class MainActivity extends Activity implements OnlineServices { +public class MainActivity extends FragmentActivity implements OnlineServices { private final String TAG = this.getClass().getSimpleName(); private SharedPreferences m_prefs; @@ -75,6 +75,7 @@ public class MainActivity extends Activity implements OnlineServices { private boolean m_smallScreenMode; private boolean m_unreadOnly = true; private boolean m_unreadArticlesOnly = true; + private boolean m_compatMode = false; private boolean m_enableCats = false; private int m_apiLevel = 0; private boolean m_isLoggingIn = false; @@ -144,7 +145,7 @@ public class MainActivity extends Activity implements OnlineServices { }; public void updateHeadlines() { - HeadlinesFragment frag = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment frag = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (frag != null) { frag.notifyUpdated(); @@ -362,7 +363,7 @@ public class MainActivity extends Activity implements OnlineServices { private synchronized void refreshFeeds() { if (m_sessionId != null) { - FeedsFragment frag = (FeedsFragment) getFragmentManager() + FeedsFragment frag = (FeedsFragment) getSupportFragmentManager() .findFragmentById(R.id.feeds_fragment); Log.d(TAG, "Refreshing feeds..."); @@ -375,7 +376,7 @@ public class MainActivity extends Activity implements OnlineServices { private synchronized void refreshHeadlines() { if (m_sessionId != null) { - HeadlinesFragment frag = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment frag = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); Log.d(TAG, "Refreshing headlines..."); @@ -388,7 +389,7 @@ public class MainActivity extends Activity implements OnlineServices { private synchronized void refreshCategories() { if (m_sessionId != null) { - FeedCategoriesFragment frag = (FeedCategoriesFragment) getFragmentManager() + FeedCategoriesFragment frag = (FeedCategoriesFragment) getSupportFragmentManager() .findFragmentById(R.id.cats_fragment); Log.d(TAG, "Refreshing categories..."); @@ -418,7 +419,7 @@ public class MainActivity extends Activity implements OnlineServices { * = unread; * * HeadlinesFragment frag = - * (HeadlinesFragment)getFragmentManager().findFragmentById + * (HeadlinesFragment)getSupportFragmentManager().findFragmentById * (R.id.headlines_fragment); * * if (frag != null) frag.refresh(false); } @@ -446,6 +447,8 @@ public class MainActivity extends Activity implements OnlineServices { m_prefs = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); + m_compatMode = android.os.Build.VERSION.SDK_INT <= 10; + if (m_prefs.getString("theme", "THEME_DARK").equals("THEME_DARK")) { setTheme(R.style.DarkTheme); } else { @@ -472,7 +475,7 @@ public class MainActivity extends Activity implements OnlineServices { m_enableCats = m_prefs.getBoolean("enable_cats", false); - m_smallScreenMode = (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != + m_smallScreenMode = m_compatMode || (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != Configuration.SCREENLAYOUT_SIZE_XLARGE; setContentView(R.layout.main); @@ -490,11 +493,18 @@ public class MainActivity extends Activity implements OnlineServices { Log.d(TAG, "m_isOffline=" + m_isOffline); Log.d(TAG, "m_smallScreenMode=" + m_smallScreenMode); + Log.d(TAG, "m_compatMode=" + m_compatMode); - LayoutTransition transitioner = new LayoutTransition(); - ((ViewGroup) findViewById(R.id.main)).setLayoutTransition(transitioner); - - m_headlinesActionModeCallback = new HeadlinesActionModeCallback(); + if (!m_compatMode) { + if (android.os.Build.VERSION.SDK_INT < 14 || android.os.Build.VERSION.SDK_INT == 15) { + if (!m_smallScreenMode) { + LayoutTransition transitioner = new LayoutTransition(); + ((ViewGroup) findViewById(R.id.main)).setLayoutTransition(transitioner); + } + } + + m_headlinesActionModeCallback = new HeadlinesActionModeCallback(); + } if (m_isOffline) { Intent offline = new Intent(MainActivity.this, @@ -756,7 +766,7 @@ public class MainActivity extends Activity implements OnlineServices { m_activeCategory = null; - FeedCategoriesFragment cf = (FeedCategoriesFragment) getFragmentManager() + FeedCategoriesFragment cf = (FeedCategoriesFragment) getSupportFragmentManager() .findFragmentById(R.id.cats_fragment); if (cf != null) { @@ -769,7 +779,7 @@ public class MainActivity extends Activity implements OnlineServices { } private void deselectAllArticles() { - HeadlinesFragment hf = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (hf != null) { @@ -799,11 +809,11 @@ public class MainActivity extends Activity implements OnlineServices { findViewById(R.id.cats_fragment) .setVisibility(View.VISIBLE); - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.headlines_fragment, new HeadlinesFragment()); ft.commit(); - FeedCategoriesFragment cf = (FeedCategoriesFragment) getFragmentManager() + FeedCategoriesFragment cf = (FeedCategoriesFragment) getSupportFragmentManager() .findFragmentById(R.id.cats_fragment); if (cf != null) { @@ -818,14 +828,14 @@ public class MainActivity extends Activity implements OnlineServices { findViewById(R.id.feeds_fragment).setVisibility( View.VISIBLE); - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.headlines_fragment, new HeadlinesFragment()); ft.commit(); refreshFeeds(); } - FeedsFragment ff = (FeedsFragment) getFragmentManager() + FeedsFragment ff = (FeedsFragment) getSupportFragmentManager() .findFragmentById(R.id.feeds_fragment); if (ff != null) { @@ -857,7 +867,7 @@ public class MainActivity extends Activity implements OnlineServices { findViewById(R.id.headlines_fragment).setVisibility( View.INVISIBLE); - FeedsFragment ff = (FeedsFragment) getFragmentManager() + FeedsFragment ff = (FeedsFragment) getSupportFragmentManager() .findFragmentById(R.id.feeds_fragment); if (ff != null) { @@ -866,7 +876,7 @@ public class MainActivity extends Activity implements OnlineServices { m_activeFeed = null; - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.headlines_fragment, new HeadlinesFragment()); ft.commit(); @@ -882,7 +892,7 @@ public class MainActivity extends Activity implements OnlineServices { @SuppressWarnings("unchecked") @Override public boolean onOptionsItemSelected(MenuItem item) { - final HeadlinesFragment hf = (HeadlinesFragment) getFragmentManager() + final HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); switch (item.getItemId()) { @@ -927,6 +937,44 @@ public class MainActivity extends Activity implements OnlineServices { return true; case android.R.id.home: goBack(false); + return true; + case R.id.search: + if (hf != null && m_compatMode) { + Dialog dialog = new Dialog(this); + + final EditText edit = new EditText(this); + + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setTitle(R.string.search) + .setPositiveButton(getString(R.string.search), + new OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, + int which) { + + String query = edit.getText().toString().trim(); + + hf.setSearchQuery(query); + + } + }) + .setNegativeButton(getString(R.string.cancel), + new OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, + int which) { + + // + + } + }).setView(edit); + + dialog = builder.create(); + dialog.show(); + } + return true; case R.id.preferences: Intent intent = new Intent(MainActivity.this, @@ -1240,7 +1288,7 @@ public class MainActivity extends Activity implements OnlineServices { m_selectedArticle = null; - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.article_fragment, new DummyFragment()); ft.commit(); @@ -1267,7 +1315,7 @@ public class MainActivity extends Activity implements OnlineServices { m_menu.setGroupVisible(R.id.menu_group_logged_in, true); m_menu.setGroupVisible(R.id.menu_group_logged_out, false); - HeadlinesFragment hf = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); int numSelected = 0; @@ -1276,8 +1324,12 @@ public class MainActivity extends Activity implements OnlineServices { numSelected = hf.getSelectedArticles().size(); if (numSelected != 0) { - if (m_headlinesActionMode == null) - m_headlinesActionMode = startActionMode(m_headlinesActionModeCallback); + if (m_compatMode) { + m_menu.setGroupVisible(R.id.menu_group_headlines_selection, true); + } else { + if (m_headlinesActionMode == null) + m_headlinesActionMode = startActionMode(m_headlinesActionModeCallback); + } } else if (m_selectedArticle != null) { m_menu.setGroupVisible(R.id.menu_group_article, true); @@ -1288,38 +1340,40 @@ public class MainActivity extends Activity implements OnlineServices { search.setEnabled(m_apiLevel >= 2); - SearchView searchView = (SearchView) search.getActionView(); - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - private String query = ""; - - @Override - public boolean onQueryTextSubmit(String query) { - HeadlinesFragment frag = (HeadlinesFragment) getFragmentManager() - .findFragmentById(R.id.headlines_fragment); + if (!m_compatMode) { + SearchView searchView = (SearchView) search.getActionView(); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + private String query = ""; - if (frag != null) { - frag.setSearchQuery(query); - this.query = query; - } - - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - if (newText.equals("") && !newText.equals(this.query)) { - HeadlinesFragment frag = (HeadlinesFragment) getFragmentManager() + @Override + public boolean onQueryTextSubmit(String query) { + HeadlinesFragment frag = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (frag != null) { - frag.setSearchQuery(newText); - this.query = newText; + frag.setSearchQuery(query); + this.query = query; } + + return false; } - return false; - } + @Override + public boolean onQueryTextChange(String newText) { + if (newText.equals("") && !newText.equals(this.query)) { + HeadlinesFragment frag = (HeadlinesFragment) getSupportFragmentManager() + .findFragmentById(R.id.headlines_fragment); + + if (frag != null) { + frag.setSearchQuery(newText); + this.query = newText; + } + } + + return false; + } }); + } } else { m_menu.setGroupVisible(R.id.menu_group_feeds, true); @@ -1329,28 +1383,32 @@ public class MainActivity extends Activity implements OnlineServices { m_headlinesActionMode.finish(); } - if (m_activeFeed != null) { - getActionBar().setTitle(m_activeFeed.title); - } else if (m_activeCategory != null) { - getActionBar().setTitle(m_activeCategory.title); - } else { - getActionBar().setTitle(R.string.app_name); - } - - if (!m_smallScreenMode) { - getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticle != null || m_activeCategory != null); - } else { - getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticle != null || m_activeFeed != null || m_activeCategory != null); - } - - if (android.os.Build.VERSION.SDK_INT >= 14) { - ShareActionProvider shareProvider = (ShareActionProvider) m_menu.findItem(R.id.share_article).getActionProvider(); + if (!m_compatMode) { - if (m_selectedArticle != null) { - Log.d(TAG, "setting up share provider"); - shareProvider.setShareIntent(getShareIntent(m_selectedArticle)); + if (m_activeFeed != null) { + getActionBar().setTitle(m_activeFeed.title); + } else if (m_activeCategory != null) { + getActionBar().setTitle(m_activeCategory.title); + } else { + getActionBar().setTitle(R.string.app_name); } + + if (!m_smallScreenMode) { + getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticle != null || m_activeCategory != null); + } else { + getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticle != null || m_activeFeed != null || m_activeCategory != null); } + + if (android.os.Build.VERSION.SDK_INT >= 14) { + ShareActionProvider shareProvider = (ShareActionProvider) m_menu.findItem(R.id.share_article).getActionProvider(); + + if (m_selectedArticle != null) { + Log.d(TAG, "setting up share provider"); + shareProvider.setShareIntent(getShareIntent(m_selectedArticle)); + } + } + + } m_menu.findItem(R.id.set_labels).setEnabled(m_apiLevel >= 1); @@ -1463,7 +1521,7 @@ public class MainActivity extends Activity implements OnlineServices { if (hasPendingOfflineData()) syncOfflineData(); - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); if (m_enableCats) { FeedCategoriesFragment frag = new FeedCategoriesFragment(); @@ -1569,7 +1627,7 @@ public class MainActivity extends Activity implements OnlineServices { if (m_menu != null) { MenuItem search = m_menu.findItem(R.id.search); - if (search != null) { + if (search != null && !m_compatMode) { SearchView sv = (SearchView) search.getActionView(); sv.setQuery("", false); } @@ -1577,12 +1635,12 @@ public class MainActivity extends Activity implements OnlineServices { HeadlinesFragment hf = new HeadlinesFragment(); - FragmentTransaction ft = getFragmentManager() + FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.replace(R.id.headlines_fragment, hf); ft.commit(); } else { - HeadlinesFragment hf = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (hf != null) { hf.refresh(true); @@ -1602,7 +1660,7 @@ public class MainActivity extends Activity implements OnlineServices { FeedsFragment frag = new FeedsFragment(); - FragmentTransaction ft = getFragmentManager() + FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.replace(R.id.feeds_fragment, frag); ft.commit(); @@ -1617,7 +1675,7 @@ public class MainActivity extends Activity implements OnlineServices { if (m_menu != null) { MenuItem search = m_menu.findItem(R.id.search); - if (search != null) { + if (search != null && !m_compatMode) { SearchView sv = (SearchView) search.getActionView(); sv.setQuery("", false); } @@ -1625,7 +1683,7 @@ public class MainActivity extends Activity implements OnlineServices { HeadlinesFragment frag = new HeadlinesFragment(); - FragmentTransaction ft = getFragmentManager() + FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.replace(R.id.headlines_fragment, frag); ft.commit(); @@ -1645,7 +1703,7 @@ public class MainActivity extends Activity implements OnlineServices { initMainMenu(); - HeadlinesFragment hf = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (hf != null) { @@ -1669,7 +1727,7 @@ public class MainActivity extends Activity implements OnlineServices { frag = new ArticleFragment(article); } - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.article_fragment, frag); ft.commit(); @@ -1764,11 +1822,11 @@ public class MainActivity extends Activity implements OnlineServices { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item .getMenuInfo(); - HeadlinesFragment hf = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); - FeedsFragment ff = (FeedsFragment) getFragmentManager() + FeedsFragment ff = (FeedsFragment) getSupportFragmentManager() .findFragmentById(R.id.feeds_fragment); - FeedCategoriesFragment cf = (FeedCategoriesFragment) getFragmentManager() + FeedCategoriesFragment cf = (FeedCategoriesFragment) getSupportFragmentManager() .findFragmentById(R.id.cats_fragment); switch (item.getItemId()) { @@ -1926,7 +1984,7 @@ public class MainActivity extends Activity implements OnlineServices { @Override public Article getRelativeArticle(Article article, RelativeArticle ra) { - HeadlinesFragment frag = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment frag = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (frag != null) { ArticleList articles = frag.getAllArticles(); @@ -1960,7 +2018,7 @@ public class MainActivity extends Activity implements OnlineServices { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_DOWN: if (action == KeyEvent.ACTION_DOWN) { - HeadlinesFragment hf = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (hf != null && m_activeFeed != null) { @@ -1987,7 +2045,7 @@ public class MainActivity extends Activity implements OnlineServices { return true; case KeyEvent.KEYCODE_VOLUME_UP: if (action == KeyEvent.ACTION_UP) { - HeadlinesFragment hf = (HeadlinesFragment) getFragmentManager() + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (hf != null && m_activeFeed != null) { diff --git a/src/org/fox/ttrss/offline/OfflineActivity.java b/src/org/fox/ttrss/offline/OfflineActivity.java index 8849d67e..dfda5d5c 100644 --- a/src/org/fox/ttrss/offline/OfflineActivity.java +++ b/src/org/fox/ttrss/offline/OfflineActivity.java @@ -3,23 +3,14 @@ package org.fox.ttrss.offline; import org.fox.ttrss.DummyFragment; import org.fox.ttrss.MainActivity; import org.fox.ttrss.OnlineServices; -import org.fox.ttrss.PreferencesActivity; -import org.fox.ttrss.R; import org.fox.ttrss.OnlineServices.RelativeArticle; -import org.fox.ttrss.R.anim; -import org.fox.ttrss.R.id; -import org.fox.ttrss.R.layout; -import org.fox.ttrss.R.menu; -import org.fox.ttrss.R.string; -import org.fox.ttrss.R.style; +import org.fox.ttrss.PreferencesActivity; import org.fox.ttrss.util.DatabaseHelper; +import org.fox.ttrss.R; import android.animation.LayoutTransition; -import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; -import android.app.Fragment; -import android.app.FragmentTransaction; import android.app.NotificationManager; import android.content.Context; import android.content.DialogInterface; @@ -33,6 +24,9 @@ import android.database.sqlite.SQLiteStatement; import android.os.Bundle; import android.preference.PreferenceManager; import android.provider.BaseColumns; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.ActionMode; import android.view.KeyEvent; @@ -48,7 +42,7 @@ import android.widget.SearchView; import android.widget.TextView; import android.widget.Toast; -public class OfflineActivity extends Activity implements +public class OfflineActivity extends FragmentActivity implements OfflineServices { private final String TAG = this.getClass().getSimpleName(); @@ -58,6 +52,7 @@ public class OfflineActivity extends Activity implements private boolean m_smallScreenMode; private boolean m_unreadOnly = true; private boolean m_unreadArticlesOnly = true; + private boolean m_compatMode = false; private boolean m_enableCats = false; private int m_activeFeedId = 0; @@ -110,6 +105,8 @@ public class OfflineActivity extends Activity implements m_prefs = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); + m_compatMode = android.os.Build.VERSION.SDK_INT <= 10; + if (m_prefs.getString("theme", "THEME_DARK").equals("THEME_DARK")) { setTheme(R.style.DarkTheme); } else { @@ -133,21 +130,24 @@ public class OfflineActivity extends Activity implements m_enableCats = m_prefs.getBoolean("enable_cats", false); - m_smallScreenMode = (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != + m_smallScreenMode = m_compatMode || (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != Configuration.SCREENLAYOUT_SIZE_XLARGE; setContentView(R.layout.main); Log.d(TAG, "m_smallScreenMode=" + m_smallScreenMode); + Log.d(TAG, "m_compatMode=" + m_compatMode); - if (android.os.Build.VERSION.SDK_INT < 14 /* || android.os.Build.VERSION.SDK_INT == 15 */) { - if (!m_smallScreenMode) { - LayoutTransition transitioner = new LayoutTransition(); - ((ViewGroup) findViewById(R.id.main)).setLayoutTransition(transitioner); + if (!m_compatMode) { + if (android.os.Build.VERSION.SDK_INT < 14 /* || android.os.Build.VERSION.SDK_INT == 15 */) { + if (!m_smallScreenMode) { + LayoutTransition transitioner = new LayoutTransition(); + ((ViewGroup) findViewById(R.id.main)).setLayoutTransition(transitioner); + } } + + m_headlinesActionModeCallback = new HeadlinesActionModeCallback(); } - - m_headlinesActionModeCallback = new HeadlinesActionModeCallback(); initMainMenu(); @@ -196,7 +196,7 @@ public class OfflineActivity extends Activity implements } if (m_activeFeedId == 0) { - FragmentTransaction ft = getFragmentManager() + FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); OfflineFeedsFragment frag = new OfflineFeedsFragment(); ft.replace(R.id.feeds_fragment, frag); @@ -343,14 +343,14 @@ public class OfflineActivity extends Activity implements // } m_activeFeedId = 0; - OfflineFeedsFragment ff = (OfflineFeedsFragment) getFragmentManager() + OfflineFeedsFragment ff = (OfflineFeedsFragment) getSupportFragmentManager() .findFragmentById(R.id.feeds_fragment); if (ff != null) { ff.setSelectedFeedId(0); } - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.headlines_fragment, new OfflineHeadlinesFragment()); ft.commit(); @@ -367,14 +367,14 @@ public class OfflineActivity extends Activity implements findViewById(R.id.headlines_fragment).setVisibility(View.INVISIBLE); m_activeFeedId = 0; - OfflineFeedsFragment ff = (OfflineFeedsFragment) getFragmentManager() + OfflineFeedsFragment ff = (OfflineFeedsFragment) getSupportFragmentManager() .findFragmentById(R.id.feeds_fragment); if (ff != null) { ff.setSelectedFeedId(0); } - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.headlines_fragment, new OfflineHeadlinesFragment()); ft.commit(); @@ -472,7 +472,7 @@ public class OfflineActivity extends Activity implements } private void refreshHeadlines() { - OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getFragmentManager() + OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (ohf != null) { @@ -482,12 +482,50 @@ public class OfflineActivity extends Activity implements @Override public boolean onOptionsItemSelected(MenuItem item) { - final OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getFragmentManager() + final OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); switch (item.getItemId()) { case android.R.id.home: goBack(false); + return true; + case R.id.search: + if (ohf != null && m_compatMode) { + Dialog dialog = new Dialog(this); + + final EditText edit = new EditText(this); + + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setTitle(R.string.search) + .setPositiveButton(getString(R.string.search), + new OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, + int which) { + + String query = edit.getText().toString().trim(); + + ohf.setSearchQuery(query); + + } + }) + .setNegativeButton(getString(R.string.cancel), + new OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, + int which) { + + // + + } + }).setView(edit); + + dialog = builder.create(); + dialog.show(); + } + return true; case R.id.preferences: Intent intent = new Intent(this, PreferencesActivity.class); @@ -657,7 +695,7 @@ public class OfflineActivity extends Activity implements } private void refreshFeeds() { - OfflineFeedsFragment frag = (OfflineFeedsFragment) getFragmentManager() + OfflineFeedsFragment frag = (OfflineFeedsFragment) getSupportFragmentManager() .findFragmentById(R.id.feeds_fragment); if (frag != null) { @@ -685,7 +723,7 @@ public class OfflineActivity extends Activity implements m_selectedArticleId = 0; - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.article_fragment, new DummyFragment()); ft.commit(); @@ -714,8 +752,12 @@ public class OfflineActivity extends Activity implements m_menu.setGroupVisible(R.id.menu_group_article, false); if (numSelected != 0) { - if (m_headlinesActionMode == null) - m_headlinesActionMode = startActionMode(m_headlinesActionModeCallback); + if (m_compatMode) { + m_menu.setGroupVisible(R.id.menu_group_headlines_selection, true); + } else { + if (m_headlinesActionMode == null) + m_headlinesActionMode = startActionMode(m_headlinesActionModeCallback); + } } else if (m_selectedArticleId != 0) { m_menu.setGroupVisible(R.id.menu_group_article, true); } else if (m_activeFeedId != 0) { @@ -723,38 +765,40 @@ public class OfflineActivity extends Activity implements MenuItem search = m_menu.findItem(R.id.search); - SearchView searchView = (SearchView) search.getActionView(); - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - private String query = ""; - - @Override - public boolean onQueryTextSubmit(String query) { - OfflineHeadlinesFragment frag = (OfflineHeadlinesFragment) getFragmentManager() - .findFragmentById(R.id.headlines_fragment); + if (!m_compatMode) { + SearchView searchView = (SearchView) search.getActionView(); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + private String query = ""; - if (frag != null) { - frag.setSearchQuery(query); - this.query = query; - } - - return false; - } - - @Override - public boolean onQueryTextChange(String newText) { - if (newText.equals("") && !newText.equals(this.query)) { - OfflineHeadlinesFragment frag = (OfflineHeadlinesFragment) getFragmentManager() + @Override + public boolean onQueryTextSubmit(String query) { + OfflineHeadlinesFragment frag = (OfflineHeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (frag != null) { - frag.setSearchQuery(newText); - this.query = newText; + frag.setSearchQuery(query); + this.query = query; } + + return false; } - return false; - } - }); + @Override + public boolean onQueryTextChange(String newText) { + if (newText.equals("") && !newText.equals(this.query)) { + OfflineHeadlinesFragment frag = (OfflineHeadlinesFragment) getSupportFragmentManager() + .findFragmentById(R.id.headlines_fragment); + + if (frag != null) { + frag.setSearchQuery(newText); + this.query = newText; + } + } + + return false; + } + }); + } } else { m_menu.setGroupVisible(R.id.menu_group_feeds, true); @@ -764,20 +808,23 @@ public class OfflineActivity extends Activity implements m_headlinesActionMode.finish(); } - if (m_activeFeedId != 0) { - Cursor feed = getFeedById(m_activeFeedId); + if (!m_compatMode) { - if (feed != null) { - getActionBar().setTitle(feed.getString(feed.getColumnIndex("title"))); + if (m_activeFeedId != 0) { + Cursor feed = getFeedById(m_activeFeedId); + + if (feed != null) { + getActionBar().setTitle(feed.getString(feed.getColumnIndex("title"))); + } + } else { + getActionBar().setTitle(R.string.app_name); + } + + if (!m_smallScreenMode) { + getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticleId != 0); + } else { + getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticleId != 0 || m_activeFeedId != 0); } - } else { - getActionBar().setTitle(R.string.app_name); - } - - if (!m_smallScreenMode) { - getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticleId != 0); - } else { - getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticleId != 0 || m_activeFeedId != 0); } } } @@ -807,9 +854,9 @@ public class OfflineActivity extends Activity implements AdapterContextMenuInfo info = (AdapterContextMenuInfo) item .getMenuInfo(); - OfflineHeadlinesFragment hf = (OfflineHeadlinesFragment) getFragmentManager() + OfflineHeadlinesFragment hf = (OfflineHeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); - OfflineFeedsFragment ff = (OfflineFeedsFragment) getFragmentManager() + OfflineFeedsFragment ff = (OfflineFeedsFragment) getSupportFragmentManager() .findFragmentById(R.id.feeds_fragment); switch (item.getItemId()) { @@ -972,7 +1019,7 @@ public class OfflineActivity extends Activity implements case KeyEvent.KEYCODE_VOLUME_DOWN: if (action == KeyEvent.ACTION_DOWN) { - OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getFragmentManager() + OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); int nextId = getRelativeArticleId(m_selectedArticleId, @@ -1001,7 +1048,7 @@ public class OfflineActivity extends Activity implements case KeyEvent.KEYCODE_VOLUME_UP: if (action == KeyEvent.ACTION_UP) { - OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getFragmentManager() + OfflineHeadlinesFragment ohf = (OfflineHeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); int prevId = getRelativeArticleId(m_selectedArticleId, @@ -1104,13 +1151,13 @@ public class OfflineActivity extends Activity implements if (m_menu != null) { MenuItem search = m_menu.findItem(R.id.search); - if (search != null) { + if (search != null && !m_compatMode) { SearchView sv = (SearchView) search.getActionView(); sv.setQuery("", false); } } - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); OfflineHeadlinesFragment frag = new OfflineHeadlinesFragment(); ft.replace(R.id.headlines_fragment, frag); ft.commit(); @@ -1123,7 +1170,7 @@ public class OfflineActivity extends Activity implements initMainMenu(); - OfflineHeadlinesFragment hf = (OfflineHeadlinesFragment) getFragmentManager() + OfflineHeadlinesFragment hf = (OfflineHeadlinesFragment) getSupportFragmentManager() .findFragmentById(R.id.headlines_fragment); if (hf != null) { @@ -1146,7 +1193,7 @@ public class OfflineActivity extends Activity implements frag = new OfflineArticleFragment(articleId); } - FragmentTransaction ft = getFragmentManager().beginTransaction(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.article_fragment, frag); ft.commit(); diff --git a/src/org/fox/ttrss/offline/OfflineArticleFragment.java b/src/org/fox/ttrss/offline/OfflineArticleFragment.java index 893a7d28..9df30279 100644 --- a/src/org/fox/ttrss/offline/OfflineArticleFragment.java +++ b/src/org/fox/ttrss/offline/OfflineArticleFragment.java @@ -15,20 +15,20 @@ import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.app.Activity; -import android.app.Fragment; import android.content.SharedPreferences; import android.database.Cursor; import android.os.Bundle; import android.preference.PreferenceManager; import android.provider.BaseColumns; +import android.support.v4.app.Fragment; import android.text.Html; import android.text.method.LinkMovementMethod; import android.util.TypedValue; import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ContextMenu.ContextMenuInfo; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.TextView; diff --git a/src/org/fox/ttrss/offline/OfflineArticlePager.java b/src/org/fox/ttrss/offline/OfflineArticlePager.java index 0e3d87ee..aa50805e 100644 --- a/src/org/fox/ttrss/offline/OfflineArticlePager.java +++ b/src/org/fox/ttrss/offline/OfflineArticlePager.java @@ -3,14 +3,15 @@ package org.fox.ttrss.offline; import org.fox.ttrss.R; import org.fox.ttrss.R.id; import org.fox.ttrss.R.layout; -import org.fox.ttrss.util.FragmentStatePagerAdapter; import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; +import android.database.Cursor; import android.database.sqlite.SQLiteStatement; import android.os.Bundle; import android.provider.BaseColumns; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; @@ -61,7 +62,7 @@ public class OfflineArticlePager extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.article_pager, container, false); - m_adapter = new PagerAdapter(getActivity().getFragmentManager()); + m_adapter = new PagerAdapter(getActivity().getSupportFragmentManager()); ViewPager pager = (ViewPager) view.findViewById(R.id.article_pager); @@ -104,7 +105,7 @@ public class OfflineArticlePager extends Fragment { public void onAttach(Activity activity) { super.onAttach(activity); - m_hf = (OfflineHeadlinesFragment) getActivity().getFragmentManager().findFragmentById(R.id.headlines_fragment); + m_hf = (OfflineHeadlinesFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.headlines_fragment); m_offlineServices = (OfflineServices)activity; } diff --git a/src/org/fox/ttrss/offline/OfflineFeedsFragment.java b/src/org/fox/ttrss/offline/OfflineFeedsFragment.java index abdfe756..f1eafd20 100644 --- a/src/org/fox/ttrss/offline/OfflineFeedsFragment.java +++ b/src/org/fox/ttrss/offline/OfflineFeedsFragment.java @@ -9,7 +9,6 @@ import org.fox.ttrss.R.layout; import org.fox.ttrss.R.menu; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; @@ -20,6 +19,8 @@ import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.provider.BaseColumns; +import android.support.v4.app.Fragment; +import android.support.v4.widget.SimpleCursorAdapter; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -31,7 +32,6 @@ import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.ListView; -import android.widget.SimpleCursorAdapter; import android.widget.TextView; public class OfflineFeedsFragment extends Fragment implements OnItemClickListener, OnSharedPreferenceChangeListener { diff --git a/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java b/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java index 59dc7046..56ec2b71 100644 --- a/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java +++ b/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java @@ -14,7 +14,6 @@ import org.fox.ttrss.R.string; import org.jsoup.Jsoup; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; @@ -24,6 +23,8 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.PreferenceManager; import android.provider.BaseColumns; +import android.support.v4.app.Fragment; +import android.support.v4.widget.SimpleCursorAdapter; import android.text.Html; import android.text.Html.ImageGetter; import android.text.method.LinkMovementMethod; @@ -40,7 +41,6 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.ListView; -import android.widget.SimpleCursorAdapter; import android.widget.TextView; public class OfflineHeadlinesFragment extends Fragment implements OnItemClickListener { diff --git a/src/org/fox/ttrss/util/FragmentStatePagerAdapter.java b/src/org/fox/ttrss/util/FragmentStatePagerAdapter.java deleted file mode 100644 index 26494fdc..00000000 --- a/src/org/fox/ttrss/util/FragmentStatePagerAdapter.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.fox.ttrss.util; - -import android.app.Fragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.os.Bundle; -import android.os.Parcelable; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.PagerAdapter; -import android.util.Log; -import android.view.View; -import android.view.ViewGroup; - -import java.util.ArrayList; - -/** - * Implementation of {@link android.support.v4.view.PagerAdapter} that - * uses a {@link Fragment} to manage each page. This class also handles - * saving and restoring of fragment's state. - * - *

This version of the pager is more useful when there are a large number - * of pages, working more like a list view. When pages are not visible to - * the user, their entire fragment may be destroyed, only keeping the saved - * state of that fragment. This allows the pager to hold on to much less - * memory associated with each visited page as compared to - * {@link FragmentPagerAdapter} at the cost of potentially more overhead when - * switching between pages. - * - *

When using FragmentPagerAdapter the host ViewPager must have a - * valid ID set.

- * - *

Subclasses only need to implement {@link #getItem(int)} - * and {@link #getCount()} to have a working adapter. - * - *

Here is an example implementation of a pager containing fragments of - * lists: - * - * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.java - * complete} - * - *

The R.layout.fragment_pager resource of the top-level fragment is: - * - * {@sample development/samples/Support4Demos/res/layout/fragment_pager.xml - * complete} - * - *

The R.layout.fragment_pager_list resource containing each - * individual fragment's layout is: - * - * {@sample development/samples/Support4Demos/res/layout/fragment_pager_list.xml - * complete} - */ -public abstract class FragmentStatePagerAdapter extends PagerAdapter { - private static final String TAG = "FragmentStatePagerAdapter"; - private static final boolean DEBUG = false; - - private final FragmentManager mFragmentManager; - private FragmentTransaction mCurTransaction = null; - - private ArrayList mSavedState = new ArrayList(); - private ArrayList mFragments = new ArrayList(); - private Fragment mCurrentPrimaryItem = null; - - public FragmentStatePagerAdapter(FragmentManager fm) { - mFragmentManager = fm; - } - - /** - * Return the Fragment associated with a specified position. - */ - public abstract Fragment getItem(int position); - - @Override - public void startUpdate(ViewGroup container) { - } - - @Override - public Object instantiateItem(ViewGroup container, int position) { - // If we already have this item instantiated, there is nothing - // to do. This can happen when we are restoring the entire pager - // from its saved state, where the fragment manager has already - // taken care of restoring the fragments we previously had instantiated. - if (mFragments.size() > position) { - Fragment f = mFragments.get(position); - if (f != null) { - return f; - } - } - - if (mCurTransaction == null) { - mCurTransaction = mFragmentManager.beginTransaction(); - } - - Fragment fragment = getItem(position); - if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment); - if (mSavedState.size() > position) { - Fragment.SavedState fss = mSavedState.get(position); - if (fss != null) { - fragment.setInitialSavedState(fss); - } - } - while (mFragments.size() <= position) { - mFragments.add(null); - } - fragment.setMenuVisibility(false); - mFragments.set(position, fragment); - mCurTransaction.add(container.getId(), fragment); - - return fragment; - } - - @Override - public void destroyItem(ViewGroup container, int position, Object object) { - Fragment fragment = (Fragment)object; - - if (mCurTransaction == null) { - mCurTransaction = mFragmentManager.beginTransaction(); - } - if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object - + " v=" + ((Fragment)object).getView()); - while (mSavedState.size() <= position) { - mSavedState.add(null); - } - mSavedState.set(position, mFragmentManager.saveFragmentInstanceState(fragment)); - mFragments.set(position, null); - - mCurTransaction.remove(fragment); - } - - @Override - public void setPrimaryItem(ViewGroup container, int position, Object object) { - Fragment fragment = (Fragment)object; - if (fragment != mCurrentPrimaryItem) { - if (mCurrentPrimaryItem != null) { - fragment.setMenuVisibility(false); - } - if (fragment != null) { - fragment.setMenuVisibility(true); - } - mCurrentPrimaryItem = fragment; - } - } - - @Override - public void finishUpdate(ViewGroup container) { - if (mCurTransaction != null) { - mCurTransaction.commitAllowingStateLoss(); - mCurTransaction = null; - mFragmentManager.executePendingTransactions(); - } - } - - @Override - public boolean isViewFromObject(View view, Object object) { - return ((Fragment)object).getView() == view; - } - - @Override - public Parcelable saveState() { - Bundle state = null; - if (mSavedState.size() > 0) { - state = new Bundle(); - Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()]; - mSavedState.toArray(fss); - state.putParcelableArray("states", fss); - } - for (int i=0; i keys = bundle.keySet(); - for (String key: keys) { - if (key.startsWith("f")) { - int index = Integer.parseInt(key.substring(1)); - Fragment f = mFragmentManager.getFragment(bundle, key); - if (f != null) { - while (mFragments.size() <= index) { - mFragments.add(null); - } - f.setMenuVisibility(false); - mFragments.set(index, f); - } else { - Log.w(TAG, "Bad fragment at key " + key); - } - } - } - } - } -}