From 3fc8d3cc9005df274d619f6e4efdb9626a00b5e4 Mon Sep 17 00:00:00 2001 From: dai <13991560143@163.com> Date: Mon, 13 Jan 2025 10:06:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\"C:\\Users\\Lenovo\\Desktop\\notes\"" | 0 README.md | 2 - doc/小米便签泛读报告.docx | Bin 534838 -> 0 bytes gtask/MiNote | 1 + .../notes/gtask => gtask}/data/MetaData.java | 0 .../notes/gtask => gtask}/data/Node.java | 0 gtask/data/SqlData.java | 189 ++++ gtask/data/SqlNote.java | 493 ++++++++ gtask/data/Task.java | 361 ++++++ gtask/data/TaskList.java | 356 ++++++ gtask/exception/ActionFailureException.java | 38 + gtask/exception/NetworkFailureException.java | 38 + .../remote/GTaskASyncTask.java | 0 .../gtask => gtask}/remote/GTaskClient.java | 0 .../gtask => gtask}/remote/GTaskManager.java | 0 .../remote/GTaskSyncService.java | 0 src/net/micode/notes/data/Contact.java | 83 -- src/net/micode/notes/data/Notes.java | 193 ---- .../notes/data/NotesDatabaseHelper.java | 445 -------- src/net/micode/notes/data/NotesProvider.java | 402 ------- src/net/micode/notes/gtask/data/SqlData.java | 189 ---- src/net/micode/notes/gtask/data/SqlNote.java | 505 --------- src/net/micode/notes/gtask/data/Task.java | 351 ------ src/net/micode/notes/gtask/data/TaskList.java | 343 ------ .../exception/ActionFailureException.java | 33 - .../exception/NetworkFailureException.java | 33 - src/net/micode/notes/model/Note.java | 253 ----- src/net/micode/notes/model/WorkingNote.java | 368 ------ src/net/micode/notes/tool/BackupUtils.java | 344 ------ src/net/micode/notes/tool/DataUtils.java | 295 ----- .../micode/notes/tool/GTaskStringUtils.java | 112 -- src/net/micode/notes/tool/ResourceParser.java | 181 --- .../micode/notes/ui/AlarmAlertActivity.java | 158 --- .../micode/notes/ui/AlarmInitReceiver.java | 65 -- src/net/micode/notes/ui/AlarmReceiver.java | 30 - src/net/micode/notes/ui/DateTimePicker.java | 485 -------- .../micode/notes/ui/DateTimePickerDialog.java | 90 -- src/net/micode/notes/ui/DropdownMenu.java | 61 - .../micode/notes/ui/FoldersListAdapter.java | 80 -- src/net/micode/notes/ui/NoteEditActivity.java | 873 -------------- src/net/micode/notes/ui/NoteEditText.java | 217 ---- src/net/micode/notes/ui/NoteItemData.java | 224 ---- .../micode/notes/ui/NotesListActivity.java | 1002 ----------------- src/net/micode/notes/ui/NotesListAdapter.java | 184 --- src/net/micode/notes/ui/NotesListItem.java | 122 -- .../notes/ui/NotesPreferenceActivity.java | 388 ------- .../notes/widget/NoteWidgetProvider.java | 132 --- .../notes/widget/NoteWidgetProvider_2x.java | 47 - .../notes/widget/NoteWidgetProvider_4x.java | 46 - 49 files changed, 1476 insertions(+), 8336 deletions(-) delete mode 100644 "\"C:\\Users\\Lenovo\\Desktop\\notes\"" delete mode 100644 README.md delete mode 100644 doc/小米便签泛读报告.docx create mode 160000 gtask/MiNote rename {src/net/micode/notes/gtask => gtask}/data/MetaData.java (100%) rename {src/net/micode/notes/gtask => gtask}/data/Node.java (100%) create mode 100644 gtask/data/SqlData.java create mode 100644 gtask/data/SqlNote.java create mode 100644 gtask/data/Task.java create mode 100644 gtask/data/TaskList.java create mode 100644 gtask/exception/ActionFailureException.java create mode 100644 gtask/exception/NetworkFailureException.java rename {src/net/micode/notes/gtask => gtask}/remote/GTaskASyncTask.java (100%) rename {src/net/micode/notes/gtask => gtask}/remote/GTaskClient.java (100%) rename {src/net/micode/notes/gtask => gtask}/remote/GTaskManager.java (100%) rename {src/net/micode/notes/gtask => gtask}/remote/GTaskSyncService.java (100%) delete mode 100644 src/net/micode/notes/data/Contact.java delete mode 100644 src/net/micode/notes/data/Notes.java delete mode 100644 src/net/micode/notes/data/NotesDatabaseHelper.java delete mode 100644 src/net/micode/notes/data/NotesProvider.java delete mode 100644 src/net/micode/notes/gtask/data/SqlData.java delete mode 100644 src/net/micode/notes/gtask/data/SqlNote.java delete mode 100644 src/net/micode/notes/gtask/data/Task.java delete mode 100644 src/net/micode/notes/gtask/data/TaskList.java delete mode 100644 src/net/micode/notes/gtask/exception/ActionFailureException.java delete mode 100644 src/net/micode/notes/gtask/exception/NetworkFailureException.java delete mode 100644 src/net/micode/notes/model/Note.java delete mode 100644 src/net/micode/notes/model/WorkingNote.java delete mode 100644 src/net/micode/notes/tool/BackupUtils.java delete mode 100644 src/net/micode/notes/tool/DataUtils.java delete mode 100644 src/net/micode/notes/tool/GTaskStringUtils.java delete mode 100644 src/net/micode/notes/tool/ResourceParser.java delete mode 100644 src/net/micode/notes/ui/AlarmAlertActivity.java delete mode 100644 src/net/micode/notes/ui/AlarmInitReceiver.java delete mode 100644 src/net/micode/notes/ui/AlarmReceiver.java delete mode 100644 src/net/micode/notes/ui/DateTimePicker.java delete mode 100644 src/net/micode/notes/ui/DateTimePickerDialog.java delete mode 100644 src/net/micode/notes/ui/DropdownMenu.java delete mode 100644 src/net/micode/notes/ui/FoldersListAdapter.java delete mode 100644 src/net/micode/notes/ui/NoteEditActivity.java delete mode 100644 src/net/micode/notes/ui/NoteEditText.java delete mode 100644 src/net/micode/notes/ui/NoteItemData.java delete mode 100644 src/net/micode/notes/ui/NotesListActivity.java delete mode 100644 src/net/micode/notes/ui/NotesListAdapter.java delete mode 100644 src/net/micode/notes/ui/NotesListItem.java delete mode 100644 src/net/micode/notes/ui/NotesPreferenceActivity.java delete mode 100644 src/net/micode/notes/widget/NoteWidgetProvider.java delete mode 100644 src/net/micode/notes/widget/NoteWidgetProvider_2x.java delete mode 100644 src/net/micode/notes/widget/NoteWidgetProvider_4x.java diff --git "a/\"C:\\Users\\Lenovo\\Desktop\\notes\"" "b/\"C:\\Users\\Lenovo\\Desktop\\notes\"" deleted file mode 100644 index e69de29..0000000 diff --git a/README.md b/README.md deleted file mode 100644 index ef7e300..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# MiNote - diff --git a/doc/小米便签泛读报告.docx b/doc/小米便签泛读报告.docx deleted file mode 100644 index fbd5ed6dc5aa22b624aee5d16481ab272cee6ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534838 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

Qf9KEHH0YD%!nk1}#t1>{mAVh^Ig-iQ#FO z--lSyjB-?;4#${5cNr3Uu~TgfQ6k@%vz%jti(5YyZ5rz`ZI2!(X_E=R-BexBlrLW^ zRgzy3PAd&5Jq{X(`B-3Qk2I|wyf-WqE4jMpn~Yz!px7Uyv6qW~m25B;4=X1G-fHUE z@bw@&D34h$dK7WzdxuJq3J9Q!RcK`(kQ;B0UVuzK_+f^0fcmlXZ14voC1=qQwa zZTkj8jaacmyZA_eoC3_)C&?D$Y=4t8v00bf;$vaITa zO}#%|TOE3`d$oMQ`Lw04sYx|8ka$zRW590;pmf=K4a_x6nm!UQuG*cSRIFM_>Qx9Y zu6Y_wl*Fvu?kji+d5Z>3;H5s!c&-=v4jXWsHdw_(-&#cv_{R-nWyHh>hnWD2OBP%z8uE+K{8bt z?{Y_Zx#0cd`+fmJI)0(WeGW4l*1YyQO@Ogvo@?-WYs&=SKfhT;($^h4>M78on)o57 zfVv{~R1HhKhAs6l#&3rO0g!b9=9O38hS)0}Ja^3EcFI>a z$r7ZlHYdk>Qd?|k_@#P{HKToV?d{ju&~I`2AP^S(S|sC@2CS)#xU zy{eQMRx5eFnCrU4>@eG%Yb5f4F|{ZqEKk#q=W! zLDtwy<6ur`TRY>?wGx)^j=9-e<8~o^xh+WrN}Ky+QnB47n|u183|w_L3>ZvL4IZVKdot!}#S9dAm}6rj)*tS2gWL zeWJszNt?$mG!p}kAdC{caUj5@AZ)?k) zIG%W~w^s^`9dU^fL7n4)G4U%#iG8;jdcGDG6D1A$7>nt@%Z4>&Gksa6AF>JsHANL* z8ql8J+rD)l(9|zbVr;R5ujB8$6U}`RB8#F)tuq`*`Shk7W8@dcumX!-J8jdZB_f;H z)`er-=yTu{pKSDdQle~l`{Jgx!|**$p|RE7>1BTaH4O@-^Z5zl?TDV%;~DyCJw)qt zY!rzju{4T=j_pCQ+P#Z$k4E%=Y`UMy0fyAy__9PjoXXVXdpB(8pAbkI$P<7^egh;e zi(Z#mRR63Q0Km%Mh>_p0OMBfTo;jc@8q{3SK%)Ro3DKMX?|4B7Z29l6|LW?0g&Y5C z8-I-He@Dun9`65_+DHdAar+`pU1^6xD1Zk0CnB%mo#5<%yv5b05%XMnxUUSq;C)NF zxFAr>M&n`wMZ*pJzUl+=dRL#a01*Ap8)fkpPHdVWCE-XbsQW*Qn!?Lb2CfBv=0YYmSC>D zJjq)%tnUbgwj!K=g|eQff(Tc@nZPb6!b1!0fpD5LpuB{=2qdF2I1%G7K~ylH48+u6 zY*i0RjL*)1cxe7K$QV@?&B6lSq=CrT-TAtH4^L1QrAKW|fxZPO3h-@bYtc-~<~Sdb zDi5NWXk_0YbTA=q2MpxSfDF5Zk{norE5tFf;_z9B$rdm&!|wb=`$-__HtUUw2fc&( zHp$UcDnz?!G5{({V9%2wc|V_{M%e#DcO6G{{tFZ%!N5s#bTE|5J>lbSP=<7Iu4<8N)o1K!T<`@{dO?Xtz%i)-@km3A z&^6Nuc6t0Ukd)68X;LsgF?tQL=F2} zr+eX5BJf$L2nn!B{(Qrkk=G%@ts#|w2^R!XVFx84fmFOed^wuc6G{t%c;$(oz4id) zUx^Ka_*hdDKr{JMiZezoEj%FY2<2Y>xxEZzS{6rVuW)bN{O9(05FeI=&&scTW&#;? z*eKvEg`Hr8k^tn(;tFD`4I5bhfKa{|2%ci6Jt=L`H%tjVIQQMGbcBn+k;pg z3b0iQ($mD=gNy<}?-A53*za%FK($vCt7oi#Jm|&83M2Q zvmv9w0zf+BId8pxZhwG})+00wDzO^h`a=)yJ-0z749cne(>QQAtGfx#_`&C0f1C03 zIwPWKc6sHzzz%<=I)3X0G6s-;-I{R%tfsIp5K+J4VW>*JmBK~-LW`Os{k6* z$Zi9YFTW*91p^9nY_5}^-9NX_zti+P2ZSfbl>T|?dYcVUUAvRN>mQf)WBeuHv!LE) zJM#~rD4^~Wv}xvJH%PJlZWC102n2v!#XkZ-2}+<6r~>aFmB>@qF~BeZW%I@#&4=p5 zz@>xW7 z=mwx!h|sVd6jlFxZhH=mkQB--(!s9s_K(hfu>fs7&~ZSn5?>+PXZeilqY%~uI?*$? zPqTHhe}u0@C{+QVQ@yrOKBKK;B|@g7G!9b0HVQ%41DZ2T0O#dITyLE~l#R>*1E+@` z-X1?n9Qq#`8sqSoH(LlnR~lz1&_WVTR9jZhCd+5DvSn}X?X|&%<>}y-V}C-lU=n~4 z7j`iITS#R+M*bxBt6)o=JD{F1NyD#VOA;t+9SI!7pGv#)oW^OQk{2w`(k!q z>5-@1yw!TeS zLa7v3CIA{)s5Y3^`Fmsg{EbRBMf)El8a&k9OetT`&P%X9q{rW(i_AA(mH?ioLM+<0SHj*|k?J+5#}*npS^2 ziLF+h#O|~15R+eq-iuamP4St12keNSHUzYAx8Y9NTMd2IbTOumQKrko%6(@?8(RyD zi-=Qi4Dk|pk8i=1?4)~1>XHK;t*(Z0^!YV21;i{SA8ii|1GO&G5@k3SUuzBVXfJdy zz(C3cj4Ul&H2RngIyYmctyqg+;#|l5U51Mr=7_}=aHQB~Ud4?|Wd^-?DPEb63uQ%p zT1F=2d4l^FFFP;Gzxt3!4E;PpIIz05uo)@?1C_kcsEH7oJ@XD|?5@PGK?K1XU?R|b z4~-Y-G_IfLwLoKqhDB(DW>IMTK^O*@^)GGFZ~(BP--8u`YC+}BG?8f-F>n9}G!TBW zLj3!>f0g-v%T%nKSG%9dsaSqsoO1?-t45m>)XvV9IAD3j)*yS9rr9$fB}K{y1pw6#sU^vEIf27+Gplr zu;Ox+tCwzhnM`k)-aEcNL_|zkKRu+n^3L4@b%31rCQmsTn=ljD^;qzJj)kD4Snq+D z)bvYi4vf0H3$FWc2{vAnP?NYN7xC=aZP)2h!IfFMy{&QH6<@fx`jpJ(Pwjr}r`1sY zHbnfUs&SdR@jf;K5u&4TErrsU+Sc6s9Q;vhfS($Muiboe%i7ZN+*oYw+Qn0@SAnq5 z=jv-&Q2qdY%x|VZ%=6$QdKNSq`UJ2=+5G&Q;=We#pMN{C8_)jpZwDWfK?w%*d4352 zDF}SNr2YH2pPHcQP7E9ZWZD8&j8&)`=xBHb?orw{*&WJ(y_^o$jHb@ zaMLF^=5>nQ<>tF%bMp^&9t#dA7d_b@ST1^(uT>mXTeMzpiqzaA)iB{f)I1n>W~t-% z<>}ZV0D}0j8M|XYq6ruG!oCj2_JJ86|BP|R$^I{?CnmlGs9c^qi`mm6Tro2#@wOp; zTVdBRa_AqAXJX!YxiCoK(oMC)-pYt;*FC;EXqH}5dib=;!cpzI#IN?%?|k^e{&3QX zv%HMeuVhc3shlVw#@Ymf*Eat5YtP6+&+1D5c@?W5<_LIW@PEHi<=f6nqAJ&)kwafh zzs8!B$?6=r*L<4L7--2%Xbea`i;-13xTl5JnR#c!nO8nhHi4F`gDbCF#Ua7W{#&pv z$46;#XWV{2%m|Trw(|vFTNq;tZ(A6hj8+OF?!>_eb!qj3M0ix^&43#4fz#FE zav`Iu#V3s@8!p~GftHbuynBLGF8^*oL=2=ei9al4nO?p6@`66%&v9g_ad>Yg8WQv_XzUjP}*txMD+j0ZL z*!0yyeVTEP)tvx~P*@GgI^3lK4^p)=Z8t%$*C*~MM57v6cKH=MA+l67g{9feJgoG_0WB}QhqikyJTi>(TM6T z^%`zBYbWBVlM%Ph=@8m+6xNdYohPT-w=;MdJl|`}+4Q0}^V}RSv&`BzyCNSkJ15$t zYO40f?-`7+sLpwYH1^qct8xBIe?9b8+gKjA`J9lR(-`mk9S!+NWs3L$DOY6!=TTlY zlZ7r!>k}u*7^+J4b69%EL(ZZ-_-2Y+wt8HX2ydz{$CeM@ut|i<;zd5sl4^8S`WuOM zk2I{U66)ZC(y(mGP|4gI2Slc*MR!^GjF(sc=hFpk8XX-5V^N8P?C88%2G5d&KAT>w zE?QjNnnTiJh=MI7IT0%y9CwutpI?ogmVSqlC4I2>EPoi+Gy|VoPVKW=ZjEDqw(KdL z+1`>T&#+xsxrTKwt>Wl7#N}P>VkLb0>wtq>b@$I<`L*wq>)3<)ZDCi?=8ib(KV}@q zyQc}6EnK}|X*yGR3NJhU=BHnsGDATR|RkCPNmE2Zo zJc?%+tG(2yeo(^^-C^Z-MX+VMvGCggr{<2vs3ME=<;9aV>tL+e`=^|bq?h|rQ$ru) z@+b{`OcMP*&pYdd+@13>2!b=|E4((2wCSS9#g%|=b2!H#Q0Q64uk2mk{}O8~Ci56y zME_faspL>}Qm9N8=v%t#wvK$%zGD*qcTj6Q{NZjQJc8y@-B{X@c{;u^j!C zkGO9O3vYY|NDE)9#3iEP9W5Oeu81wC!?G7zO#O+q#(HQ0)Q$Bqgm_HC@}Q*5%^|Vf z?1L-b{E&0Df0ciQ(0E96QGk;g$5Ht|dj%ukb6RF#M%H^_NKKWn|NDBsPxtZRJyjzK zWm%;2F+^eH<&xp^dEKHNg=2hsnx2VU7n*xyT#gLqTjf2bd~~N{y3@o)rc`-{0Q!i%3QnVJue@Oq$^Fm#rcs zpBf>LRki!Q+w!>8m>;L&JumTUdBHO!q0}`$N1WNW^oNQwGN_l|3K8?5KR3%^C}w7n zuw^lGZDJ{lQdny3u`(qiuR`@06wW_ataEWdkZlXQVvxfB*ZJ>?rjOggPLGBKwS~oV zFrE7~{ka7k%VfMvOjcHy2;ZN`Q`BwVST7`Jkc+5tL1~l7PJJ`vDGYH^ ziCVIC7BY{*%zOnxqn4Rt8_w&)uZ2oF{WlTygDJSZv-du>pk@_hL5n%Zg5+668B&WiQQp zj8Y$F)Iy^15OO#&x7?-<7T?_vo_qjai)c&jB^;Z2*JuXvWr}H zzSpdlujg|t8a;u}ArOyIdCIl4)sEn#9je^Uz(V4<&>@t zDpw%Q3<#TgMqrYo_pX)CuVOp& zg8LMX7f%*>nDg#Y@fbCqh4(C`1sSGTE%5EBsPE7BUHYorA*QhQgMOWm=v0;KdvRi{ zuZe5fh!>92Z7U6*n?WO3EAZ5F|vgR$1gW6)Z*7 zBl#mfKJoxMTmU1Dx+J>FT2n>D@0YLem!1u5$}oA2?#541>9bT!J%QbtH=ZIiw#SM~ z&N}^?geUHbsWI=Qo=;kFIzL2g4pnJGR_;(L~a8$P-{%{sOFZ3vhQpWZjF?f&N%EB``Dn?qPqsO@KcBSCf~{K zj-Twrr>WY75|UcYux$pg>IoyRTq2bMd}{cX}M zH`NcSh0CXkId!IM5BBf#TPq~g$d+f-O3J+W%o%;v$=q?N{>Jk8gnmt@N~$+Y8_Ige ztKmjwSvQ>iwauL;H?C;Sp+7gqH-0%;#pNW4lbjDx4NDi-RzC=)rmncCdgc`7xwG-# z86VXS5yTc{zd2D`iISsIp)@(QmKN;d&#QqMeQO?_nIk=R<+g{ZlJC=C z1^FzkPj2VY?qi=GrT(DhaGE9vA0J&iXW?7S65L?m{t5;VG}R zBt_-Ps#Z+L0QCh>UosKL(E z_%ge?xEOjMv#AvqPT@nu3%3*%$`+qa+apXxjU^%<{vgWJJmC47aGy5Hu_=ziYVY3o z^KJgK)hCs6nid&)2qZ7&zy-8xVa0{vgoJnzB|&uR&D${qD`Ejc5EW~+94ucWsxL?8 z6B?Q{Arh_nsM50=-ig>eVU>2-ChvQcoRk$y-s{WBpWYHhra;3auYPUPM8tGg>A&1H z7}S|RY`R#pgZe%PR&t!!(b-uzW3`N1>h?EdAF z5{cTN)7;_Nj)`3SJka4fiS#N~xmTS`^l~U)mwN7VfLWHw zSjg%5Yg8&(unB?GJFs#Eo75j)UQ>Hgd9J=s)8tdxE^WJ{0$T@_l?3^Ti{9)Cn^pYS zSI&!dz20}L&3pN*EA0(aY^8^QAO0fep)l+HrV6?BV*))iJXN?l(#G2a*Bke)j&q|v z&3@)duWbB9R!=lG%hbgG3gW5Ygk3n;@rd(EW6T|o7YGs>5g~u-${p+wwZuc2120G0 z1RmszvT5D{c80;RW=S0MTXkw}&~|#%ij8j%*w`L{|NHa5YWde3{v8JYdWZkddc|~l z#*-Od?7igBgW6TFEdHqr*Y~s_&td}H;(`!v2TuYoZtB1OrZk#~!LLdSLx1uNl}R&l+~Y+{LX&rw==EaSDu!<{)-J~_ArHwE}@T20~#r<5c zr<(I`#g7VN{{DS}qZ)|jGzIIF;nZPQrMv4D2%hkntmeGL4m+ca*qsfYuq{cqka+-B zz0h>KQ5(j_B~4%e7mbiZ(=o6UQmx{58j$IIk{*8IM0HM>cly}-l--y+f5GZMQ`-t6kJBKH>$ZF8@CfCN^Uu)6=k31{SNvc;)e)pCfihR2p@cU!# zhW+61`ye|89@qt5%Xww1djyD=R`!U>#+e!W3@zTEaEo5iCd%f+<+U*RJ1P7_-{{h0 zK0Egeo0$vl3NZIsoi(<+lsVce?w9(!azE^o5@NRiq@AB)|8eQaQ9Y1|0U_cmgx3e) zOdwu5T;mEmX1jGh=aQ7>0V$;8K5@=KsX#^;6}pr|K)p@VtBVF63``0nz6w@+|;#KB-ytT09IkIWwqgElNN$*93#LwkWn z1{m)Ifqd4+GfrL@Y;M;-jrdob{};8BZ&K~D1GuhV2DJr7EO0CTn88oi_fMD8{N5kk zi)Rlwv4s=hWZiS}j4q$mS{pb7tcX(6vAG;V``fFeLCM5rP41 zR74(@`~B2ip56Aq-hk1WwH3p@nEApC3Y0$G*!LZnC3t6DoE;sY;(&cL2QOp$K$iw4 z1z4bHAHdo#(A{fbp%W0jORq=;t=nUfx9h}#G5XG6p&h#BkWjCHP>n`=6^}PEq#ZTf zne!!JKMc~#iO_PEfQz9_|Bni~gocutR1TB>Zbb0KyKq6lgO|mc!OXNcY<3M2DB0p~ zC21dGu=kSnJ;UIRt!$AWU=?|u#MxE z3Ai_Xoc?cRfi&F7tzgrX^|4lwnCtZ$WprOGh-`l=~MCPWmHQS9hW{4zM#Q!c+Y8hE=-9r6q$Qv`SP*_EMhv?rO_U<`-i9A=U_+<@+ znO1Q;N>WKUHh6mt=7#zoN(8&VB!B5>n^tbuU;~k(>jiYzpZ)I_MMQy%JcI9u9bI+? z+;jhji(VAX&Z$*Wfuuiv z?(*cVs3y^znoY7Q80#l8^5c_|+!~+09e#NY@Sgn&S{}-J;ta=%$nW!HTYasS@)=Ae zfE{fh5D_X~NO{K2AC~k|bNh(1oGQA=zPH+MJ?dWaVXK=wdJAar+fh4m_n^$;Ca>yJ zp9a3Le=QSnJjl6%ZFNtJM5s?LSVi!(7FFS6a5)JNR|bNs)~t;4Kq~HIiEz^hN$KcK zgoxOTZ1oIzoC-q@fcWwKB(iNifl+_19e&JbX(EAr579h$Kzl^9=dnZq}H zeQoqMDhVHBW8Jnq3(5vHnMnTRc-eu}m+$i;%TZnBjQV9`L!N6M>ZENXHLPu_qL*11 ze>g9aK+ENQCCzWSENxvRjdLokbO#H@QS)))7@K?j$`l=fcXuHrw$tHtjL&o~k#G&| z5>CB1W|HO9VBtCWMpj4ZY$v&9yS`&MDAe1J`SNa#RX@isQiq>$wshB*DPQ+6!-W7( z0H$obAhP1j7-2z3cCBrF{jN^P@q9N%6S$FL_3~e_Qy+1@AB26LNm|<28SuJ)$}@^k z_GiT79BN zh-)kU3o(;?GZob3ylLU+HZe@=6Bz;P!9J_ij*qvN7K}_{Y-W15u$AQb&YZ~d;nt@^ z9y;NVNYQS|w0zr^v5K{1%$rOU(xR3B5MQYTel0eR;@sP!uxqhqIyat}S#ehL5n2M} zM0{Otv{!aZ3Iww8(j@(q*vEGf6L6%hQc53OW^lU&_Rco?r=Ga4iF(0q!7$oh1DJ&kgcZh4bQT;uam`BN=&R-zBe z^>DXl1H;3~!ra5(_Z*MLa~4}U)^24w8?R1eY3a+|H_BA0oNapMEsYPv`64=ftH+ey zB~Z$}CphserLztiK57*jv(j;t4U5G??wYge*UQEDe4Lhv&nXMNE!0ghPbnLGCQHP& zdsRAm3VmRZ*QH!z(k5kW!(DBuS<1C~sAegxbSYg{2O-=^t{8ey0NV4j*kcf3sZ3rH znLQL?{P#$ay7A5S311?)<=N?6Za408Y35@_@SB8>MN3!0{(hO1@doDg^KvZL-9dKZ(?;#B#^Ss=?|zZ><< z4srYtdbwBJYl;xUaND)=c{)Kubn6`EmdW0avU%diz6YIwicGSwY3Bb!w)K`pcxJoB z-s84-{K#BK9Qq1P!p$mwO1vyZS2N!zqNjLrgP7VAl2Eqe9N8sbwz5o6`7_B|S$kK0 zqW@quMFbtvj<;Gp-%#d`;>Sef>!^DOCsG&{I%3Y8#i%8v4^Cw{R-p3VeX=W8U)qo% z>BE=gBM0rQIk$8a#BV5|#iN^c2sx2Ltf#LYjxct^E_$9iDie|Q*ctU=x(;|a@;Ovz#0-pZKQK9-NcXSI76D z)kKF5&#iueN3wQH&4eL_kk!6w=MCZndX zeFjMd5o1cz)o3Ha;|xQ{e=15j1t(+2r8lwEsEE@!IC#0SJm*~i`9|Kn4PeIQExxez zX;V>)Sx-^PBqc|d zi^cke_Azl$j9&FGW!_9#HXB4hQZP!H!nzi zzwdiVv0MzK6*yd$(kc4-?aF>iQF1S1J%uqFg|o+usWP|UrMRM^IM_KN`-`m*ORhhp zok@=5>Cd6JlA7etAw2~eq$jOjxu4a`v|6@Z6nnH<h*f}u< z-K<@`p{%@ngvnzqld13@=X|Do#BXE4rt+qwwXzRU$jpNZVdG2yM9 zf@hU^8E6@sF($jq04e$(J}YqiVpE8=!(zXK(v7YbrCv8VehfJz`TFHTRY~Y_>VLYp zz;QS{JjT);O~IAU+ZOFomy8S%oP=Hxdt2t^5I-)Lzh%7PJqwOm^;EkA z-l55XdE;K>+dzdKZ}6utN#|Oqd&J@>q$N?l8D?jN0&d$bUgLbE|7%o;bN*2fuDJ>d z__oQT3!zc%q$*i)J|7{On+ zGiEEBSJouTx0kgkX#trb%Oh#JyY?(-XL%{w0;<9Dmi&f~ZyE2k9#^=U0mpdvXI9OW zS*h)}R^i${;*M36j9+Z(SHizf#XYA?sv@j0Wj%IF&Z4u$uR(+g z+AAQgC$uQB(E1eJNEUP<{umc8vLO10xQuZiE3Xfbb9jcrhu*PR&Wy%th{{wsRXb_V z)_44vjI#NP8e7ihiSKFpN_ZPTUSPv_e&(X)!`?(QIA$sFo5Fg@vUGfmO?5bY1UzJ> zZ$aOo4(ET(gPLYq*n@6*yzjnmfemiz!f#(He)&3Agolgs08JPHNqjuPQb&HhbK3Gr zP4Vg)KG>+%MYploNVIgdHhHbZa87#2g@bYWculQ<|xLR?->iPV&|Bqo?(WVu;m$5kFR zEo_F^5}iKI{}7)me7;Ps;qflfcF7~j4)@GUDp8QJKS*ktLHAdWua(0!YvLmHsfKTD ztSyOnA$Y7yCLJtUDBCS6Hs4Nq! z=K~%7EXE^uh9=1crS6C2c#GQ&i`sM5%Pea8b#3PCTb;{f7aRSE+-d{4>CAH+Bl)?_ zA*MLwgR{B0%C$^^H9<9#q78$Z4~+d?YL{zW=5*18sFkd?*pqLrWNp)*C6YS{I7UO zWG0E(bxpsx%6f0cW2vsz70Hz!s!}d3B*~ql>VVXEUs3N_aBgpOM4MwSAU@|wV37;! z7HALu#@cOdeC-Xi+WO^~N=&@WtekG*{k)jIAJn~{mkXQ*KAFPEiU^1SaZCy|gk z+-Ok__p$Rv+O!Yrr|S6$F1mcqv0Hp8F+1}pUz{oxS2ddFvn6%Uz?15|ZLwqm$BV{) z6FWt|@KwG#eDTP=$$jn!Ym?O`O`@fd>6{E!z0Z~(Lt9G=1vOSVycfL|BMe823x)cZ z3otRYmpBS%+fTSl;G5YcXA=stzI~LN9g2?$W|7}^NTx74HF3HW3Z+g+IK=oATQ|-$ zpV$V9G6|B@zIYoXQwyR zTExoqzQY}t{9+iLE@NW_>LIxv$z1jiI*emn@;JVQwN2`FYZcd~lsm^?qxRHf>>A7_ zpa(xKzcGCTEY zZ#yV<412JBAkS2~A!})Y2XO~pahc?mArtf}IX`9%WzixxWsVzG*>`4Pqfrj2(kebD z?TpvA$B`~*M7khXs5Oo!IR;)Xljl7RM9T8hzmt;fo0qSWz8>46ELkLFDUyJfU0=^d z3_jHuwim`g8vp_^=5&VIrq0BbH(n3g+%#AfBu`^sE!@S(JbGVH?S*x&gztOnP@!zm zz*T(I`Mr4rS%rC-Y0vi9UO(OO`rNmttLuWwQs*nYR@r6UyAh^mC0V^V`-TlMKi(zI zUOejjElKI`jrO6-=ciX7D_B&(M^y^Qh1x4cYo^i;_+U6kL;S9ZEb zI|U(Q@1U*lR}TNs%&Cxw`MKBmq!^or?yjRpuMD{llFCSjI9+{+i)EW#{G(V2PyjU# z3h*RnCNAVhQhcBG@g&W=Uf|7EZdW!rV>(<$gsUJ*__H@WXKtlb*TUgL_KC?$NBf5o zUhdrn`>K56PzN%(oW%9rcK?~RQty>_{%LDQU&37%hw~CAyqE2O_Ef{kZPkLl8`iD} zLUmrf@|)dA)&Uj{^hzmFqP%K4S(iqv^;YZp5nc|q=i*n?`YK_%6t56;xphSWHc$%4Mg zZ`Wkr&D_Yko6yJKzvWfRo(QVRXKmv~m^d_RYMe2qkD5mOIz7hDhRhevqU&X5iA#S6FLY@zi+$J~JJ49B~O5?eLAeasTMGT{h!j&R<9o3%SNOYGr ziMsJ%-;G=HJ-Gjiz4wf2YU|pDIeP2`Jr+co3aChvA_xSq0U`oY1nDYZL`tL+TI`|- zNbf=ED1y>^M5P7@ML;?NAwYmYLI?zsd}{|i_c@;PjPd0=_FjAKxyqhv z&g;4+?$Otk5Y3dzf!oXhT+h<(Xc1{M$CvT*%$6js{0(pN_<1 zA6UIeMp_r)L&FRcZ&o??rS{4>E4a)%mSDRi~+Hpl;lg z=kLPicC9=U1JMk@EXfw^8}5~Y)vZhkBxFIq+fn&licx(rnNn{B8dgf61R#6;>>9`s z!JWJ<7X=@UCd8?h+dG;bt?TD2A0J6RTHfuJXCBrg&Y=4mOm_%6k?X;Jn5)OG?GU^yz3Ph^J=Y+fYjiOaq&W}{f9d-7% zBsoVZ>C53v45ap(b`?h_2#!qAP$fs?a}y(7N^SnA(4~1)C$>fr&RA*Cg3~u$L%+d>C>C?%s=LRfy1(C&8eK5P^b4Q1-=}V@8b2lI2MgLvhASZso zO2j8+RYXyswnDpL(p2%OKI~K&rADm$mVMoQ-`GBPrVAEc>24Z& z6`s)Mjxa_)?wWU8h+ZdK!_v6VDcNw|FMBtxZgI*4emREGkFpd*2gZOs0Cuc zz^qQeCJ0V6owlh>o`VbM}hiB=;#)kO_cIFnPcb7*`vd%m#duOpbA-VpNpdS%ITh?L9@%-GL-veux_C-cX?%b@L?ov}hfH_*KV_kO}qn8B)<^b#At6Qn& zQ);ei9q@6B_#OFHi&_o?($`6jznHxD%It+d+HnaE_3rsQu71wQuszV2zj%Ol@xusn z^!zB+@QF+W{3FK|=+pCK=|DlQlisEirTJvdj@<&^aZmFFBj7Vqv!UnkUV3jFRmvT& zokMQi&H++eLY!?gapdg}YeC>{i!0kGP2xvgnb zT!9NM|F*Q+aAU_WJv|7bB5t7&JInFJ95)i2!!ic`a(D8O_ZzFhE9ltp$|xM1w+iGV z*PlVEgR_!bc{=R#D<~K|e-7EjKgxf&24DjIW(BBi2&D*KVz++9e{cP-nYRDGJteMu zW#hnp1TRy)Uc>C6$mPgm^7aGwjzqx~w;ZZzf{3|7llatY%Rn)y@?F2BA{q)UR<(e5 zXX>?IZ#gc3xv(X$ocFXN`!XoV`RkH<0(&OfFe0%@CmupOEJM+LuvATaKpG0V6xxOk z>yBK?E5Y9HNFNo!oB03Rs;&<&2@{)j87`Rgy0jLPhn93<9mw&44S>Bbk%e-E{@a!R z4XZ3Gg(^-8J=!anW)&pe?Fhx`M}$eE{DN{Il>5tg<4G6(IQN|Ef_1-OYDt5rx&wrA zLjGYKR%5XflKM}LM++wWM2lMkAH#lr?Ba34;!+QQaq0Kc8l|MRzJCm;?b z)Jc%?hESE~E@J*LhDfB~H;zQG?AeD8|1=9Il>_}&0I+H7VDIG z+A=ZfZK1n@w}3Mvb=iB+gw>h5KAKS>uJksLeA27ZpuRd?B?qYxu#|XJ3Kdw{dl@@4 zLg(ruj|h1Ul;^p&t@^vBEE58;E`}JL454!EJc2|sBi?4g`(l{WPxE|SJM^a2$L}-A zyse-g)>A0lqih~s`FUTDWqjCtUa7BxsfQ)sg`pyYBaQhf3=!9!$>?jy<2Xx@p*9FA9mx)nyi=vw8BsmZEmg{!Saa^9avXEvR6#jv>*DGwRn?x_$8W4cT&L4Hyypj=o0D!@^r~z+ic6Ac{PY5qC}QGg>e_wmifJh-P=?%)6o=@$ z2vi6XLmS)kV6Of{MUfWkT>~^-QR`M#b)DPt%kAYp?9&qUB_yVUr5*J4aBY zI?;U~4IlDA)wtHi#oH-xyxKmT%H>7CHfSB zJeq>ciqJ^)b=L9VFV8qphUJkd-my=)dd2Vkaju2>63(}IcT0sLJB2|+<7Fas3qiK- z&P-5n;vqR9y70?hR;)jS?Wr%*;+wGBXrmL*@Tl(sSRSP=PJ79&!Ex&@C z8KH`fw#cu7A456jbo6JCdn)mML| z6QjnfDFiyp`?epSM|s7YuN4LnJ_?R90qb^v`FsFKra&+%uKC6wArSPu`zY9m{!Nl^ z^-<#o=IiBxKOiH5Lyi4{pDPAhH*Tdhth6FPCPs&dRX=Ub<$T(Bvb z0ur6BD8OKm)~a`w7{V5vJ7#GCJeQtTK(Mjo&abn@X@-|3i?lCb@ac% z`VYEmJsA##-w&(S{(@&G8|Jw|)S}X#LY#vWIURB`cZ z5L_0~2HApQ;#{#8$mSfCY|)&-(eph4E=H`4GBuFy+htD5@i}N+dZHX%uSNdp> zz+vVqU^466OW$B5arJ20;i+d@+rW%#VqIT>XvzKpaVswGoz*W9#w%8WONacU;E7cy zU*&xpX!De^Ixx%?rd{04N$xh_6}`oW+G*b1;D>ZUT)L#4an+j!Xc;vi{u`fmCaa5n z8tpd~W!9Y}w-qCc@3E(NW+m|0i>wb3FiynR0sKJ~{|Nf&S1ixvg;Q@elA-U$af!7r zq}pJ1{e%5Bg2J&DW?>eD&tHvgd>k*;7B)fYiS(P|c6K-Z&~vEt8jd=)jpkH8h>deK zVe}oVOShrkFJ;wX^UB=1!~+)*KE*+$LphE4TTH&iMRx{#t>A2=b*C-NCrrcSh~(>f z5{6Wnq1qRk}oI{o+!DlrvjaofaS%AT2S zY%e;yX(7HYCqx%}fyD&7-)#yk)ok#3GD??yMtSvZZMTnLb9)J6=cq3zhbi>KQ;=-Y zpCn(?3;WFw^7wIEl0V2zyOPMG(V{Ml#ux+HWg5oY%h+^9o8YMoD0Cb7G_b$sDkfrI=PNTX@@KIwcr}iowG4MkB9a1s6vp8qSB_2;$pgB{%m4-3Ul1Pf{0OpvHmK9{#+ z)KYY9(t)`%;h~Luau&d0Q!F1odReVrtlT^{CIq0d0e^?~fk&5F82m*4O%&0fZ-`Rp z^hGp3)aJHPOW9xAv_2O0a(X0$Qbwr{9-F+;4@Brr&Z_-69#G`Qk1`wB1U3b$Y2fZz%kxZ*zhim#_}!DGX};0wVOcU*p3;9(;WOPtYs4b?Y) z?Z?Ibv2_#2JdSK>keI1OZY`+(M^7)7H*9E?WP@Q9g8=a6VfEke^-vaDCw$v0f&T#) zdEySzh~AlL@GA5seyB<3^s;fMbL^5aD=j>e7&;={03N@O-NAoCB-O+Ljt&a%Zw&e$ zP?6yH`ce|2YFR!!=qD49jMzmt?S$y5Esil_>nDoq6YELQw!oJzM-?xV?^dBboyzI% zUr0Ay4{1E5xG=UMdUB&u??g#e<@1$Ux}rOeHu-5cw9qioDU2*SOT)tR)jWUx_>=%i z!>aC!g+}FI1@DE`DvSQUjZU6xOow=l@5Bqro9L?&4V|I@v@@LpUqewI3GsKTa>69l z-Dg_pd`E_8VTT0m{&3JJ%h|>n&!!AvP_vE^j1o%Nv_G== zI1-+8NaEyd3hjD;J6_Rqcxf&S=FscB#op^<)RpP%R3fM;GI z7b}&ihjXpOv5%!Fp2vTF-EpI~CKifB2i-I*mYmI084Eh5Ac@QKtr{J9;bQ@w#YcN? z@oFu2_&%0J7n|Z)&r!Z$h)%my0$Ztsv2ONef975u)BR5LUhWX)7T}J2`*dD|H_@~r zvAQR)?7Xy~59We-9g=x8^-bFK=ZR5KiHQN^>{B%S_0bol12NeujBF}Rb@1g|(=$dA z4T1>5-B-587}u>hAM=ftX!p`RS%Z};C?%y8Rt<|OMtQtvN#7xfct?M{CJ7|97wfQuQxmqO4b@ML_Bz+J>QR!lD|g$=qeoO3MuS8sZpXvU?* zBt|@J*2@=@SwkDUzPK zJO-^xA;=*=F};jkiWxC+iD`+gJN5c?E-#VOlPXv2zf@M>73OqNjDcGnc@L3HwN3@) z232~KRqdi@e4gJ-c7*%#IKl{WPQE9ufHa_|Aai+#MDC=5zt7vz8AZlS!opmIlIDA+ zj(`8lPEqSwS1Avp9F-Dr+&PrMG0iRoJLG=nu^!YaYqfG!UVx#se5QLeiKP|0i~&E4 zvPdXb)UqnelKIZk5{Eim$dcS(D!)+=5EP<98jcOAvj!WAqix#z5r$_+UnK5Rb}`f~ zM8AByQr&Gpq29v9O0}8i!ej)MB%6!om_^e$+9evrv5sCISaV4?AretFSKhJ@xVIJ3 z$I89?VpcBZNd)!Pn)7>y+|^1xv#xu_gHh(Uvmc`yk4jy(2SJ8dT6P-1Pp|U&!v=A$ zk4!_T+Yk#&uchqofT@X89`|#ar_qgf`oYl09*v-1S;hqKE1kD$pMBV&h>Wybv z`$ILE?{eX`%I)U@Gp%MDKc9DvE!DQQR$JUDkFOWWoW%~t?YG(eIC8)JE%@Psfc_KqUE`mfEj&6Tg|E0Cdp>dDP~rd!z6vofJy!=owkUO zKarp0llx8xrKHV?^J%BDzDtVc4JVk&3%}*8=tfYpn=HEsa_=iri3xeI6{{px2$Ea{Yt)Jl^^@opa& zA1j(R@A{B3A95hh4Ij($y^MXMy7Mu==TH)!8R8Hz{#B@V&?6qHTFipQ}-+G(?FQL8R{B9Zsi|XyiIsfZv9F_a7iQ3OQYIi z>C-^NZOvh+@{IT=TU800PkIi}_0e_}n5Qh5d`^eg&Yf}#RpV0{1mS1p+w)W0Nk+pi zx%Jz{h~G&IZml9cJEx~7x%R+HQ#4#;nR4IVT|yROHt+K;TMc_*W$xl}Gn_GV+1qO{ zJO|@i*-H4-sY~4|CONN|A%lsQOQwy>u@;9| zhTr%a&QAFtJ#JbayM=uBSl_^T6|67-N0tQLsiA^l4y0)65VO|59-kJZ!LI%P|mSRCVXVA!~jXhA(8KOqYQJ& z+zK2Kh5-~lBBQI~>5IhBp19z*_xo-;rzdH0^IKomkAx2{xiIYJ6lrOTeR|xO5dr0H z7NML9t^I|1Cr?xcml`i^EfMpr9%b=_g}rd#;~@}9am9uKs-k0kezCK_b3Oy~venjB zw+njB%8i*S%N`x(?J>_*>c$nh2m_p`owZ6gu^7n=v2A?wdJMOk(jhuMrq1w@?1?= z63pORhGDFkc2$yQ_fTI?a0%MSFbPv3(WPLETpVSh9R1NzEDu)FSRHFD+V(~e6k>MI zAOW0Tv6Fa&>7LS=C#<$=49qt|Z^?Vmqs{zPjN=)s8>Z%_t@;%DRC**=E)jqa1i z$SxvX7`d}-X+`!Af7oln_c|d`IMZ>zE!?#!8~)0iQ|KykoG;RX{_TaDq&>MTtK?29 z3FqmhTxNkTO=MPji{lL2YJUhW6t(?kWfe~E-5zy|e(RO$`j4*`@?k6AXVUxKbUIu4 zexp&0_s?e6r=)Y@fEM5?`Q3?fRb(_0ufBBr{dl6TCz9!>o>qWQB-?crk0td^@ZK2b zcOIX%L8d)3cweYgm@z5kgSV`_>%8p%%1<{JMj?qdhr)wwFIdg0VEoT^@sdhuAi9bu z=2lcZd}4qxvp|?lqNNfAP|7r!xwvR9OWgG-X!iT^^LfhoD@u5b<^Tr2v1=htFHP|tiK?Q661TgCA= zl?N{T-j;qN8so0>xZ3YX-$k8f#-73zFPS7~a zJ80x4RTrrlINJTh@sS)ZnT;Be@bAQebga8w&&DGXAteaUgv~Dyl{r>ngpU}c7V$EzXWuxy~vGu&x1DN_O; zNl~0_*u~)EE;<;Bszw@Bwro7?=%miu+7)Sz{3Z?W6KIT%&a(93K3%HwCKZ<0iSKpO zd;MqOg$fxoWX8@ZQZhFGV<@OxC8+nQd)xFh$fJe%_NC7r*obk=vE{amlO*}}T2l>Z zpR?i-T&Ui03N9lR#BM8#Emmjr*$dn(I)Hd8si>z$@t7EHBlp&V+YCwEsvsN}(|wyl zkdsr}=HQA6nvuP6cDH9`j8sY1X_wmKl649(&Q>(0`^~%n~Z;8=?;;)mP;I zq~~e$*lPnAlEwu>km#Z;Yb(v8@@`^V2Gr|*SMHRSZ2?aD23MCux_9WSa)Whrrtecp z-48H^&kkuM-_LzfXx010O6(Re|0b-E=>kt+NAYK#eZSy&vB2S?A(~+s%t<}poncGM z(y34Jbo-PRf-!Jo*iB$JqFWlgdd&Hk9K;Akc)QZO3a5KKJ?U=<%`T0%jtSmv)Y3Bb z_}c#|x4=VFMJhyQ$r1gX?+9%H(`x;E=?op50YD0X^}WeEVyNRIh$<@hmrl$USU62@ zE|d_YlNSX_RFBF76l3Cw=N1rNZEyr%H7{XiA9b$cm<3D2b3x|Wxo!$3OXhvW7h=M7 zB|2M@VrC(?iL5?mbvd5JYG$2nK`-O*s!9|berSTU+LRP&#UgZ)4uzXi%=M?R2spKXec&eLDpaVl;vdoLMSx+*y|8y=YU&1094i*6Tv|UiG zx58FFFD11``%U;Mm&)4?`aFQb$6)N1iG0jY_vE$i&s4c5Ci%Sy!5~*J8lWrXLdsp7 zvhm8~r4KZfJ;rE|3TS1JnQsGrAbQzn(dzw>@Xr#p0q8kx%(6hr`6G3VipR|i`rHEF zx9VWq2(v93wsuuacj{Z?f|m!vI|Wf1)k=R%tX53(J2mP}L|kUYR~!``_mI+{6-1~| zAEXH7n~9G2+OoO|C?+SXJB$;&SeFKuc=rbt%iNYgs2uqyPLK28KLSSAU^8{GStGJ= zdKbf1ZGS>yv0dr%N0=(-e*C%4Yzlrn5yY+&lbU9l$aT5mmuBXo40MWMo8pQA>AbFt zvTKQlH>ZBFHzLBF;g%uw-gQsui%cwoPz*cVO{1QFZ9F#KZbFFY*UYz`RJGD{DxUH^ zYB@}Oxq#@#QqXr9#BQE=mt2~cW{%N7;)i;?yD4FNvEV@HSKA}KXBuUidGg=UbAt+n zDaCdU4@b*pLbS0u1|OmdUImm|e(`v{g-fGu+&g^So8D{L`9Z_VphfQFiTst>(3FPm z8V4WFH?xbbwr$84<(^H%Au%7L-0s&f3TyX`@93Ud%d(6KT7mzTr1j10U^#0iQ0cy5 z-@|AR*>p>Zrt&u54mL-UEP~l*drpojc$)d0l+5>@O69f}Q0%k$qL>upXlx}&B`#Ta zJrcVRwCCt4g4V`!STfd>l3?*}^0WeGv2;~;n^5eWn$qLTB$@*=u})!wH(e5 zOAgC+ebToZK;PDj;$%sr#%liwl5t`bafN61s9yVnBjetBeUCM5oEKcwa;)a-Hh3l) zagrK|boa2FKp>pk1DaAO&ZZUH6a1AT;4NHO^F?$#7E2Y31P26=7TALj%QRe-EMDXP zI+RHUd7>OaR<*<1$GSG0uB!i~f4p8i{%9qx+pR8psU$@Frim(|(PJ$EU|RRuUv)?m z{WK@48?%O%-N(#V2BE(LYB%zHsobe#(E?T~9SUPU=VAkY zH;Y&TmAT(u!5;1y2^I?U@uO=bReDn!%YWzauKO1RVD+sT@D%rruZAF);op#n901$( zqWjprjxYbbPv_&U3YFgyj)J%)^uS&SWCm_tzww^SI=NBmmSNd{!4mFy&z-Bwk?}9R zO}N+W<+tv%HVAV5iZ1-!p_aJkquosq%>{VLY-JGb1+OY|o#Xhi>oS%}96Edc34K)f zEq#rlddNQcBG)z?U(-z2p1vwKgajCdqD zAOa#qV&+^Lb7Z7VL^N&f^gPyg^C)11aQfnizpI`|KKyp@Z-e?DGmQ%ZaeDoOu`lB# zIpa{C6~{Y60e-=2h|wcbu5RONeLi@7w^DDCbhIuArq1Gk@Vm>?lxFhY|FOAEJc80L zPU=OR-H9n*4w^)48z;%7OMYLQ(0;@MhT0fZ%BibUrO#K~O`se6N zbF#^*7rp^N$RE^|Gk-+F{jTwUQ2g7X09}FR`WB9ajUGoRyJ_p08a9g^ea#r3e4%_n z;jFF-&IMgVpsn!BbM9H8?asbt34f`b__C7&1iR}K#-L+8|0&d4y{v2r&6&Fv9`-WQ zfCnW5G#KW(%0UD-oAB$40kJ|>(k`?08~~sXrk8&BLr4Unquu@jNb}ivIGXS?cuRBu zk)i`j4(R+VqL)KlIOYlm$49Wx)VBW}qWc@i@W0G`fZb#Zviyp{=in&$mq`x_IGO*; z(gLYOiGMC&D7*J>aN>;|_aJSAU-y~y93TG;S^R%?w_C}Vhh%@_IN|M-N=M@yRdt1;3p<`D+)i zXIA>qT0k+WkB5F~BX$EMa0R~yib?%7Gsn@2Q0$trF*ug^=;h5+P*AEdUk+%!h*$#3 z(7u~r7B?B6yC~PTE=aJINfjQ07hJc4*vW>7|3L<;Rery zLSz_k5dCN4)KV!^ouVWb2glhLA@#sHIh>ktArh*A1mKeFw9?8^j#rVvA&NTdOkP1K z!U!O&24Uu2CRABXt(;JL%F%kcPK{4sdDBLl#}MYxp!di9EvtN=T}qo;4s$%3D9IcZ zWPQAsz4q*kwI*88ER`(M+iBi)XCAUbwjD%e|E|Ns?!rV-ch*|}E>JwTBL*u>P*%2t zT^#0${PdMo=II92lfwlNAI|%^YJ=_rsJBMU;O|iR+S8=B^dJ|g%~1iaRcF0AP3HaI zK-aMbY_!v9jS~>)Az&z;*J0{=HpOMveEFin%aqT^QfAFSz!3HDU>R=K^BS|8(lX>i zB?b)Dq<55c+jur8H_<+E6$T6))BeIpH5rQP+rCsPaChN@kocOdcU1G82SRv1o*V(0 zjLf;cejVNfJ+ki#{Td{3b$Uc`5}Uun

)1np0Zy8EpPeA~Skl=}8y$qoOI&F8-Qm zHH%|rWr7O3t)nMvZ3TCh+RtH~KG;KJEjE;4;vOLRCj(1jKrr7efdE8w}+w{FK&zMa_;#+ zoMnqB*nO{tx8OF#)6KosbQF*$*u{p{;lf>?0~rO`cO<_aGZ~_hMZ~dc+jxTWFPdj^ zsJis9b~9%Cb6Bobl;6UK)U`=>{earcfhRx_x8?A?8+(~`8`4Itfpo6GfxB_XapZ{f zbyHQm4hd2r<;$QR5^@os?kE(XJ+R=

kaWq3*2(KFoyGp!d}9{A)}2Ij5@ayl2xD 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 0) { + int result = 0; + if (!validateVersion) { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); // 更新数据 + } else { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, + " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { + String.valueOf(noteId), String.valueOf(version) + }); // 带版本验证的更新 + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); // 记录警告 + } + } + } + + mDiffDataValues.clear(); // 清空差异数据 + mIsCreate = false; // 标记为非创建状态 + } + + // 获取数据ID + public long getId() { + return mDataId; // 返回数据ID + } + } + \ No newline at end of file diff --git a/gtask/data/SqlNote.java b/gtask/data/SqlNote.java new file mode 100644 index 0000000..30ba9f9 --- /dev/null +++ b/gtask/data/SqlNote.java @@ -0,0 +1,493 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * 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 net.micode.notes.gtask.data; + + import android.appwidget.AppWidgetManager; + import android.content.ContentResolver; + import android.content.ContentValues; + import android.content.Context; + import android.database.Cursor; + import android.net.Uri; + import android.util.Log; + + import net.micode.notes.data.Notes; + import net.micode.notes.data.Notes.DataColumns; + import net.micode.notes.data.Notes.NoteColumns; + import net.micode.notes.gtask.exception.ActionFailureException; + import net.micode.notes.tool.GTaskStringUtils; + import net.micode.notes.tool.ResourceParser; + + import org.json.JSONArray; + import org.json.JSONException; + import org.json.JSONObject; + + import java.util.ArrayList; + + public class SqlNote { + private static final String TAG = SqlNote.class.getSimpleName(); // 用于日志记录的标签 + + private static final int INVALID_ID = -99999; // 无效ID常量 + + // 数据库列的投影 + public static final String[] PROJECTION_NOTE = new String[] { + NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, + NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, + NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, + NoteColumns.VERSION + }; + + // 数据库列索引 + public static final int ID_COLUMN = 0; + public static final int ALERTED_DATE_COLUMN = 1; + public static final int BG_COLOR_ID_COLUMN = 2; + public static final int CREATED_DATE_COLUMN = 3; + public static final int HAS_ATTACHMENT_COLUMN = 4; + public static final int MODIFIED_DATE_COLUMN = 5; + public static final int NOTES_COUNT_COLUMN = 6; + public static final int PARENT_ID_COLUMN = 7; + public static final int SNIPPET_COLUMN = 8; + public static final int TYPE_COLUMN = 9; + public static final int WIDGET_ID_COLUMN = 10; + public static final int WIDGET_TYPE_COLUMN = 11; + public static final int SYNC_ID_COLUMN = 12; + public static final int LOCAL_MODIFIED_COLUMN = 13; + public static final int ORIGIN_PARENT_ID_COLUMN = 14; + public static final int GTASK_ID_COLUMN = 15; + public static final int VERSION_COLUMN = 16; + + private Context mContext; // 上下文对象 + private ContentResolver mContentResolver; // 内容解析器,用于与内容提供者交互 + private boolean mIsCreate; // 标识是否为新创建的数据 + private long mId; // 数据ID + private long mAlertDate; // 提醒日期 + private int mBgColorId; // 背景颜色ID + private long mCreatedDate; // 创建日期 + private int mHasAttachment; // 是否有附件 + private long mModifiedDate; // 修改日期 + private long mParentId; // 父ID + private String mSnippet; // 摘要 + private int mType; // 类型 + private int mWidgetId; // 小部件ID + private int mWidgetType; // 小部件类型 + private long mOriginParent; // 原始父ID + private long mVersion; // 版本 + private ContentValues mDiffNoteValues; // 存储数据变化的内容值 + private ArrayList mDataList; // 存储与此笔记相关的数据列表 + + // 构造函数,初始化新数据 + public SqlNote(Context context) { + mContext = context; // 保存上下文 + mContentResolver = context.getContentResolver(); // 获取内容解析器 + mIsCreate = true; // 标记为新创建 + mId = INVALID_ID; // 初始化ID为无效值 + mAlertDate = 0; // 初始化提醒日期为0 + mBgColorId = ResourceParser.getDefaultBgId(context); // 获取默认背景颜色ID + mCreatedDate = System.currentTimeMillis(); // 获取当前时间作为创建日期 + mHasAttachment = 0; // 初始化附件标志为0 + mModifiedDate = System.currentTimeMillis(); // 获取当前时间作为修改日期 + mParentId = 0; // 初始化父ID为0 + mSnippet = ""; // 初始化摘要为空 + mType = Notes.TYPE_NOTE; // 默认类型为笔记 + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; // 初始化小部件ID为无效值 + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; // 初始化小部件类型为无效值 + mOriginParent = 0; // 初始化原始父ID为0 + mVersion = 0; // 初始化版本为0 + mDiffNoteValues = new ContentValues(); // 初始化内容值对象 + mDataList = new ArrayList(); // 初始化数据列表 + } + + // 构造函数,初始化已有数据 + public SqlNote(Context context, Cursor c) { + mContext = context; // 保存上下文 + mContentResolver = context.getContentResolver(); // 获取内容解析器 + mIsCreate = false; // 标记为已有数据 + loadFromCursor(c); // 从Cursor加载数据 + mDataList = new ArrayList(); // 初始化数据列表 + if (mType == Notes.TYPE_NOTE) // 如果类型是笔记,加载数据内容 + loadDataContent(); + mDiffNoteValues = new ContentValues(); // 初始化内容值对象 + } + + // 构造函数,通过ID加载数据 + public SqlNote(Context context, long id) { + mContext = context; // 保存上下文 + mContentResolver = context.getContentResolver(); // 获取内容解析器 + mIsCreate = false; // 标记为已有数据 + loadFromCursor(id); // 从ID加载数据 + mDataList = new ArrayList(); // 初始化数据列表 + if (mType == Notes.TYPE_NOTE) // 如果类型是笔记,加载数据内容 + loadDataContent(); + mDiffNoteValues = new ContentValues(); // 初始化内容值对象 + } + + // 从Cursor加载数据 + private void loadFromCursor(long id) { + Cursor c = null; // 声明Cursor + try { + // 查询数据库获取笔记数据 + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(id) // 使用ID作为查询条件 + }, null); + if (c != null) { + c.moveToNext(); // 移动到结果的第一行 + loadFromCursor(c); // 加载数据 + } else { + Log.w(TAG, "loadFromCursor: cursor = null"); // 记录警告 + } + } finally { + if (c != null) + c.close(); // 确保Cursor被关闭 + } + } + + // 从Cursor加载数据 + private void loadFromCursor(Cursor c) { + mId = c.getLong(ID_COLUMN); // 获取数据ID + mAlertDate = c.getLong(ALERTED_DATE_COLUMN); // 获取提醒日期 + mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); // 获取背景颜色ID + mCreatedDate = c.getLong(CREATED_DATE_COLUMN); // 获取创建日期 + mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); // 获取附件标志 + mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); // 获取修改日期 + mParentId = c.getLong(PARENT_ID_COLUMN); // 获取父ID + mSnippet = c.getString(SNIPPET_COLUMN); // 获取摘要 + mType = c.getInt(TYPE_COLUMN); // 获取类型 + mWidgetId = c.getInt(WIDGET_ID_COLUMN); // 获取小部件ID + mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); // 获取小部件类型 + mVersion = c.getLong(VERSION_COLUMN); // 获取版本 + } + + // 加载数据内容 + private void loadDataContent() { + Cursor c = null; // 声明Cursor + mDataList.clear(); // 清空数据列表 + try { + // 查询数据库获取与笔记相关的数据 + c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, + "(note_id=?)", new String[] { + String.valueOf(mId) // 使用笔记ID作为查询条件 + }, null); + if (c != null) { + if (c.getCount() == 0) { // 如果没有数据 + Log.w(TAG, "it seems that the note has not data"); // 记录警告 + return; + } + while (c.moveToNext()) { // 遍历结果集 + SqlData data = new SqlData(mContext, c); // 创建SqlData对象 + mDataList.add(data); // 添加到数据列表 + } + } else { + Log.w(TAG, "loadDataContent: cursor = null"); // 记录警告 + } + } finally { + if (c != null) + c.close(); // 确保Cursor被关闭 + } + } + + // 设置内容,从JSON对象中提取数据 + public boolean setContent(JSONObject js) { + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); // 获取笔记对象 + if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { // 如果是系统文件夹 + Log.w(TAG, "cannot set system folder"); // 记录警告 + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { // 如果是文件夹 + // 仅更新摘要和类型 + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); // 更新摘要 + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; // 获取类型 + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); // 更新类型 + } + mType = type; + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { // 如果是笔记 + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); // 获取数据数组 + long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; // 获取ID + if (mIsCreate || mId != id) { + mDiffNoteValues.put(NoteColumns.ID, id); // 更新ID + } + mId = id; + + long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note + .getLong(NoteColumns.ALERTED_DATE) : 0; // 获取提醒日期 + if (mIsCreate || mAlertDate != alertDate) { + mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); // 更新提醒日期 + } + mAlertDate = alertDate; + + int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note + .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); // 获取背景颜色ID + if (mIsCreate || mBgColorId != bgColorId) { + mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); // 更新背景颜色ID + } + mBgColorId = bgColorId; + + long createDate = note.has(NoteColumns.CREATED_DATE) ? note + .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); // 获取创建日期 + if (mIsCreate || mCreatedDate != createDate) { + mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); // 更新创建日期 + } + mCreatedDate = createDate; + + int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note + .getInt(NoteColumns.HAS_ATTACHMENT) : 0; // 获取附件标志 + if (mIsCreate || mHasAttachment != hasAttachment) { + mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); // 更新附件标志 + } + mHasAttachment = hasAttachment; + + long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note + .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); // 获取修改日期 + if (mIsCreate || mModifiedDate != modifiedDate) { + mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); // 更新修改日期 + } + mModifiedDate = modifiedDate; + + long parentId = note.has(NoteColumns.PARENT_ID) ? note + .getLong(NoteColumns.PARENT_ID) : 0; // 获取父ID + if (mIsCreate || mParentId != parentId) { + mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); // 更新父ID + } + mParentId = parentId; + + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; // 获取摘要 + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); // 更新摘要 + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; // 获取类型 + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); // 更新类型 + } + mType = type; + + int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) + : AppWidgetManager.INVALID_APPWIDGET_ID; // 获取小部件ID + if (mIsCreate || mWidgetId != widgetId) { + mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); // 更新小部件ID + } + mWidgetId = widgetId; + + int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note + .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; // 获取小部件类型 + if (mIsCreate || mWidgetType != widgetType) { + mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); // 更新小部件类型 + } + mWidgetType = widgetType; + + long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note + .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; // 获取原始父ID + if (mIsCreate || mOriginParent != originParent) { + mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); // 更新原始父ID + } + mOriginParent = originParent; + + // 加载数据内容 + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); // 获取数据对象 + SqlData sqlData = null; // 声明SqlData对象 + if (data.has(DataColumns.ID)) { // 如果数据对象有ID + long dataId = data.getLong(DataColumns.ID); // 获取数据ID + for (SqlData temp : mDataList) { // 遍历数据列表 + if (dataId == temp.getId()) { // 如果找到匹配的ID + sqlData = temp; // 赋值 + } + } + } + + if (sqlData == null) { // 如果没有找到匹配的SqlData + sqlData = new SqlData(mContext); // 创建新的SqlData对象 + mDataList.add(sqlData); // 添加到数据列表 + } + + sqlData.setContent(data); // 设置内容 + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + return false; // 返回失败 + } + return true; // 返回成功 + } + + // 获取内容,返回JSON对象 + public JSONObject getContent() { + try { + JSONObject js = new JSONObject(); // 创建JSON对象 + + if (mIsCreate) { // 如果是新创建的 + Log.e(TAG, "it seems that we haven't created this in database yet"); // 记录错误 + return null; // 返回null + } + + JSONObject note = new JSONObject(); // 创建笔记对象 + if (mType == Notes.TYPE_NOTE) { // 如果类型是笔记 + note.put(NoteColumns.ID, mId); // 添加ID + note.put(NoteColumns.ALERTED_DATE, mAlertDate); // 添加提醒日期 + note.put(NoteColumns.BG_COLOR_ID, mBgColorId); // 添加背景颜色ID + note.put(NoteColumns.CREATED_DATE, mCreatedDate); // 添加创建日期 + note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); // 添加附件标志 + note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); // 添加修改日期 + note.put(NoteColumns.PARENT_ID, mParentId); // 添加父ID + note.put(NoteColumns.SNIPPET, mSnippet); // 添加摘要 + note.put(NoteColumns.TYPE, mType); // 添加类型 + note.put(NoteColumns.WIDGET_ID, mWidgetId); // 添加小部件ID + note.put(NoteColumns.WIDGET_TYPE, mWidgetType); // 添加小部件类型 + note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); // 添加原始父ID + js.put(GTaskStringUtils.META_HEAD_NOTE, note); // 将笔记对象添加到JSON对象 + + JSONArray dataArray = new JSONArray(); // 创建数据数组 + for (SqlData sqlData : mDataList) { // 遍历数据列表 + JSONObject data = sqlData.getContent(); // 获取内容 + if (data != null) { + dataArray.put(data); // 添加到数据数组 + } + } + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); // 将数据数组添加到JSON对象 + } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { // 如果是文件夹或系统 + note.put(NoteColumns.ID, mId); // 添加ID + note.put(NoteColumns.TYPE, mType); // 添加类型 + note.put(NoteColumns.SNIPPET, mSnippet); // 添加摘要 + js.put(GTaskStringUtils.META_HEAD_NOTE, note); // 将笔记对象添加到JSON对象 + } + + return js; // 返回JSON对象 + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + } + return null; // 返回null + } + + // 设置父ID + public void setParentId(long id) { + mParentId = id; // 更新父ID + mDiffNoteValues.put(NoteColumns.PARENT_ID, id); // 更新差异数据 + } + + // 设置GTask ID + public void setGtaskId(String gid) { + mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); // 更新GTask ID + } + + // 设置同步ID + public void setSyncId(long syncId) { + mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); // 更新同步ID + } + + // 重置本地修改标志 + public void resetLocalModified() { + mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); // 重置本地修改标志 + } + + // 获取数据ID + public long getId() { + return mId; // 返回数据ID + } + + // 获取父ID + public long getParentId() { + return mParentId; // 返回父ID + } + + // 获取摘要 + public String getSnippet() { + return mSnippet; // 返回摘要 + } + + // 检查是否为笔记类型 + public boolean isNoteType() { + return mType == Notes.TYPE_NOTE; // 返回类型是否为笔记 + } + + // 提交数据到数据库 + public void commit(boolean validateVersion) { + if (mIsCreate) { // 如果是新创建的 + if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { + mDiffNoteValues.remove(NoteColumns.ID); // 移除无效ID + } + + Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); // 插入数据 + try { + mId = Long.valueOf(uri.getPathSegments().get(1)); // 获取新插入数据的ID + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); // 记录错误 + throw new ActionFailureException("create note failed"); // 抛出异常 + } + if (mId == 0) { // 如果ID为0 + throw new IllegalStateException("Create thread id failed"); // 抛出异常 + } + + if (mType == Notes.TYPE_NOTE) { // 如果类型是笔记 + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, false, -1); // 提交数据 + } + } + } else { // 如果是已有数据 + if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { + Log.e(TAG, "No such note"); // 记录错误 + throw new IllegalStateException("Try to update note with invalid id"); // 抛出异常 + } + if (mDiffNoteValues.size() > 0) { // 如果有差异数据 + mVersion++; // 增加版本 + int result = 0; + if (!validateVersion) { // 如果不验证版本 + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?)", new String[] { + String.valueOf(mId) // 使用ID作为更新条件 + }); + } else { // 如果验证版本 + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", + new String[] { + String.valueOf(mId), String.valueOf(mVersion) // 使用ID和版本作为更新条件 + }); + } + if (result == 0) { // 如果没有更新 + Log.w(TAG, "there is no update. maybe user updates note when syncing"); // 记录警告 + } + } + + if (mType == Notes.TYPE_NOTE) { // 如果类型是笔记 + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, validateVersion, mVersion); // 提交数据 + } + } + } + + // 刷新本地信息 + loadFromCursor(mId); // 重新加载数据 + if (mType == Notes.TYPE_NOTE) // 如果类型是笔记 + loadDataContent(); // 加载数据内容 + + mDiffNoteValues.clear(); // 清空差异数据 + mIsCreate = false; // 标记为非创建状态 + } + } + \ No newline at end of file diff --git a/gtask/data/Task.java b/gtask/data/Task.java new file mode 100644 index 0000000..29dbc98 --- /dev/null +++ b/gtask/data/Task.java @@ -0,0 +1,361 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * 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 net.micode.notes.gtask.data; + + import android.database.Cursor; + import android.text.TextUtils; + import android.util.Log; + + import net.micode.notes.data.Notes; + import net.micode.notes.data.Notes.DataColumns; + import net.micode.notes.data.Notes.DataConstants; + import net.micode.notes.data.Notes.NoteColumns; + import net.micode.notes.gtask.exception.ActionFailureException; + import net.micode.notes.tool.GTaskStringUtils; + + import org.json.JSONArray; + import org.json.JSONException; + import org.json.JSONObject; + + import java.util.ArrayList; + + public class Task extends Node { + private static final String TAG = Task.class.getSimpleName(); // 用于日志记录的标签 + + private boolean mCompleted; // 任务是否完成的标志 + private String mNotes; // 任务的备注 + private JSONObject mMetaInfo; // 任务的元信息 + private Task mPriorSibling; // 任务的前一个兄弟任务 + private TaskList mParent; // 任务的父任务列表 + + // 构造函数,初始化任务 + public Task() { + super(); // 调用父类构造函数 + mCompleted = false; // 默认未完成 + mNotes = null; // 初始化备注为空 + mPriorSibling = null; // 初始化前一个兄弟任务为空 + mParent = null; // 初始化父任务列表为空 + mMetaInfo = null; // 初始化元信息为空 + } + + // 获取创建任务的JSON对象 + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); // 创建JSON对象 + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); // 设置操作类型为创建 + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); // 设置操作ID + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); // 设置任务在父任务列表中的索引 + + // entity_delta + JSONObject entity = new JSONObject(); // 创建实体对象 + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); // 设置任务名称 + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); // 设置创建者ID + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_TASK); // 设置实体类型为任务 + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); // 设置备注 + } + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); // 将实体对象添加到JSON对象 + + // parent_id + js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); // 设置父任务ID + + // dest_parent_type + js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); // 设置目标父类型为组 + + // list_id + js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); // 设置任务列表ID + + // prior_sibling_id + if (mPriorSibling != null) { + js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); // 设置前一个兄弟任务ID + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + throw new ActionFailureException("fail to generate task-create jsonobject"); // 抛出异常 + } + + return js; // 返回创建任务的JSON对象 + } + + // 获取更新任务的JSON对象 + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); // 创建JSON对象 + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); // 设置操作类型为更新 + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); // 设置操作ID + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); // 设置任务ID + + // entity_delta + JSONObject entity = new JSONObject(); // 创建实体对象 + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); // 设置任务名称 + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); // 设置备注 + } + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); // 设置删除标志 + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); // 将实体对象添加到JSON对象 + + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + throw new ActionFailureException("fail to generate task-update jsonobject"); // 抛出异常 + } + + return js; // 返回更新任务的JSON对象 + } + + // 从远程JSON设置内容 + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); // 设置任务ID + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); // 设置最后修改时间 + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); // 设置任务名称 + } + + // notes + if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { + setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); // 设置备注 + } + + // deleted + if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { + setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); // 设置删除标志 + } + + // completed + if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { + setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); // 设置完成标志 + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + throw new ActionFailureException("fail to get task content from jsonobject"); // 抛出异常 + } + } + } + + // 从本地JSON设置内容 + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) + || !js.has(GTaskStringUtils.META_HEAD_DATA)) { + Log.w(TAG, "setContentByLocalJSON: nothing is available"); // 记录警告 + } + + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); // 获取笔记对象 + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); // 获取数据数组 + + if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { // 如果类型不是笔记 + Log.e(TAG, "invalid type"); // 记录错误 + return; // 返回 + } + + for (int i = 0; i < dataArray.length(); i++) { // 遍历数据数组 + JSONObject data = dataArray.getJSONObject(i); // 获取数据对象 + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + setName(data.getString(DataColumns.CONTENT)); // 设置任务名称 + break; // 找到后退出循环 + } + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + } + } + + // 从内容生成本地JSON对象 + public JSONObject getLocalJSONFromContent() { + String name = getName(); // 获取任务名称 + try { + if (mMetaInfo == null) { // 如果元信息为空 + // 从网络创建的新任务 + if (name == null) { + Log.w(TAG, "the note seems to be an empty one"); // 记录警告 + return null; // 返回null + } + + JSONObject js = new JSONObject(); // 创建JSON对象 + JSONObject note = new JSONObject(); // 创建笔记对象 + JSONArray dataArray = new JSONArray(); // 创建数据数组 + JSONObject data = new JSONObject(); // 创建数据对象 + data.put(DataColumns.CONTENT, name); // 设置内容 + dataArray.put(data); // 添加到数据数组 + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); // 将数据数组添加到JSON对象 + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); // 设置类型为笔记 + js.put(GTaskStringUtils.META_HEAD_NOTE, note); // 将笔记对象添加到JSON对象 + return js; // 返回JSON对象 + } else { + // 同步的任务 + JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); // 获取元信息中的笔记对象 + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); // 获取元信息中的数据数组 + + for (int i = 0; i < dataArray.length(); i++) { // 遍历数据数组 + JSONObject data = dataArray.getJSONObject(i); // 获取数据对象 + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + data.put(DataColumns.CONTENT, getName()); // 更新内容 + break; // 找到后退出循环 + } + } + + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); // 设置类型为笔记 + return mMetaInfo; // 返回元信息 + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + return null; // 返回null + } + } + + // 设置元信息 + public void setMetaInfo(MetaData metaData) { + if (metaData != null && metaData.getNotes() != null) { + try { + mMetaInfo = new JSONObject(metaData.getNotes()); // 将元数据转换为JSON对象 + } catch (JSONException e) { + Log.w(TAG, e.toString()); // 记录警告 + mMetaInfo = null; // 设置元信息为空 + } + } + } + + // 获取同步操作 + public int getSyncAction(Cursor c) { + try { + JSONObject noteInfo = null; // 声明笔记信息对象 + if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); // 获取元信息中的笔记对象 + } + + if (noteInfo == null) { // 如果笔记信息为空 + Log.w(TAG, "it seems that note meta has been deleted"); // 记录警告 + return SYNC_ACTION_UPDATE_REMOTE; // 返回更新远程操作 + } + + if (!noteInfo.has(NoteColumns.ID)) { // 如果笔记ID不存在 + Log.w(TAG, "remote note id seems to be deleted"); // 记录警告 + return SYNC_ACTION_UPDATE_LOCAL; // 返回更新本地操作 + } + + // 验证笔记ID + if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { + Log.w(TAG, "note id doesn't match"); // 记录警告 + return SYNC_ACTION_UPDATE_LOCAL; // 返回更新本地操作 + } + + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { // 如果没有本地更新 + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { // 如果同步ID未改变 + return SYNC_ACTION_NONE; // 返回无操作 + } else { + return SYNC_ACTION_UPDATE_LOCAL; // 返回更新本地操作 + } + } else { // 如果有本地更新 + // 验证GTask ID + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); // 记录错误 + return SYNC_ACTION_ERROR; // 返回错误操作 + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { // 如果同步ID未改变 + return SYNC_ACTION_UPDATE_REMOTE; // 返回更新远程操作 + } else { + return SYNC_ACTION_UPDATE_CONFLICT; // 返回更新冲突操作 + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + } + + return SYNC_ACTION_ERROR; // 返回错误操作 + } + + // 检查任务是否值得保存 + public boolean isWorthSaving() { + return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) + || (getNotes() != null && getNotes().trim().length() > 0); // 如果有元信息或名称或备注不为空,返回true + } + + // 设置任务完成状态 + public void setCompleted(boolean completed) { + this.mCompleted = completed; // 更新完成状态 + } + + // 设置备注 + public void setNotes(String notes) { + this.mNotes = notes; // 更新备注 + } + + // 设置前一个兄弟任务 + public void setPriorSibling(Task priorSibling) { + this.mPriorSibling = priorSibling; // 更新前一个兄弟任务 + } + + // 设置父任务列表 + public void setParent(TaskList parent) { + this.mParent = parent; // 更新父任务列表 + } + + // 获取完成状态 + public boolean getCompleted() { + return this.mCompleted; // 返回完成状态 + } + + // 获取备注 + public String getNotes() { + return this.mNotes; // 返回备注 + } + + // 获取前一个兄弟任务 + public Task getPriorSibling() { + return this.mPriorSibling; // 返回前一个兄弟任务 + } + + // 获取父任务列表 + public TaskList getParent() { + return this.mParent; // 返回父任务列表 + } + } + \ No newline at end of file diff --git a/gtask/data/TaskList.java b/gtask/data/TaskList.java new file mode 100644 index 0000000..7faf32f --- /dev/null +++ b/gtask/data/TaskList.java @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * 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 net.micode.notes.gtask.data; + + import android.database.Cursor; + import android.util.Log; + + import net.micode.notes.data.Notes; + import net.micode.notes.data.Notes.NoteColumns; + import net.micode.notes.gtask.exception.ActionFailureException; + import net.micode.notes.tool.GTaskStringUtils; + + import org.json.JSONException; + import org.json.JSONObject; + + import java.util.ArrayList; + + public class TaskList extends Node { + private static final String TAG = TaskList.class.getSimpleName(); // 用于日志记录的标签 + + private int mIndex; // 任务列表的索引 + private ArrayList mChildren; // 存储子任务的列表 + + // 构造函数,初始化任务列表 + public TaskList() { + super(); // 调用父类构造函数 + mChildren = new ArrayList(); // 初始化子任务列表 + mIndex = 1; // 默认索引为1 + } + + // 获取创建任务列表的JSON对象 + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); // 创建JSON对象 + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); // 设置操作类型为创建 + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); // 设置操作ID + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); // 设置任务列表的索引 + + // entity_delta + JSONObject entity = new JSONObject(); // 创建实体对象 + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); // 设置任务列表名称 + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); // 设置创建者ID + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); // 设置实体类型为组 + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); // 将实体对象添加到JSON对象 + + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + throw new ActionFailureException("fail to generate tasklist-create jsonobject"); // 抛出异常 + } + + return js; // 返回创建任务列表的JSON对象 + } + + // 获取更新任务列表的JSON对象 + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); // 创建JSON对象 + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); // 设置操作类型为更新 + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); // 设置操作ID + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); // 设置任务列表ID + + // entity_delta + JSONObject entity = new JSONObject(); // 创建实体对象 + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); // 设置任务列表名称 + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); // 设置删除标志 + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); // 将实体对象添加到JSON对象 + + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + throw new ActionFailureException("fail to generate tasklist-update jsonobject"); // 抛出异常 + } + + return js; // 返回更新任务列表的JSON对象 + } + + // 从远程JSON设置内容 + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); // 设置任务列表ID + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); // 设置最后修改时间 + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); // 设置任务列表名称 + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + throw new ActionFailureException("fail to get tasklist content from jsonobject"); // 抛出异常 + } + } + } + + // 从本地JSON设置内容 + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { + Log.w(TAG, "setContentByLocalJSON: nothing is available"); // 记录警告 + } + + try { + JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); // 获取笔记对象 + + if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { // 如果是文件夹 + String name = folder.getString(NoteColumns.SNIPPET); // 获取摘要 + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); // 设置任务列表名称 + } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { // 如果是系统文件夹 + if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); // 设置根文件夹名称 + else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE); // 设置通话记录文件夹名称 + else + Log.e(TAG, "invalid system folder"); // 记录错误 + } else { + Log.e(TAG, "error type"); // 记录错误 + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + } + } + + // 从内容生成本地JSON对象 + public JSONObject getLocalJSONFromContent() { + try { + JSONObject js = new JSONObject(); // 创建JSON对象 + JSONObject folder = new JSONObject(); // 创建文件夹对象 + + String folderName = getName(); // 获取任务列表名称 + if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) + folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), + folderName.length()); // 去掉前缀 + folder.put(NoteColumns.SNIPPET, folderName); // 设置摘要 + if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) + || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) + folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); // 设置类型为系统 + else + folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); // 设置类型为文件夹 + + js.put(GTaskStringUtils.META_HEAD_NOTE, folder); // 将文件夹对象添加到JSON对象 + + return js; // 返回JSON对象 + } catch (JSONException e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + return null; // 返回null + } + } + + // 获取同步操作 + public int getSyncAction(Cursor c) { + try { + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { // 如果没有本地更新 + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { // 如果同步ID未改变 + return SYNC_ACTION_NONE; // 返回无操作 + } else { + return SYNC_ACTION_UPDATE_LOCAL; // 返回更新本地操作 + } + } else { // 如果有本地更新 + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { // 验证GTask ID + Log.e(TAG, "gtask id doesn't match"); // 记录错误 + return SYNC_ACTION_ERROR; // 返回错误操作 + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { // 如果同步ID未改变 + return SYNC_ACTION_UPDATE_REMOTE; // 返回更新远程操作 + } else { + // 对于文件夹冲突,仅应用本地修改 + return SYNC_ACTION_UPDATE_REMOTE; // 返回更新远程操作 + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); // 记录错误 + e.printStackTrace(); // 打印堆栈跟踪 + } + + return SYNC_ACTION_ERROR; // 返回错误操作 + } + + // 获取子任务数量 + public int getChildTaskCount() { + return mChildren.size(); // 返回子任务数量 + } + + // 添加子任务 + public boolean addChildTask(Task task) { + boolean ret = false; // 返回值 + if (task != null && !mChildren.contains(task)) { // 如果任务不为空且不在子任务列表中 + ret = mChildren.add(task); // 添加子任务 + if (ret) { + // 需要设置前一个兄弟任务和父任务 + task.setPriorSibling(mChildren.isEmpty() ? null : mChildren + .get(mChildren.size() - 1)); // 设置前一个兄弟任务 + task.setParent(this); // 设置父任务 + } + } + return ret; // 返回添加结果 + } + + // 在指定索引添加子任务 + public boolean addChildTask(Task task, int index) { + if (index < 0 || index > mChildren.size()) { // 验证索引有效性 + Log.e(TAG, "add child task: invalid index"); // 记录错误 + return false; // 返回失败 + } + + int pos = mChildren.indexOf(task); // 获取任务在列表中的位置 + if (task != null && pos == -1) { // 如果任务不为空且不在列表中 + mChildren.add(index, task); // 在指定索引添加子任务 + + // 更新任务列表 + Task preTask = null; // 前一个任务 + Task afterTask = null; // 后一个任务 + if (index != 0) + preTask = mChildren.get(index - 1); // 获取前一个任务 + if (index != mChildren.size() - 1) + afterTask = mChildren.get(index + 1); // 获取后一个任务 + + task.setPriorSibling(preTask); // 设置前一个兄弟任务 + if (afterTask != null) + afterTask.setPriorSibling(task); // 设置后一个兄弟任务 + } + + return true; // 返回成功 + } + + // 移除子任务 + public boolean removeChildTask(Task task) { + boolean ret = false; // 返回值 + int index = mChildren.indexOf(task); // 获取任务在列表中的位置 + if (index != -1) { // 如果任务在列表中 + ret = mChildren.remove(task); // 移除子任务 + + if (ret) { + // 重置前一个兄弟任务和父任务 + task.setPriorSibling(null); // 设置前一个兄弟任务为空 + task.setParent(null); // 设置父任务为空 + + // 更新任务列表 + if (index != mChildren.size()) { + mChildren.get(index).setPriorSibling( + index == 0 ? null : mChildren.get(index - 1)); // 更新前一个兄弟任务 + } + } + } + return ret; // 返回移除结果 + } + + // 移动子任务到指定索引 + public boolean moveChildTask(Task task, int index) { + if (index < 0 || index >= mChildren.size()) { // 验证索引有效性 + Log.e(TAG, "move child task: invalid index"); // 记录错误 + return false; // 返回失败 + } + + int pos = mChildren.indexOf(task); // 获取任务在列表中的位置 + if (pos == -1) { // 如果任务不在列表中 + Log.e(TAG, "move child task: the task should in the list"); // 记录错误 + return false; // 返回失败 + } + + if (pos == index) // 如果位置相同 + return true; // 返回成功 + return (removeChildTask(task) && addChildTask(task, index)); // 移除并添加任务 + } + + // 根据GID查找子任务 + public Task findChildTaskByGid(String gid) { + for (int i = 0; i < mChildren.size(); i++) { // 遍历子任务列表 + Task t = mChildren.get(i); // 获取子任务 + if (t.getGid().equals(gid)) { // 如果GID匹配 + return t; // 返回匹配的子任务 + } + } + return null; // 返回null + } + + // 获取子任务的索引 + public int getChildTaskIndex(Task task) { + return mChildren.indexOf(task); // 返回子任务在列表中的索引 + } + + // 根据索引获取子任务 + public Task getChildTaskByIndex(int index) { + if (index < 0 || index >= mChildren.size()) { // 验证索引有效性 + Log.e(TAG, "getTaskByIndex: invalid index"); // 记录错误 + return null; // 返回null + } + return mChildren.get(index); // 返回子任务 + } + + // 根据GID获取子任务 + public Task getChilTaskByGid(String gid) { + for (Task task : mChildren) { // 遍历子任务列表 + if (task.getGid().equals(gid)) // 如果GID匹配 + return task; // 返回匹配的子任务 + } + return null; // 返回null + } + + // 获取子任务列表 + public ArrayList getChildTaskList() { + return this.mChildren; // 返回子任务列表 + } + + // 设置任务列表的索引 + public void setIndex(int index) { + this.mIndex = index; // 更新索引 + } + + // 获取任务列表的索引 + public int getIndex() { + return this.mIndex; // 返回索引 + } + } + \ No newline at end of file diff --git a/gtask/exception/ActionFailureException.java b/gtask/exception/ActionFailureException.java new file mode 100644 index 0000000..1fc9016 --- /dev/null +++ b/gtask/exception/ActionFailureException.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * 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 net.micode.notes.gtask.exception; + + // 自定义异常类,用于表示操作失败的情况 + public class ActionFailureException extends RuntimeException { + private static final long serialVersionUID = 4425249765923293627L; // 序列化ID,用于反序列化 + + // 默认构造函数 + public ActionFailureException() { + super(); // 调用父类构造函数 + } + + // 带有错误消息的构造函数 + public ActionFailureException(String paramString) { + super(paramString); // 调用父类构造函数,传递错误消息 + } + + // 带有错误消息和原因的构造函数 + public ActionFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); // 调用父类构造函数,传递错误消息和原因 + } + } + \ No newline at end of file diff --git a/gtask/exception/NetworkFailureException.java b/gtask/exception/NetworkFailureException.java new file mode 100644 index 0000000..ce0ea32 --- /dev/null +++ b/gtask/exception/NetworkFailureException.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * 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 net.micode.notes.gtask.exception; + + // 自定义异常类,用于表示网络故障的情况 + public class NetworkFailureException extends Exception { + private static final long serialVersionUID = 2107610287180234136L; // 序列化ID,用于反序列化 + + // 默认构造函数 + public NetworkFailureException() { + super(); // 调用父类构造函数 + } + + // 带有错误消息的构造函数 + public NetworkFailureException(String paramString) { + super(paramString); // 调用父类构造函数,传递错误消息 + } + + // 带有错误消息和原因的构造函数 + public NetworkFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); // 调用父类构造函数,传递错误消息和原因 + } + } + \ No newline at end of file diff --git a/src/net/micode/notes/gtask/remote/GTaskASyncTask.java b/gtask/remote/GTaskASyncTask.java similarity index 100% rename from src/net/micode/notes/gtask/remote/GTaskASyncTask.java rename to gtask/remote/GTaskASyncTask.java diff --git a/src/net/micode/notes/gtask/remote/GTaskClient.java b/gtask/remote/GTaskClient.java similarity index 100% rename from src/net/micode/notes/gtask/remote/GTaskClient.java rename to gtask/remote/GTaskClient.java diff --git a/src/net/micode/notes/gtask/remote/GTaskManager.java b/gtask/remote/GTaskManager.java similarity index 100% rename from src/net/micode/notes/gtask/remote/GTaskManager.java rename to gtask/remote/GTaskManager.java diff --git a/src/net/micode/notes/gtask/remote/GTaskSyncService.java b/gtask/remote/GTaskSyncService.java similarity index 100% rename from src/net/micode/notes/gtask/remote/GTaskSyncService.java rename to gtask/remote/GTaskSyncService.java diff --git a/src/net/micode/notes/data/Contact.java b/src/net/micode/notes/data/Contact.java deleted file mode 100644 index 8f11fe8..0000000 --- a/src/net/micode/notes/data/Contact.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.data; //声明该类属于net.micode.notes.data包 - -import android.content.Context; //导入Context类,用于获取应用的上下文 -import android.database.Cursor; //导入Cursor类,用于处理数据库查询的结果 -import android.provider.ContactsContract.CommonDataKinds.Phone; //导入Phone类,访问联系人相关信息 -import android.provider.ContactsContract.Data; //导入Data类,用于访问数据表 -import android.telephony.PhoneNumberUtils; //导入PhoneNumberUtils类,用于处理电话号码 -import android.util.Log; //导入Log类,用于输出日志 - -import java.util.HashMap; //导入HashMap类,用于存储电话号码和联系人名称的缓存 - -public class Contact { //定义一个名为Contact的类 - private static HashMap sContactCache; //定义一个静态的HashMap,用于缓存电话号码和对应的联系人名称 - private static final String TAG = "Contact"; //定义日志标记 - - //定义一个常量字符串,用于查询符合条件的联系人 - private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER - + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" - + " AND " + Data.RAW_CONTACT_ID + " IN " - + "(SELECT raw_contact_id " - + " FROM phone_lookup" - + " WHERE min_match = '+')"; - - //定义一个静态方法,用于获取联系人名称 - public static String getContact(Context context, String phoneNumber) { - //如果缓存为空,则初始化缓存 - if(sContactCache == null) { - sContactCache = new HashMap(); - } - - //如果缓存中已经存在该电话号码的联系人,则直接返回缓存中的值 - if(sContactCache.containsKey(phoneNumber)) { - return sContactCache.get(phoneNumber); - } - - //使用PhoneNumberUtils将电话号码格式化为最小匹配格式 - String selection = CALLER_ID_SELECTION.replace("+", - PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); - - //通过ContentResolver执行查询操作,查询联系人表中的名称 - Cursor cursor = context.getContentResolver().query( - Data.CONTENT_URI, //查询Data内容提供者 - new String [] { Phone.DISPLAY_NAME }, //查询显示名称字段 - selection, //查询条件 - new String[] { phoneNumber }, //查询参数,即电话号码 - null); //排序条件为空 - - //如果查询结果不为空且有数据 - if (cursor != null && cursor.moveToFirst()) { - try { - //获取联系人名称 - String name = cursor.getString(0); - //将电话号码和联系人名称缓存到HashMap中 - sContactCache.put(phoneNumber, name); - return name; //返回联系人名称 - } catch (IndexOutOfBoundsException e) { //如果获取数据失败 - Log.e(TAG, " Cursor get string error " + e.toString()); //输出错误日志 - return null; //返回null表示未找到联系人 - } finally { //确保查询完成后关闭游标 - cursor.close(); - } - } else { //如果没有找到联系人 - Log.d(TAG, "No contact matched with number:" + phoneNumber); //输出日志表示没有找到匹配的联系人 - return null; //返回null表示未找到联系人 - } - } -} diff --git a/src/net/micode/notes/data/Notes.java b/src/net/micode/notes/data/Notes.java deleted file mode 100644 index 890ab3d..0000000 --- a/src/net/micode/notes/data/Notes.java +++ /dev/null @@ -1,193 +0,0 @@ -```java -/* - -1.Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) -* -2.Licensed under the Apache License, Version 2.0 (the "License"); -3.you may not use this file except in compliance with the License. -4.You may obtain a copy of the License at -* -5.http://www.apache.org/licenses/LICENSE-2.0 -* -6.Unless required by applicable law or agreed to in writing, software -7.distributed under the License is distributed on an "AS IS" BASIS, -8.WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -9.See the License for the specific language governing permissions and -10.limitations under the License. -*/ - -package net.micode.notes.data; // 定义包名 -import android.net.Uri; // 引入 Uri 类,用于处理 URI(统一资源标识符) -public class Notes { // 定义 Notes 类 - public static final String AUTHORITY = "micodenotes"; // 定义授权标识符 - public static final String TAG = "Notes"; // 定义标签用于日志记录 - public static final int TYPENOTE = 0; // 定义笔记类型常量(类型为笔记) - public static final int TYPEFOLDER = 1; // 定义文件夹类型常量(类型为文件夹) - public static final int TYPESYSTEM = 2; // 定义系统类型常量(类型为系统) -/** - * Following IDs are system folders' identifiers - * {@link Notes#ID_ROOT_FOLDER } is default folder - * {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder - * {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records - */ -public static final int ID_ROOT_FOLDER = 0; // 系统文件夹的根文件夹 ID -public static final int ID_TEMPARAY_FOLDER = -1; // 临时文件夹的 ID(用于没有文件夹的笔记) -public static final int ID_CALL_RECORD_FOLDER = -2; // 通话记录文件夹的 ID -public static final int ID_TRASH_FOLER = -3; // 回收站文件夹的 ID - -public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; // 提醒日期的 Intent 字段 -public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; // 背景颜色 ID 的 Intent 字段 -public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; // 小部件 ID 的 Intent 字段 -public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type"; // 小部件类型的 Intent 字段 -public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; // 文件夹 ID 的 Intent 字段 -public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; // 通话日期的 Intent 字段 - -public static final int TYPE_WIDGET_INVALIDE = -1; // 小部件无效类型 -public static final int TYPE_WIDGET_2X = 0; // 小部件 2x 类型 -public static final int TYPE_WIDGET_4X = 1; // 小部件 4x 类型 - -public static class DataConstants { // 定义数据常量类 - public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; // 文字笔记的内容类型常量 - public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; // 通话笔记的内容类型常量 -} - -/** - * Uri to query all notes and folders - */ -public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); // 用于查询所有笔记和文件夹的 URI - -/** - * Uri to query data - */ -public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); // 用于查询数据的 URI - -public interface NoteColumns { // 定义笔记相关列的接口 - /** - * The unique ID for a row - * <P> Type: INTEGER (long) </P> - */ - public static final String ID = "_id"; // 行的唯一 ID,类型为整型(long) - - /** - * The parent's id for note or folder - * <P> Type: INTEGER (long) </P> - */ - public static final String PARENT_ID = "parent_id"; // 笔记或文件夹的父级 ID,类型为整型(long) - - /** - * Created data for note or folder - * <P> Type: INTEGER (long) </P> - */ - public static final String CREATED_DATE = "created_date"; // 创建日期,类型为整型(long) - - /** - * Latest modified date - * <P> Type: INTEGER (long) </P> - */ - public static final String MODIFIED_DATE = "modified_date"; // 最新修改日期,类型为整型(long) - - - /** - * Alert date - * <P> Type: INTEGER (long) </P> - */ - public static final String ALERTED_DATE = "alert_date"; // 提醒日期,类型为整型(long) - - /** - * Folder's name or text content of note - * <P> Type: TEXT </P> - */ - public static final String SNIPPET = "snippet"; // 文件夹的名称或笔记的文本内容,类型为文本 - - /** - * Note's widget id - * <P> Type: INTEGER (long) </P> - */ - public static final String WIDGET_ID = "widget_id"; // 笔记的小部件 ID,类型为整型(long) - - /** - * Note's widget type - * <P> Type: INTEGER (long) </P> - */ - public static final String WIDGET_TYPE = "widget_type"; // 笔记的小部件类型,类型为整型(long) - - /** - * Note's background color's id - * <P> Type: INTEGER (long) </P> - */ - public static final String BG_COLOR_ID = "bg_color_id"; // 笔记的背景颜色 ID,类型为整型(long) - - /** - * For text note, it doesn't has attachment, for multi-media - * note, it has at least one attachment - * <P> Type: INTEGER </P> - */ - public static final String HAS_ATTACHMENT = "has_attachment"; // 笔记是否有附件,类型为整型 - - /** - * Folder's count of notes - * <P> Type: INTEGER (long) </P> - */ - public static final String NOTES_COUNT = "notes_count"; // 文件夹中的笔记数量,类型为整型(long) - - /** - * The file type: folder or note - * <P> Type: INTEGER </P> - */ - public static final String TYPE = "type"; // 文件类型:文件夹或笔记,类型为整型 - - /** - * The last sync id - * <P> Type: INTEGER (long) </P> - */ - public static final String SYNC_ID = "sync_id"; // 最后同步 ID,类型为整型(long) - - /** - * Sign to indicate local modified or not - * <P> Type: INTEGER </P> - */ - public static final String LOCAL_MODIFIED = "local_modified"; // 标识本地是否有修改,类型为整型 - - /** - * Original parent id before moving into temporary folder - * <P> Type : INTEGER </P> - */ - public static final String ORIGIN_PARENT_ID = "origin_parent_id"; // 原始父级 ID(在移动到临时文件夹之前),类型为整型 - - /** - * The gtask id - * <P> Type : TEXT </P> - */ - public static final String GTASK_ID = "gtask_id"; // Google 任务 ID,类型为文本 - - /** - * The version code - * <P> Type : INTEGER (long) </P> - */ - public static final String VERSION = "version"; // 版本号,类型为整型(long) -} - -public interface DataColumns { // 定义数据相关列的接口 - /** - * The unique ID for a row - * <P> Type: INTEGER (long) </P> - */ - public static final String ID = "_id"; // 行的唯一 ID,类型为整型(long) - - /** - * The MIME type of the item represented by this row. - * <P> Type: Text </P> - */ - public static final String MIME_TYPE = "mime_type"; // MIME 类型,类型为文本 - - /** - * The reference id to note that this data belongs to - * <P> Type: INTEGER (long) </P> - */ - public static final String NOTE_ID = "note_id"; // 该数据所属的笔记的 ID,类型为整型(long) - - /** - * Created data for note or folder - * <P> Type: INTEGER (long) </P> - */ - public diff --git a/src/net/micode/notes/data/NotesDatabaseHelper.java b/src/net/micode/notes/data/NotesDatabaseHelper.java deleted file mode 100644 index e36d6cf..0000000 --- a/src/net/micode/notes/data/NotesDatabaseHelper.java +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.data; - -import android.content.ContentValues; -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.util.Log; - -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; - - -public class NotesDatabaseHelper extends SQLiteOpenHelper { -// 数据库帮助类,用于管理名为 note.db 的 SQLite 数据库。 -// 它继承自 SQLiteOpenHelper 类,这是 Android提供的一个方便的工具类,用于管理数据库的创建和版本更新. - // 数据库的基本信息;数据库名称和版本信息(在创建实例对象时会用到) - private static final String DB_NAME = "note.db"; - - private static final int DB_VERSION = 5; - // 内部接口:个人理解为两个表名,一个note,一个data - public interface TABLE { - public static final String NOTE = "note"; - - public static final String DATA = "data"; - } - // 一个标签,方便日志输出时识别出信息来自哪里 - private static final String TAG = "NotesDatabaseHelper"; - - private static NotesDatabaseHelper mInstance; - /* 以下都是一些SQL语句,辅助我们来对数据库进行操作 */ - // 创建note表的语句,这里的NoteColumns就是我们刚刚在Notes中定义的一个接口,里面定义了一系列静态的数据库表中的列名 - private static final String CREATE_NOTE_TABLE_SQL = - "CREATE TABLE " + TABLE.NOTE + "(" + - NoteColumns.ID + " INTEGER PRIMARY KEY," + - NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + - NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + - NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," + - NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + - NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + - NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.PASSWORD + " TEXT DEFAULT NULL " + - ")"; - // 同上,创建data表的语句,这里的DataColumns就是我们刚刚在Notes中定义的一个接口,里面定义了一系列静态的数据库表中的列名 - private static final String CREATE_DATA_TABLE_SQL = - "CREATE TABLE " + TABLE.DATA + "(" + - DataColumns.ID + " INTEGER PRIMARY KEY," + - DataColumns.MIME_TYPE + " TEXT NOT NULL," + - DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + - NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + - DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," + - DataColumns.DATA1 + " INTEGER," + - DataColumns.DATA2 + " INTEGER," + - DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + - DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + - DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + - ")"; - // 功能简介: - // 创建一个以note的ID为索引 - // 解读: - // 用于在TABLE.DATA表上创建一个名为note_id_index的索引。 - // 这个索引是基于DataColumns.NOTE_ID列的。IF NOT EXISTS确保了如果索引已经存在,那么就不会尝试重新创建它,避免了可能的错误。 - // 索引通常用于提高查询性能,特别是在对某个字段进行频繁查询时。 - private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = - "CREATE INDEX IF NOT EXISTS note_id_index ON " + - TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; - - /* 以下是一些对便签增删改定义的触发器 */ - /* 总结 - * 这些触发器都是用来维护NOTE表和与之相关联的DATA表之间数据一致性的。 - * 当在NOTE表中发生删除或更新操作时,这些触发器会自动执行相应的数据清理或更新操作,确保数据库中的数据保持正确和一致。 - * 特别是在处理文件夹和回收站等逻辑时,这些触发器起到了非常重要的作用,可以自动管理数据的移动和删除。*/ - /** - * Increase folder's note count when move note to the folder - */ - // 功能简介: - // 添加触发器:增加文件夹的便签个数记录(因为我们会移动便签进入文件夹,这时候文件夹的计数要进行更新) - // 解读: - // 定义了一个SQL触发器increase_folder_count_on_update。 - // 触发器是一种特殊的存储过程,它会在指定表上的指定事件(如INSERT、UPDATE、DELETE)发生时自动执行。 - // 这个触发器会在TABLE.NOTE表的NoteColumns.PARENT_ID字段更新后执行。 - // 触发器的逻辑是:当某个笔记的PARENT_ID(即父文件夹ID)被更新时,它会找到对应的文件夹(通过新的PARENT_ID),并将该文件夹的NOTES_COUNT(即笔记数)增加1。 - private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = - "CREATE TRIGGER increase_folder_count_on_update "+ - " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END"; - - /** - * Decrease folder's note count when move note from folder - */ - // 功能简介:(触发器和上面的 “增加文件夹的便签个数记录” 同理,就不细节解读了) - // 添加触发器:减少文件夹的便签个数记录(因为我们会移动便签移出文件夹,这时候文件夹的计数要进行更新) - private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = - "CREATE TRIGGER decrease_folder_count_on_update " + - " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + - " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + - " END"; - - /** - * Increase folder's note count when insert new note to the folder - */ - // 功能简介:(触发器原理和上面的 “增加文件夹的便签个数记录” 同理,就不细节解读了) - // 添加触发器:当我们在文件夹插入便签时,增加文件夹的便签个数记录 - private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = - "CREATE TRIGGER increase_folder_count_on_insert " + - " AFTER INSERT ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END"; - - /** - * Decrease folder's note count when delete note from the folder - */ - // 功能简介:(触发器原理和上面的 “增加文件夹的便签个数记录” 同理,就不细节解读了) - // 添加触发器:当我们在文件夹删除便签时,减少文件夹的便签个数记录 - private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = - "CREATE TRIGGER decrease_folder_count_on_delete " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + - " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0;" + - " END"; - - /** - * Update note's content when insert data with type {@link DataConstants#NOTE} - */ - // 功能简介: - // 添加触发器:当向DATA表中插入类型为NOTE(便签)的数据时,更新note表对应的笔记内容。 - // 解读: - // 在DATA表上进行INSERT操作后,如果新插入的数据的MIME_TYPE为NOTE,则触发此操作。 - // 它会更新NOTE表,将与新插入数据相关联的标签的SNIPPET(摘要)字段设置为新插入数据的CONTENT字段的值 - private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = - "CREATE TRIGGER update_note_content_on_insert " + - " AFTER INSERT ON " + TABLE.DATA + - " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * Update note's content when data with {@link DataConstants#NOTE} type has changed - */ - // 功能简介: - // 添加触发器:当DATA表中,类型为NOTE(便签)的数据更改时,更新note表对应的笔记内容。 - // 解读: - // 在DATA表上进行UPDATE操作后,如果更新前的数据的MIME_TYPE为NOTE,则触发此操作。 - // 它会更新NOTE表,将与更新后的数据相关联的笔记的SNIPPET字段设置为新数据的CONTENT字段的值 - private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = - "CREATE TRIGGER update_note_content_on_update " + - " AFTER UPDATE ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * Update note's content when data with {@link DataConstants#NOTE} type has deleted - */ - // 功能简介: - // 添加触发器:当从NOTE表中删除笔记时,删除与该笔记相关联的数据(就是删除data表中为该note的数据) - // 解读: - // 在NOTE表上进行DELETE操作后,此触发器被激活。 - // 它会从DATA表中删除所有与已删除的笔记(由old.ID表示)相关联的数据行(通过比较DATA表中的NOTE_ID字段与已删除笔记的ID来实现) - private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = - "CREATE TRIGGER update_note_content_on_delete " + - " AFTER delete ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=''" + - " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * Delete datas belong to note which has been deleted - */ - // 功能简介: - // 添加触发器:当从NOTE表中删除笔记时,删除与该笔记相关联的数据(就是删除data表中为该note的数据) - // 解读: - // 在NOTE表上进行DELETE操作后,此触发器被激活。 - // 它会从DATA表中删除所有与已删除的笔记(由old.ID表示)相关联的数据行(通过比较DATA表中的NOTE_ID字段与已删除笔记的ID来实现) - private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = - "CREATE TRIGGER delete_data_on_delete " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.DATA + - " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + - " END"; - - /** - * Delete notes belong to folder which has been deleted - */ - // 功能简介: - // 添加触发器:当从NOTE表中删除一个文件夹时,删除该文件夹下的所有笔记。 - // 解读: - // 在NOTE表上进行DELETE操作后,如果删除的是一个文件夹(由old.ID表示) - // 触发器会删除所有以该文件夹为父级(PARENT_ID)的笔记(通过比较NOTE表中的PARENT_ID字段与已删除文件夹的ID来实现) - private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = - "CREATE TRIGGER folder_delete_notes_on_delete " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.NOTE + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END"; - - /** - * Move notes belong to folder which has been moved to trash folder - */ - // 功能简介: - // 添加触发器:当某个文件夹被移动到回收站时,移动该文件夹下的所有笔记到回收站 - // 解读: - // 在NOTE表上进行UPDATE操作后,如果某个文件夹的新PARENT_ID字段值等于回收站的ID(Notes.ID_TRASH_FOLER) - // 触发器会更新所有以该文件夹为父级(PARENT_ID)的笔记,将它们也移动到回收站。 - private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = - "CREATE TRIGGER folder_move_notes_on_trash " + - " AFTER UPDATE ON " + TABLE.NOTE + - " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END"; - - // 构造器 - public NotesDatabaseHelper(Context context) { - super(context, DB_NAME, null, DB_VERSION); - } - - // 创建note(标签)表 - public void createNoteTable(SQLiteDatabase db) { - db.execSQL(CREATE_NOTE_TABLE_SQL); - reCreateNoteTableTriggers(db); - createSystemFolder(db); - Log.d(TAG, "note table has been created"); - } - - // 重新创建或更新与笔记表相关的触发器。 - // 首先,使用DROP TRIGGER IF EXISTS语句删除已存在的触发器。确保在重新创建触发器之前,不存在同名的触发器。 - // 然后,使用db.execSQL()方法执行预定义的SQL语句,这些语句用于创建新的触发器。 - private void reCreateNoteTableTriggers(SQLiteDatabase db) { - db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); - db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update"); - db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash"); - - db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); - db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); - db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER); - db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER); - db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER); - db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER); - db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); - } - - /* 以下部分是操作SQLite数据库部分 */ - // 功能简介: - // 创建通话记录文件夹、默认文件夹、临时文件夹和回收站,并插入相关数据 - // 具体解读: - // ContentValues是一个用于存储键值对的类,常用于SQLite数据库的插入操作 - // values.put方法可以向ContentValues对象中添加数据。 - // NoteColumns.ID是存储文件夹ID的列名,Notes.ID_CALL_RECORD_FOLDER是通话记录文件夹的ID。 - // NoteColumns.TYPE是存储文件夹类型的列名,Notes.TYPE_SYSTEM表示这是一个系统文件夹。 - // 使用db.insert方法将values中的数据插入到TABLE.NOTE(即标签表)中。 - // 每次插入新数据前,都使用values.clear()方法清除ContentValues对象中的旧数据,确保不会重复插入旧数据。 - // 然后分别创建默认文件夹、临时文件夹和回收站,并以同样的方法插入数据。 - private void createSystemFolder(SQLiteDatabase db) { - ContentValues values = new ContentValues(); - - /** - * call record foler for call notes - */ - values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * root folder which is default folder - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * temporary folder which is used for moving note - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * create trash folder - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - } - - public void createDataTable(SQLiteDatabase db) { - db.execSQL(CREATE_DATA_TABLE_SQL); - reCreateDataTableTriggers(db); - db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); - Log.d(TAG, "data table has been created"); - } - - private void reCreateDataTableTriggers(SQLiteDatabase db) { - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); - - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); - } - - static synchronized NotesDatabaseHelper getInstance(Context context) { - if (mInstance == null) { - mInstance = new NotesDatabaseHelper(context); - } - return mInstance; - } - - @Override - public void onCreate(SQLiteDatabase db) { - createNoteTable(db); - createDataTable(db); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - boolean reCreateTriggers = false; - boolean skipV2 = false; - - if (oldVersion == 1) { - upgradeToV2(db); - skipV2 = true; // this upgrade including the upgrade from v2 to v3 - oldVersion++; - } - - if (oldVersion == 2 && !skipV2) { - upgradeToV3(db); - reCreateTriggers = true; - oldVersion++; - } - - if (oldVersion == 3) { - upgradeToV4(db); - oldVersion++; - } - if(oldVersion == 4){ - upgradeToV5(db); - oldVersion++; - } - - if (reCreateTriggers) { - reCreateNoteTableTriggers(db); - reCreateDataTableTriggers(db); - } - - if (oldVersion != newVersion) { - throw new IllegalStateException("Upgrade notes database to version " + newVersion - + "fails"); - } - } - - private void upgradeToV2(SQLiteDatabase db) { - db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); - db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); - createNoteTable(db); - createDataTable(db); - } - - private void upgradeToV3(SQLiteDatabase db) { - // drop unused triggers - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); - // add a column for gtask id - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID - + " TEXT NOT NULL DEFAULT ''"); - // add a trash system folder - ContentValues values = new ContentValues(); - values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - } - - private void upgradeToV4(SQLiteDatabase db) { - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION - + " INTEGER NOT NULL DEFAULT 0"); - } - private void upgradeToV5(SQLiteDatabase db){ - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.PASSWORD - + " TEXT DEFAULT NULL "); - } - -} diff --git a/src/net/micode/notes/data/NotesProvider.java b/src/net/micode/notes/data/NotesProvider.java deleted file mode 100644 index 475fbed..0000000 --- a/src/net/micode/notes/data/NotesProvider.java +++ /dev/null @@ -1,402 +0,0 @@ -package net.micode.notes.data; - - -import android.app.SearchManager; -import android.content.ContentProvider; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Intent; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.net.Uri; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.NotesDatabaseHelper.TABLE; - - -public class NotesProvider extends ContentProvider { -// Android 应用程序中的一部分:内容提供者(ContentProvider)。 -// 内容提供者是 Android 四大组件之一,它允许应用程序之间共享数据。 - - //概述: - //NotesProvider的主要功能是作为一个内容提供者,为其他应用程序或组件提供对“Notes”数据的访问。 - //它允许其他应用程序查询、插入、更新或删除标签数据。 - //通过URI匹配,NotesProvider能够区分对哪种数据类型的请求(例如,单独的标签、标签的数据、文件夹操作等),并执行相应的操作。 - - //用于匹配不同URI的UriMatcher对象,通常用于解析传入的URI,并确定应该执行哪种操作。 - private static final UriMatcher mMatcher; - - //NotesDatabaseHelper实类,用来操作SQLite数据库,负责创建、更新和查询数据库。 - private NotesDatabaseHelper mHelper; - - //标签,输出日志时用来表示是该类发出的消息 - private static final String TAG = "NotesProvider"; - - //6个URI的匹配码,用于区分不同的URI类型 - private static final int URI_NOTE = 1; - private static final int URI_NOTE_ITEM = 2; - private static final int URI_DATA = 3; - private static final int URI_DATA_ITEM = 4; - - private static final int URI_SEARCH = 5; - private static final int URI_SEARCH_SUGGEST = 6; - - //进一步定义了URI匹配规则和搜索查询的投影 - //功能概述: - //初始化了一个UriMatcher对象mMatcher,并添加了一系列的URI匹配规则。 - //解读: - static { - //创建了一个UriMatcher实例,并设置默认匹配码为NO_MATCH,表示如果没有任何URI匹配,则返回这个码。 - mMatcher = new UriMatcher(UriMatcher.NO_MATCH); - //添加规则,当URI的authority为Notes.AUTHORITY,路径为note时,返回匹配码URI_NOTE。 - mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); - //添加规则,当URI的authority为Notes.AUTHORITY,路径为note/后跟一个数字(#代表数字)时,返回匹配码URI_NOTE_ITEM。 - mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); - //和上面两句同理,但用于匹配数据相关的URI - mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); - mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); - //用于匹配搜索相关的URI - mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); - //这两行用于匹配搜索建议相关的URI - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); - } - - /** - * x'0A' represents the '\n' character in sqlite. For title and content in the search result, - * we will trim '\n' and white space in order to show more information. - */ - //功能概述: - //一个 SQL 查询的投影部分,用于定义查询返回的结果集中应该包含哪些列。 - //解读:(每行对应) - //返回笔记的 ID。 - //笔记的 ID 也被重命名为 SUGGEST_COLUMN_INTENT_EXTRA_DATA,这通常用于 Android 的搜索建议中,作为传递给相关 Intent 的额外数据。 - //对 SNIPPET 列的处理:首先使用 REPLACE 函数将 x'0A'(即换行符 \n)替换为空字符串,然后使用 TRIM 函数删除前后的空白字符,处理后的结果分别重命名为 SUGGEST_COLUMN_TEXT_1 - //对 SNIPPET 列的处理:首先使用 REPLACE 函数将 x'0A'(即换行符 \n)替换为空字符串,然后使用 TRIM 函数删除前后的空白字符,处理后的结果分别重命名为 SUGGEST_COLUMN_TEXT_2 - //返回一个用于搜索建议图标的资源 ID,并命名为 SUGGEST_COLUMN_ICON_1。 - //返回一个固定的 Intent 动作 ACTION_VIEW,并命名为 SUGGEST_COLUMN_INTENT_ACTION。 - //返回一个内容类型,并命名为 SUGGEST_COLUMN_INTENT_DATA。 - private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," //返回笔记的 ID - + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," - + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," - + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + "," - + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," - + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," - + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; - - //功能概述: - //完整的 SQL 查询语句,用于从 TABLE.NOTE 表中检索信息 - //解读: - // 使用上面定义的投影来选择数据。 - // 并指定从哪个表中选择数据。 - //WHERE子句包含三个条件: - // ①搜索 SNIPPET 列中包含特定模式的行(? 是一个占位符,实际查询时会用具体的值替换)。 - // ②父ID不为回收站的ID:排除那些父 ID 为回收站的行。 - // ③只选择类型为note(标签)的行。 - private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION - + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" - + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER - + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; - - //重写onCreate方法: - //getContext() 方法被调用以获取当前组件的上下文(Context),以便 NotesDatabaseHelper 能够访问应用程序的资源和其他功能 - //mHelper用于存储从 NotesDatabaseHelper.getInstance 方法返回的实例。这样,该实例就可以在整个组件的其他方法中被访问和使用。 - @Override - public boolean onCreate() { - mHelper = NotesDatabaseHelper.getInstance(getContext()); - return true; - } - - //功能:查询数据 - @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, - String sortOrder) { - //初始化变量: - //Cursor对象 c,用来存储查询结果 - //使用 NotesDatabaseHelper 的实例 mHelper来获取一个可读的数据库实例 - //定义一个字符串id,用来存储从URI中解析出的ID - Cursor c = null; - SQLiteDatabase db = mHelper.getReadableDatabase(); - String id = null; - - //根据匹配不同的URI来进行不同的查询 - switch (mMatcher.match(uri)) { - // URI_NOTE:查询整个 NOTE 表。 - // URI_NOTE_ITEM:查询 NOTE 表中的特定项。ID 从 URI 的路径段中获取,并添加到查询条件中。 - // URI_DATA:查询整个 DATA 表。 - // URI_DATA_ITEM:查询 DATA 表中的特定项。ID 的获取和处理方式与 URI_NOTE_ITEM 相同。 - case URI_NOTE: - c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, - sortOrder); - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); - c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); - break; - case URI_DATA: - c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, - sortOrder); - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); - break; - - //URI_SEARCH 和 URI_SEARCH_SUGGEST:处理搜索查询。 - // 代码首先检查是否提供了不应与搜索查询一起使用的参数(如 sortOrder, selection, selectionArgs, 或 projection)。 - // 如果提供了这些参数,则抛出一个 IllegalArgumentException。 - // 根据 URI 类型,从 URI 的路径段或查询参数中获取搜索字符串 searchString。 - // 如果 searchString 为空或无效,则返回 null,表示没有搜索结果。 - case URI_SEARCH: - case URI_SEARCH_SUGGEST: - if (sortOrder != null || projection != null) { - throw new IllegalArgumentException( - "do not specify sortOrder, selection, selectionArgs, or projection" + "with this query"); - } - - String searchString = null; - if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { - if (uri.getPathSegments().size() > 1) { - searchString = uri.getPathSegments().get(1); - } - } else { - searchString = uri.getQueryParameter("pattern"); - } - - if (TextUtils.isEmpty(searchString)) { - return null; - } - - //字符串格式化:格式化后的字符串就会是 "%s%",即包含s是任何文本 - //然后执行原始SQL查询 - try { - searchString = String.format("%%%s%%", searchString); - c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, - new String[] { searchString }); - } catch (IllegalStateException ex) { - Log.e(TAG, "got exception: " + ex.toString()); - } - break; - - //未知URI处理: - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - //如果查询结果不为空(即 Cursor 对象 c 不是 null),则为其设置一个通知 URI。 - //这意味着当与这个 URI 关联的数据发生变化时,任何注册了监听这个 URI 的 ContentObserver 都会被通知。 - if (c != null) { - c.setNotificationUri(getContext().getContentResolver(), uri); - } - return c; - } - - //功能:插入数据 - //参数:Uri 用来标识要插入数据的表,ContentValues对象包含要插入的键值对 - @Override - public Uri insert(Uri uri, ContentValues values) { - //获取数据库 - //三个长整型变量,分别用来存储数据项ID、便签ID 和插入行的ID - SQLiteDatabase db = mHelper.getWritableDatabase(); - long dataId = 0, noteId = 0, insertedId = 0; - - //对于 URI_NOTE,将values插入到 TABLE.NOTE 表中,并返回插入行的 ID。 - //对于 URI_DATA,首先检查values是否包含 DataColumns.NOTE_ID,如果包含,则获取其值。如果不包含,记录一条日志信息。然后,将 values 插入到 TABLE.DATA 表中,并返回插入行的 ID。 - //如果 uri 不是已知的 URI 类型,则抛出一个 IllegalArgumentException。 - switch (mMatcher.match(uri)) { - case URI_NOTE: - insertedId = noteId = db.insert(TABLE.NOTE, null, values); - break; - case URI_DATA: - if (values.containsKey(DataColumns.NOTE_ID)) { - noteId = values.getAsLong(DataColumns.NOTE_ID); - } else { - Log.d(TAG, "Wrong data format without note id:" + values.toString()); - } - insertedId = dataId = db.insert(TABLE.DATA, null, values); - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - - //功能:通知变化 - //如果noteId 或 dataId 大于 0(即成功插入了数据),则使用 ContentResolver 的 notifyChange 方法通知监听这些 URI 的观察者,告知数据已经改变。 - //ContentUris.withAppendedId 方法用于在基本 URI 后面追加一个 ID,形成完整的 URI。 - // Notify the note uri - if (noteId > 0) { - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); - } - - // Notify the data uri - if (dataId > 0) { - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); - } - - //返回包含新插入数据项ID 的 Uri。允许调用者知道新插入的数据项的位置 - return ContentUris.withAppendedId(uri, insertedId); - } - - //功能:删除数据项 - //参数:uri:标识要删除数据的表或数据项。 selection:一个可选的 WHERE 子句,用于指定删除条件。 selectionArgs:一个可选的字符串数组,用于替换 selection 中的占位符 - @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { - //count:记录被删除的行数。 - //id:用于存储从 URI 中解析出的数据项 ID。 - //db:可写的数据库对象,用于执行删除操作。 - //deleteData:一个布尔值,用于标记是否删除了 DATA 表中的数据。 - int count = 0; - String id = null; - SQLiteDatabase db = mHelper.getWritableDatabase(); - boolean deleteData = false; - - switch (mMatcher.match(uri)) { - //URI_NOTE: 修改 selection 语句:确保只删除 ID 大于 0 的笔记。然后执行删除操作并返回被删除的行数。 - //URI_NOTE_ITEM: 从 URI 中解析出 ID。检查 ID 是否小于等于 0,如果是,则不执行删除操作;否则执行删除操作并返回被删除的行数 - //URI_DATA: 执行删除操作并返回被删除的行数。设置 deleteData 为 true,表示删除了 DATA 表中的数据。 - //URI_DATA_ITEM: 先从 URI 中解析出 ID,然后执行删除操作并返回被删除的行数,并设置 deleteData 为 true,表示删除了 DATA 表中的数据。 - case URI_NOTE: - selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; - count = db.delete(TABLE.NOTE, selection, selectionArgs); - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); - /** - * ID that smaller than 0 is system folder which is not allowed to - * trash - */ - long noteId = Long.valueOf(id); - if (noteId <= 0) { - break; - } - count = db.delete(TABLE.NOTE, - NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs); - break; - case URI_DATA: - count = db.delete(TABLE.DATA, selection, selectionArgs); - deleteData = true; - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - count = db.delete(TABLE.DATA, - DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); - deleteData = true; - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - - //如果 count 大于 0,说明有数据被删除。 - //如果 deleteData 为 true,则通知监听 Notes.CONTENT_NOTE_URI 的观察者,数据已改变。 - //通知监听传入 uri 的观察者数据已改变。 - if (count > 0) { - if (deleteData) { - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); - } - getContext().getContentResolver().notifyChange(uri, null); - } - - return count; - } - - //功能:更新数据库的数据 - //参数:uri:标识要更新数据的表或数据项。 values:一个包含新值的键值对集合。 - // selection:一个可选的 WHERE 子句,用于指定更新条件。 selectionArgs:一个可选的字符串数组,用于替换 selection 中的占位符。 - @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - //count:记录被更新的行数。 - //id:用于存储从 URI 中解析出的数据项 ID。 - //db:可写的 SQLite 数据库对象,用于执行更新操作。 - //updateData:用于标记是否更新了 data 表中的数据。 - int count = 0; - String id = null; - SQLiteDatabase db = mHelper.getWritableDatabase(); - boolean updateData = false; - - switch (mMatcher.match(uri)) { - //URI_NOTE:调用 increaseNoteVersion 方法(用于增加便签版本),然后在note表执行更新操作并返回被更新的行数。 - //URI_NOTE_ITEM:从 URI 中解析出 ID,并调用 increaseNoteVersion 方法,传入解析出的 ID,最后在note表执行更新操作并返回被更新的行数。 - //URI_DATA:在data表执行更新操作并返回被更新的行数。设置 updateData 为 true,表示更新了 DATA 表中的数据。 - //URI_DATA_ITEM:从 URI 中解析出 ID。执行更新操作并返回被更新的行数。置 updateData 为 true,表示更新了 DATA 表中的数据。 - case URI_NOTE: - increaseNoteVersion(-1, selection, selectionArgs); - count = db.update(TABLE.NOTE, values, selection, selectionArgs); - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); - increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); - count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); - break; - case URI_DATA: - count = db.update(TABLE.DATA, values, selection, selectionArgs); - updateData = true; - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); - updateData = true; - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - - //如果 count 大于 0,说明有数据被更新。 - //如果 updateData 为 true,则通知监听 Notes.CONTENT_NOTE_URI 的观察者数据已改变。 - //通知监听传入 uri 的观察者数据已改变。 - if (count > 0) { - if (updateData) { - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); - } - getContext().getContentResolver().notifyChange(uri, null); - } - return count; - } - - //解析传入的条件语句:一个 SQL WHERE 子句的一部分 - private String parseSelection(String selection) { - return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); - } - - //更新note表的version列,将其值增加 1。 - private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { - StringBuilder sql = new StringBuilder(120); - sql.append("UPDATE "); - sql.append(TABLE.NOTE); - sql.append(" SET "); - sql.append(NoteColumns.VERSION); - sql.append("=" + NoteColumns.VERSION + "+1 "); - - if (id > 0 || !TextUtils.isEmpty(selection)) { - sql.append(" WHERE "); - } - if (id > 0) { - sql.append(NoteColumns.ID + "=" + String.valueOf(id)); - } - if (!TextUtils.isEmpty(selection)) { - String selectString = id > 0 ? parseSelection(selection) : selection; - for (String args : selectionArgs) { - selectString = selectString.replaceFirst("\\?", args); - } - sql.append(selectString); - } - - mHelper.getWritableDatabase().execSQL(sql.toString()); - } - - @Override - public String getType(Uri uri) { - // TODO Auto-generated method stub - return null; - } - -} \ No newline at end of file diff --git a/src/net/micode/notes/gtask/data/SqlData.java b/src/net/micode/notes/gtask/data/SqlData.java deleted file mode 100644 index d3ec3be..0000000 --- a/src/net/micode/notes/gtask/data/SqlData.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.gtask.data; - -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.NotesDatabaseHelper.TABLE; -import net.micode.notes.gtask.exception.ActionFailureException; - -import org.json.JSONException; -import org.json.JSONObject; - - -public class SqlData { - private static final String TAG = SqlData.class.getSimpleName(); - - private static final int INVALID_ID = -99999; - - public static final String[] PROJECTION_DATA = new String[] { - DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, - DataColumns.DATA3 - }; - - public static final int DATA_ID_COLUMN = 0; - - public static final int DATA_MIME_TYPE_COLUMN = 1; - - public static final int DATA_CONTENT_COLUMN = 2; - - public static final int DATA_CONTENT_DATA_1_COLUMN = 3; - - public static final int DATA_CONTENT_DATA_3_COLUMN = 4; - - private ContentResolver mContentResolver; - - private boolean mIsCreate; - - private long mDataId; - - private String mDataMimeType; - - private String mDataContent; - - private long mDataContentData1; - - private String mDataContentData3; - - private ContentValues mDiffDataValues; - - public SqlData(Context context) { - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mDataId = INVALID_ID; - mDataMimeType = DataConstants.NOTE; - mDataContent = ""; - mDataContentData1 = 0; - mDataContentData3 = ""; - mDiffDataValues = new ContentValues(); - } - - public SqlData(Context context, Cursor c) { - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDiffDataValues = new ContentValues(); - } - - private void loadFromCursor(Cursor c) { - mDataId = c.getLong(DATA_ID_COLUMN); - mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); - mDataContent = c.getString(DATA_CONTENT_COLUMN); - mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); - mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); - } - - public void setContent(JSONObject js) throws JSONException { - long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; - if (mIsCreate || mDataId != dataId) { - mDiffDataValues.put(DataColumns.ID, dataId); - } - mDataId = dataId; - - String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) - : DataConstants.NOTE; - if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { - mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); - } - mDataMimeType = dataMimeType; - - String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; - if (mIsCreate || !mDataContent.equals(dataContent)) { - mDiffDataValues.put(DataColumns.CONTENT, dataContent); - } - mDataContent = dataContent; - - long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; - if (mIsCreate || mDataContentData1 != dataContentData1) { - mDiffDataValues.put(DataColumns.DATA1, dataContentData1); - } - mDataContentData1 = dataContentData1; - - String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; - if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { - mDiffDataValues.put(DataColumns.DATA3, dataContentData3); - } - mDataContentData3 = dataContentData3; - } - - public JSONObject getContent() throws JSONException { - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - JSONObject js = new JSONObject(); - js.put(DataColumns.ID, mDataId); - js.put(DataColumns.MIME_TYPE, mDataMimeType); - js.put(DataColumns.CONTENT, mDataContent); - js.put(DataColumns.DATA1, mDataContentData1); - js.put(DataColumns.DATA3, mDataContentData3); - return js; - } - - public void commit(long noteId, boolean validateVersion, long version) { - - if (mIsCreate) { - if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { - mDiffDataValues.remove(DataColumns.ID); - } - - mDiffDataValues.put(DataColumns.NOTE_ID, noteId); - Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); - try { - mDataId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - } else { - if (mDiffDataValues.size() > 0) { - int result = 0; - if (!validateVersion) { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); - } else { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, - " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { - String.valueOf(noteId), String.valueOf(version) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - } - - mDiffDataValues.clear(); - mIsCreate = false; - } - - public long getId() { - return mDataId; - } -} diff --git a/src/net/micode/notes/gtask/data/SqlNote.java b/src/net/micode/notes/gtask/data/SqlNote.java deleted file mode 100644 index 79a4095..0000000 --- a/src/net/micode/notes/gtask/data/SqlNote.java +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.gtask.data; - -import android.appwidget.AppWidgetManager; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; -import net.micode.notes.tool.ResourceParser; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; - - -public class SqlNote { - private static final String TAG = SqlNote.class.getSimpleName(); - - private static final int INVALID_ID = -99999; - - public static final String[] PROJECTION_NOTE = new String[] { - NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, - NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, - NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, - NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, - NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, - NoteColumns.VERSION - }; - - public static final int ID_COLUMN = 0; - - public static final int ALERTED_DATE_COLUMN = 1; - - public static final int BG_COLOR_ID_COLUMN = 2; - - public static final int CREATED_DATE_COLUMN = 3; - - public static final int HAS_ATTACHMENT_COLUMN = 4; - - public static final int MODIFIED_DATE_COLUMN = 5; - - public static final int NOTES_COUNT_COLUMN = 6; - - public static final int PARENT_ID_COLUMN = 7; - - public static final int SNIPPET_COLUMN = 8; - - public static final int TYPE_COLUMN = 9; - - public static final int WIDGET_ID_COLUMN = 10; - - public static final int WIDGET_TYPE_COLUMN = 11; - - public static final int SYNC_ID_COLUMN = 12; - - public static final int LOCAL_MODIFIED_COLUMN = 13; - - public static final int ORIGIN_PARENT_ID_COLUMN = 14; - - public static final int GTASK_ID_COLUMN = 15; - - public static final int VERSION_COLUMN = 16; - - private Context mContext; - - private ContentResolver mContentResolver; - - private boolean mIsCreate; - - private long mId; - - private long mAlertDate; - - private int mBgColorId; - - private long mCreatedDate; - - private int mHasAttachment; - - private long mModifiedDate; - - private long mParentId; - - private String mSnippet; - - private int mType; - - private int mWidgetId; - - private int mWidgetType; - - private long mOriginParent; - - private long mVersion; - - private ContentValues mDiffNoteValues; - - private ArrayList mDataList; - - public SqlNote(Context context) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mId = INVALID_ID; - mAlertDate = 0; - mBgColorId = ResourceParser.getDefaultBgId(context); - mCreatedDate = System.currentTimeMillis(); - mHasAttachment = 0; - mModifiedDate = System.currentTimeMillis(); - mParentId = 0; - mSnippet = ""; - mType = Notes.TYPE_NOTE; - mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; - mOriginParent = 0; - mVersion = 0; - mDiffNoteValues = new ContentValues(); - mDataList = new ArrayList(); - } - - public SqlNote(Context context, Cursor c) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDataList = new ArrayList(); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - } - - public SqlNote(Context context, long id) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(id); - mDataList = new ArrayList(); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - - } - - private void loadFromCursor(long id) { - Cursor c = null; - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", - new String[] { - String.valueOf(id) - }, null); - if (c != null) { - c.moveToNext(); - loadFromCursor(c); - } else { - Log.w(TAG, "loadFromCursor: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - private void loadFromCursor(Cursor c) { - mId = c.getLong(ID_COLUMN); - mAlertDate = c.getLong(ALERTED_DATE_COLUMN); - mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); - mCreatedDate = c.getLong(CREATED_DATE_COLUMN); - mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); - mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); - mParentId = c.getLong(PARENT_ID_COLUMN); - mSnippet = c.getString(SNIPPET_COLUMN); - mType = c.getInt(TYPE_COLUMN); - mWidgetId = c.getInt(WIDGET_ID_COLUMN); - mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); - mVersion = c.getLong(VERSION_COLUMN); - } - - private void loadDataContent() { - Cursor c = null; - mDataList.clear(); - try { - c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, - "(note_id=?)", new String[] { - String.valueOf(mId) - }, null); - if (c != null) { - if (c.getCount() == 0) { - Log.w(TAG, "it seems that the note has not data"); - return; - } - while (c.moveToNext()) { - SqlData data = new SqlData(mContext, c); - mDataList.add(data); - } - } else { - Log.w(TAG, "loadDataContent: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - public boolean setContent(JSONObject js) { - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - Log.w(TAG, "cannot set system folder"); - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - // for folder we can only update the snnipet and type - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; - if (mIsCreate || mId != id) { - mDiffNoteValues.put(NoteColumns.ID, id); - } - mId = id; - - long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note - .getLong(NoteColumns.ALERTED_DATE) : 0; - if (mIsCreate || mAlertDate != alertDate) { - mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); - } - mAlertDate = alertDate; - - int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note - .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); - if (mIsCreate || mBgColorId != bgColorId) { - mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); - } - mBgColorId = bgColorId; - - long createDate = note.has(NoteColumns.CREATED_DATE) ? note - .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mCreatedDate != createDate) { - mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); - } - mCreatedDate = createDate; - - int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note - .getInt(NoteColumns.HAS_ATTACHMENT) : 0; - if (mIsCreate || mHasAttachment != hasAttachment) { - mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); - } - mHasAttachment = hasAttachment; - - long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note - .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mModifiedDate != modifiedDate) { - mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); - } - mModifiedDate = modifiedDate; - - long parentId = note.has(NoteColumns.PARENT_ID) ? note - .getLong(NoteColumns.PARENT_ID) : 0; - if (mIsCreate || mParentId != parentId) { - mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); - } - mParentId = parentId; - - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - - int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) - : AppWidgetManager.INVALID_APPWIDGET_ID; - if (mIsCreate || mWidgetId != widgetId) { - mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); - } - mWidgetId = widgetId; - - int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note - .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; - if (mIsCreate || mWidgetType != widgetType) { - mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); - } - mWidgetType = widgetType; - - long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note - .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; - if (mIsCreate || mOriginParent != originParent) { - mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); - } - mOriginParent = originParent; - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - SqlData sqlData = null; - if (data.has(DataColumns.ID)) { - long dataId = data.getLong(DataColumns.ID); - for (SqlData temp : mDataList) { - if (dataId == temp.getId()) { - sqlData = temp; - } - } - } - - if (sqlData == null) { - sqlData = new SqlData(mContext); - mDataList.add(sqlData); - } - - sqlData.setContent(data); - } - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return false; - } - return true; - } - - public JSONObject getContent() { - try { - JSONObject js = new JSONObject(); - - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - - JSONObject note = new JSONObject(); - if (mType == Notes.TYPE_NOTE) { - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.ALERTED_DATE, mAlertDate); - note.put(NoteColumns.BG_COLOR_ID, mBgColorId); - note.put(NoteColumns.CREATED_DATE, mCreatedDate); - note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); - note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); - note.put(NoteColumns.PARENT_ID, mParentId); - note.put(NoteColumns.SNIPPET, mSnippet); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.WIDGET_ID, mWidgetId); - note.put(NoteColumns.WIDGET_TYPE, mWidgetType); - note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - - JSONArray dataArray = new JSONArray(); - for (SqlData sqlData : mDataList) { - JSONObject data = sqlData.getContent(); - if (data != null) { - dataArray.put(data); - } - } - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.SNIPPET, mSnippet); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - } - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - return null; - } - - public void setParentId(long id) { - mParentId = id; - mDiffNoteValues.put(NoteColumns.PARENT_ID, id); - } - - public void setGtaskId(String gid) { - mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); - } - - public void setSyncId(long syncId) { - mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); - } - - public void resetLocalModified() { - mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); - } - - public long getId() { - return mId; - } - - public long getParentId() { - return mParentId; - } - - public String getSnippet() { - return mSnippet; - } - - public boolean isNoteType() { - return mType == Notes.TYPE_NOTE; - } - - public void commit(boolean validateVersion) { - if (mIsCreate) { - if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { - mDiffNoteValues.remove(NoteColumns.ID); - } - - Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); - try { - mId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - if (mId == 0) { - throw new IllegalStateException("Create thread id failed"); - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) { - sqlData.commit(mId, false, -1); - } - } - } else { - if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { - Log.e(TAG, "No such note"); - throw new IllegalStateException("Try to update note with invalid id"); - } - if (mDiffNoteValues.size() > 0) { - mVersion ++; - int result = 0; - if (!validateVersion) { - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?)", new String[] { - String.valueOf(mId) - }); - } else { - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", - new String[] { - String.valueOf(mId), String.valueOf(mVersion) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) { - sqlData.commit(mId, validateVersion, mVersion); - } - } - } - - // refresh local info - loadFromCursor(mId); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - - mDiffNoteValues.clear(); - mIsCreate = false; - } -} diff --git a/src/net/micode/notes/gtask/data/Task.java b/src/net/micode/notes/gtask/data/Task.java deleted file mode 100644 index 6a19454..0000000 --- a/src/net/micode/notes/gtask/data/Task.java +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.gtask.data; - -import android.database.Cursor; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - - -public class Task extends Node { - private static final String TAG = Task.class.getSimpleName(); - - private boolean mCompleted; - - private String mNotes; - - private JSONObject mMetaInfo; - - private Task mPriorSibling; - - private TaskList mParent; - - public Task() { - super(); - mCompleted = false; - mNotes = null; - mPriorSibling = null; - mParent = null; - mMetaInfo = null; - } - - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_TASK); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - // parent_id - js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); - - // dest_parent_type - js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - - // list_id - js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); - - // prior_sibling_id - if (mPriorSibling != null) { - js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-create jsonobject"); - } - - return js; - } - - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - // notes - if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { - setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); - } - - // deleted - if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { - setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); - } - - // completed - if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { - setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get task content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) - || !js.has(GTaskStringUtils.META_HEAD_DATA)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { - Log.e(TAG, "invalid type"); - return; - } - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - setName(data.getString(DataColumns.CONTENT)); - break; - } - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - String name = getName(); - try { - if (mMetaInfo == null) { - // new task created from web - if (name == null) { - Log.w(TAG, "the note seems to be an empty one"); - return null; - } - - JSONObject js = new JSONObject(); - JSONObject note = new JSONObject(); - JSONArray dataArray = new JSONArray(); - JSONObject data = new JSONObject(); - data.put(DataColumns.CONTENT, name); - dataArray.put(data); - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - return js; - } else { - // synced task - JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - data.put(DataColumns.CONTENT, getName()); - break; - } - } - - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - return mMetaInfo; - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public void setMetaInfo(MetaData metaData) { - if (metaData != null && metaData.getNotes() != null) { - try { - mMetaInfo = new JSONObject(metaData.getNotes()); - } catch (JSONException e) { - Log.w(TAG, e.toString()); - mMetaInfo = null; - } - } - } - - public int getSyncAction(Cursor c) { - try { - JSONObject noteInfo = null; - if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { - noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - } - - if (noteInfo == null) { - Log.w(TAG, "it seems that note meta has been deleted"); - return SYNC_ACTION_UPDATE_REMOTE; - } - - if (!noteInfo.has(NoteColumns.ID)) { - Log.w(TAG, "remote note id seems to be deleted"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - // validate the note id now - if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { - Log.w(TAG, "note id doesn't match"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - return SYNC_ACTION_UPDATE_CONFLICT; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - public boolean isWorthSaving() { - return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) - || (getNotes() != null && getNotes().trim().length() > 0); - } - - public void setCompleted(boolean completed) { - this.mCompleted = completed; - } - - public void setNotes(String notes) { - this.mNotes = notes; - } - - public void setPriorSibling(Task priorSibling) { - this.mPriorSibling = priorSibling; - } - - public void setParent(TaskList parent) { - this.mParent = parent; - } - - public boolean getCompleted() { - return this.mCompleted; - } - - public String getNotes() { - return this.mNotes; - } - - public Task getPriorSibling() { - return this.mPriorSibling; - } - - public TaskList getParent() { - return this.mParent; - } - -} diff --git a/src/net/micode/notes/gtask/data/TaskList.java b/src/net/micode/notes/gtask/data/TaskList.java deleted file mode 100644 index 4ea21c5..0000000 --- a/src/net/micode/notes/gtask/data/TaskList.java +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.gtask.data; - -import android.database.Cursor; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; - - -public class TaskList extends Node { - private static final String TAG = TaskList.class.getSimpleName(); - - private int mIndex; - - private ArrayList mChildren; - - public TaskList() { - super(); - mChildren = new ArrayList(); - mIndex = 1; - } - - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-create jsonobject"); - } - - return js; - } - - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get tasklist content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - - if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - String name = folder.getString(NoteColumns.SNIPPET); - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); - } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); - else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_CALL_NOTE); - else - Log.e(TAG, "invalid system folder"); - } else { - Log.e(TAG, "error type"); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - try { - JSONObject js = new JSONObject(); - JSONObject folder = new JSONObject(); - - String folderName = getName(); - if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) - folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), - folderName.length()); - folder.put(NoteColumns.SNIPPET, folderName); - if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) - || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) - folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - else - folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - - js.put(GTaskStringUtils.META_HEAD_NOTE, folder); - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public int getSyncAction(Cursor c) { - try { - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - // for folder conflicts, just apply local modification - return SYNC_ACTION_UPDATE_REMOTE; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - public int getChildTaskCount() { - return mChildren.size(); - } - - public boolean addChildTask(Task task) { - boolean ret = false; - if (task != null && !mChildren.contains(task)) { - ret = mChildren.add(task); - if (ret) { - // need to set prior sibling and parent - task.setPriorSibling(mChildren.isEmpty() ? null : mChildren - .get(mChildren.size() - 1)); - task.setParent(this); - } - } - return ret; - } - - public boolean addChildTask(Task task, int index) { - if (index < 0 || index > mChildren.size()) { - Log.e(TAG, "add child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (task != null && pos == -1) { - mChildren.add(index, task); - - // update the task list - Task preTask = null; - Task afterTask = null; - if (index != 0) - preTask = mChildren.get(index - 1); - if (index != mChildren.size() - 1) - afterTask = mChildren.get(index + 1); - - task.setPriorSibling(preTask); - if (afterTask != null) - afterTask.setPriorSibling(task); - } - - return true; - } - - public boolean removeChildTask(Task task) { - boolean ret = false; - int index = mChildren.indexOf(task); - if (index != -1) { - ret = mChildren.remove(task); - - if (ret) { - // reset prior sibling and parent - task.setPriorSibling(null); - task.setParent(null); - - // update the task list - if (index != mChildren.size()) { - mChildren.get(index).setPriorSibling( - index == 0 ? null : mChildren.get(index - 1)); - } - } - } - return ret; - } - - public boolean moveChildTask(Task task, int index) { - - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "move child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (pos == -1) { - Log.e(TAG, "move child task: the task should in the list"); - return false; - } - - if (pos == index) - return true; - return (removeChildTask(task) && addChildTask(task, index)); - } - - public Task findChildTaskByGid(String gid) { - for (int i = 0; i < mChildren.size(); i++) { - Task t = mChildren.get(i); - if (t.getGid().equals(gid)) { - return t; - } - } - return null; - } - - public int getChildTaskIndex(Task task) { - return mChildren.indexOf(task); - } - - public Task getChildTaskByIndex(int index) { - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "getTaskByIndex: invalid index"); - return null; - } - return mChildren.get(index); - } - - public Task getChilTaskByGid(String gid) { - for (Task task : mChildren) { - if (task.getGid().equals(gid)) - return task; - } - return null; - } - - public ArrayList getChildTaskList() { - return this.mChildren; - } - - public void setIndex(int index) { - this.mIndex = index; - } - - public int getIndex() { - return this.mIndex; - } -} diff --git a/src/net/micode/notes/gtask/exception/ActionFailureException.java b/src/net/micode/notes/gtask/exception/ActionFailureException.java deleted file mode 100644 index 15504be..0000000 --- a/src/net/micode/notes/gtask/exception/ActionFailureException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.gtask.exception; - -public class ActionFailureException extends RuntimeException { - private static final long serialVersionUID = 4425249765923293627L; - - public ActionFailureException() { - super(); - } - - public ActionFailureException(String paramString) { - super(paramString); - } - - public ActionFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} diff --git a/src/net/micode/notes/gtask/exception/NetworkFailureException.java b/src/net/micode/notes/gtask/exception/NetworkFailureException.java deleted file mode 100644 index b08cfb1..0000000 --- a/src/net/micode/notes/gtask/exception/NetworkFailureException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.gtask.exception; - -public class NetworkFailureException extends Exception { - private static final long serialVersionUID = 2107610287180234136L; - - public NetworkFailureException() { - super(); - } - - public NetworkFailureException(String paramString) { - super(paramString); - } - - public NetworkFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} diff --git a/src/net/micode/notes/model/Note.java b/src/net/micode/notes/model/Note.java deleted file mode 100644 index 6706cf6..0000000 --- a/src/net/micode/notes/model/Note.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.model; -import android.content.ContentProviderOperation; -import android.content.ContentProviderResult; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.content.OperationApplicationException; -import android.net.Uri; -import android.os.RemoteException; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.CallNote; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.Notes.TextNote; - -import java.util.ArrayList; - - -public class Note { - private ContentValues mNoteDiffValues; - private NoteData mNoteData; - private static final String TAG = "Note"; - /** - * Create a new note id for adding a new note to databases - */ - public static synchronized long getNewNoteId(Context context, long folderId) { - // Create a new note in the database - ContentValues values = new ContentValues(); - long createdTime = System.currentTimeMillis(); - values.put(NoteColumns.CREATED_DATE, createdTime); - values.put(NoteColumns.MODIFIED_DATE, createdTime); - values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - values.put(NoteColumns.PARENT_ID, folderId); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); - - long noteId = 0; - try { - noteId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - noteId = 0; - } - if (noteId == -1) { - throw new IllegalStateException("Wrong note id:" + noteId); - } - return noteId; - } - - public Note() { - mNoteDiffValues = new ContentValues(); - mNoteData = new NoteData(); - } - - public void setNoteValue(String key, String value) { - mNoteDiffValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - - public void setTextData(String key, String value) { - mNoteData.setTextData(key, value); - } - - public void setTextDataId(long id) { - mNoteData.setTextDataId(id); - } - - public long getTextDataId() { - return mNoteData.mTextDataId; - } - - public void setCallDataId(long id) { - mNoteData.setCallDataId(id); - } - - public void setCallData(String key, String value) { - mNoteData.setCallData(key, value); - } - - public boolean isLocalModified() { - return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); - } - - public boolean syncNote(Context context, long noteId) { - if (noteId <= 0) { - throw new IllegalArgumentException("Wrong note id:" + noteId); - } - - if (!isLocalModified()) { - return true; - } - - /** - * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and - * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the - * note data info - */ - if (context.getContentResolver().update( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, - null) == 0) { - Log.e(TAG, "Update note error, should not happen"); - // Do not return, fall through - } - mNoteDiffValues.clear(); - - if (mNoteData.isLocalModified() - && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { - return false; - } - - return true; - } - - private class NoteData { - private long mTextDataId; - - private ContentValues mTextDataValues; - - private long mCallDataId; - - private ContentValues mCallDataValues; - - private static final String TAG = "NoteData"; - - public NoteData() { - mTextDataValues = new ContentValues(); - mCallDataValues = new ContentValues(); - mTextDataId = 0; - mCallDataId = 0; - } - - boolean isLocalModified() { - return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; - } - - void setTextDataId(long id) { - if(id <= 0) { - throw new IllegalArgumentException("Text data id should larger than 0"); - } - mTextDataId = id; - } - - void setCallDataId(long id) { - if (id <= 0) { - throw new IllegalArgumentException("Call data id should larger than 0"); - } - mCallDataId = id; - } - - void setCallData(String key, String value) { - mCallDataValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - - void setTextData(String key, String value) { - mTextDataValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - - Uri pushIntoContentResolver(Context context, long noteId) { - /** - * Check for safety - */ - if (noteId <= 0) { - throw new IllegalArgumentException("Wrong note id:" + noteId); - } - - ArrayList operationList = new ArrayList(); - ContentProviderOperation.Builder builder = null; - - if(mTextDataValues.size() > 0) { - mTextDataValues.put(DataColumns.NOTE_ID, noteId); - if (mTextDataId == 0) { - mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mTextDataValues); - try { - setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); - } catch (NumberFormatException e) { - Log.e(TAG, "Insert new text data fail with noteId" + noteId); - mTextDataValues.clear(); - return null; - } - } else { - builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mTextDataId)); - builder.withValues(mTextDataValues); - operationList.add(builder.build()); - } - mTextDataValues.clear(); - } - - if(mCallDataValues.size() > 0) { - mCallDataValues.put(DataColumns.NOTE_ID, noteId); - if (mCallDataId == 0) { - mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mCallDataValues); - try { - setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); - } catch (NumberFormatException e) { - Log.e(TAG, "Insert new call data fail with noteId" + noteId); - mCallDataValues.clear(); - return null; - } - } else { - builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mCallDataId)); - builder.withValues(mCallDataValues); - operationList.add(builder.build()); - } - mCallDataValues.clear(); - } - - if (operationList.size() > 0) { - try { - ContentProviderResult[] results = context.getContentResolver().applyBatch( - Notes.AUTHORITY, operationList); - return (results == null || results.length == 0 || results[0] == null) ? null - : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - return null; - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - return null; - } - } - return null; - } - } -} diff --git a/src/net/micode/notes/model/WorkingNote.java b/src/net/micode/notes/model/WorkingNote.java deleted file mode 100644 index be081e4..0000000 --- a/src/net/micode/notes/model/WorkingNote.java +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.model; - -import android.appwidget.AppWidgetManager; -import android.content.ContentUris; -import android.content.Context; -import android.database.Cursor; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.CallNote; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.Notes.TextNote; -import net.micode.notes.tool.ResourceParser.NoteBgResources; - - -public class WorkingNote { - // Note for the working note - private Note mNote; - // Note Id - private long mNoteId; - // Note content - private String mContent; - // Note mode - private int mMode; - - private long mAlertDate; - - private long mModifiedDate; - - private int mBgColorId; - - private int mWidgetId; - - private int mWidgetType; - - private long mFolderId; - - private Context mContext; - - private static final String TAG = "WorkingNote"; - - private boolean mIsDeleted; - - private NoteSettingChangedListener mNoteSettingStatusListener; - - public static final String[] DATA_PROJECTION = new String[] { - DataColumns.ID, - DataColumns.CONTENT, - DataColumns.MIME_TYPE, - DataColumns.DATA1, - DataColumns.DATA2, - DataColumns.DATA3, - DataColumns.DATA4, - }; - - public static final String[] NOTE_PROJECTION = new String[] { - NoteColumns.PARENT_ID, - NoteColumns.ALERTED_DATE, - NoteColumns.BG_COLOR_ID, - NoteColumns.WIDGET_ID, - NoteColumns.WIDGET_TYPE, - NoteColumns.MODIFIED_DATE - }; - - private static final int DATA_ID_COLUMN = 0; - - private static final int DATA_CONTENT_COLUMN = 1; - - private static final int DATA_MIME_TYPE_COLUMN = 2; - - private static final int DATA_MODE_COLUMN = 3; - - private static final int NOTE_PARENT_ID_COLUMN = 0; - - private static final int NOTE_ALERTED_DATE_COLUMN = 1; - - private static final int NOTE_BG_COLOR_ID_COLUMN = 2; - - private static final int NOTE_WIDGET_ID_COLUMN = 3; - - private static final int NOTE_WIDGET_TYPE_COLUMN = 4; - - private static final int NOTE_MODIFIED_DATE_COLUMN = 5; - - // New note construct - private WorkingNote(Context context, long folderId) { - mContext = context; - mAlertDate = 0; - mModifiedDate = System.currentTimeMillis(); - mFolderId = folderId; - mNote = new Note(); - mNoteId = 0; - mIsDeleted = false; - mMode = 0; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; - } - - // Existing note construct - private WorkingNote(Context context, long noteId, long folderId) { - mContext = context; - mNoteId = noteId; - mFolderId = folderId; - mIsDeleted = false; - mNote = new Note(); - loadNote(); - } - - private void loadNote() { - Cursor cursor = mContext.getContentResolver().query( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, - null, null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); - mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); - mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); - mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); - mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); - mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); - } - cursor.close(); - } else { - Log.e(TAG, "No note with id:" + mNoteId); - throw new IllegalArgumentException("Unable to find note with id " + mNoteId); - } - loadNoteData(); - } - - private void loadNoteData() { - Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, - DataColumns.NOTE_ID + "=?", new String[] { - String.valueOf(mNoteId) - }, null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - do { - String type = cursor.getString(DATA_MIME_TYPE_COLUMN); - if (DataConstants.NOTE.equals(type)) { - mContent = cursor.getString(DATA_CONTENT_COLUMN); - mMode = cursor.getInt(DATA_MODE_COLUMN); - mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); - } else if (DataConstants.CALL_NOTE.equals(type)) { - mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); - } else { - Log.d(TAG, "Wrong note type with type:" + type); - } - } while (cursor.moveToNext()); - } - cursor.close(); - } else { - Log.e(TAG, "No data with id:" + mNoteId); - throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); - } - } - - public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, - int widgetType, int defaultBgColorId) { - WorkingNote note = new WorkingNote(context, folderId); - note.setBgColorId(defaultBgColorId); - note.setWidgetId(widgetId); - note.setWidgetType(widgetType); - return note; - } - - public static WorkingNote load(Context context, long id) { - return new WorkingNote(context, id, 0); - } - - public synchronized boolean saveNote() { - if (isWorthSaving()) { - if (!existInDatabase()) { - if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { - Log.e(TAG, "Create new note fail with id:" + mNoteId); - return false; - } - } - - mNote.syncNote(mContext, mNoteId); - - /** - * Update widget content if there exist any widget of this note - */ - if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && mWidgetType != Notes.TYPE_WIDGET_INVALIDE - && mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onWidgetChanged(); - } - return true; - } else { - return false; - } - } - - public boolean existInDatabase() { - return mNoteId > 0; - } - - private boolean isWorthSaving() { - if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) - || (existInDatabase() && !mNote.isLocalModified())) { - return false; - } else { - return true; - } - } - - public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { - mNoteSettingStatusListener = l; - } - - public void setAlertDate(long date, boolean set) { - if (date != mAlertDate) { - mAlertDate = date; - mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); - } - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onClockAlertChanged(date, set); - } - } - - public void markDeleted(boolean mark) { - mIsDeleted = mark; - if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onWidgetChanged(); - } - } - - public void setBgColorId(int id) { - if (id != mBgColorId) { - mBgColorId = id; - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onBackgroundColorChanged(); - } - mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); - } - } - - public void setCheckListMode(int mode) { - if (mMode != mode) { - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); - } - mMode = mode; - mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); - } - } - - public void setWidgetType(int type) { - if (type != mWidgetType) { - mWidgetType = type; - mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); - } - } - - public void setWidgetId(int id) { - if (id != mWidgetId) { - mWidgetId = id; - mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); - } - } - - public void setWorkingText(String text) { - if (!TextUtils.equals(mContent, text)) { - mContent = text; - mNote.setTextData(DataColumns.CONTENT, mContent); - } - } - - public void convertToCallNote(String phoneNumber, long callDate) { - mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); - mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); - mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); - } - - public boolean hasClockAlert() { - return (mAlertDate > 0 ? true : false); - } - - public String getContent() { - return mContent; - } - - public long getAlertDate() { - return mAlertDate; - } - - public long getModifiedDate() { - return mModifiedDate; - } - - public int getBgColorResId() { - return NoteBgResources.getNoteBgResource(mBgColorId); - } - - public int getBgColorId() { - return mBgColorId; - } - - public int getTitleBgResId() { - return NoteBgResources.getNoteTitleBgResource(mBgColorId); - } - - public int getCheckListMode() { - return mMode; - } - - public long getNoteId() { - return mNoteId; - } - - public long getFolderId() { - return mFolderId; - } - - public int getWidgetId() { - return mWidgetId; - } - - public int getWidgetType() { - return mWidgetType; - } - - public interface NoteSettingChangedListener { - /** - * Called when the background color of current note has just changed - */ - void onBackgroundColorChanged(); - - /** - * Called when user set clock - */ - void onClockAlertChanged(long date, boolean set); - - /** - * Call when user create note from widget - */ - void onWidgetChanged(); - - /** - * Call when switch between check list mode and normal mode - * @param oldMode is previous mode before change - * @param newMode is new mode - */ - void onCheckListModeChanged(int oldMode, int newMode); - } -} diff --git a/src/net/micode/notes/tool/BackupUtils.java b/src/net/micode/notes/tool/BackupUtils.java deleted file mode 100644 index 39f6ec4..0000000 --- a/src/net/micode/notes/tool/BackupUtils.java +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.tool; - -import android.content.Context; -import android.database.Cursor; -import android.os.Environment; -import android.text.TextUtils; -import android.text.format.DateFormat; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; - - -public class BackupUtils { - private static final String TAG = "BackupUtils"; - // Singleton stuff - private static BackupUtils sInstance; - - public static synchronized BackupUtils getInstance(Context context) { - if (sInstance == null) { - sInstance = new BackupUtils(context); - } - return sInstance; - } - - /** - * Following states are signs to represents backup or restore - * status - */ - // Currently, the sdcard is not mounted - public static final int STATE_SD_CARD_UNMOUONTED = 0; - // The backup file not exist - public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; - // The data is not well formated, may be changed by other programs - public static final int STATE_DATA_DESTROIED = 2; - // Some run-time exception which causes restore or backup fails - public static final int STATE_SYSTEM_ERROR = 3; - // Backup or restore success - public static final int STATE_SUCCESS = 4; - - private TextExport mTextExport; - - private BackupUtils(Context context) { - mTextExport = new TextExport(context); - } - - private static boolean externalStorageAvailable() { - return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); - } - - public int exportToText() { - return mTextExport.exportToText(); - } - - public String getExportedTextFileName() { - return mTextExport.mFileName; - } - - public String getExportedTextFileDir() { - return mTextExport.mFileDirectory; - } - - private static class TextExport { - private static final String[] NOTE_PROJECTION = { - NoteColumns.ID, - NoteColumns.MODIFIED_DATE, - NoteColumns.SNIPPET, - NoteColumns.TYPE - }; - - private static final int NOTE_COLUMN_ID = 0; - - private static final int NOTE_COLUMN_MODIFIED_DATE = 1; - - private static final int NOTE_COLUMN_SNIPPET = 2; - - private static final String[] DATA_PROJECTION = { - DataColumns.CONTENT, - DataColumns.MIME_TYPE, - DataColumns.DATA1, - DataColumns.DATA2, - DataColumns.DATA3, - DataColumns.DATA4, - }; - - private static final int DATA_COLUMN_CONTENT = 0; - - private static final int DATA_COLUMN_MIME_TYPE = 1; - - private static final int DATA_COLUMN_CALL_DATE = 2; - - private static final int DATA_COLUMN_PHONE_NUMBER = 4; - - private final String [] TEXT_FORMAT; - private static final int FORMAT_FOLDER_NAME = 0; - private static final int FORMAT_NOTE_DATE = 1; - private static final int FORMAT_NOTE_CONTENT = 2; - - private Context mContext; - private String mFileName; - private String mFileDirectory; - - public TextExport(Context context) { - TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); - mContext = context; - mFileName = ""; - mFileDirectory = ""; - } - - private String getFormat(int id) { - return TEXT_FORMAT[id]; - } - - /** - * Export the folder identified by folder id to text - */ - private void exportFolderToText(String folderId, PrintStream ps) { - // Query notes belong to this folder - Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { - folderId - }, null); - - if (notesCursor != null) { - if (notesCursor.moveToFirst()) { - do { - // Print note's last modified date - ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( - mContext.getString(R.string.format_datetime_mdhm), - notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); - // Query data belong to this note - String noteId = notesCursor.getString(NOTE_COLUMN_ID); - exportNoteToText(noteId, ps); - } while (notesCursor.moveToNext()); - } - notesCursor.close(); - } - } - - /** - * Export note identified by id to a print stream - */ - private void exportNoteToText(String noteId, PrintStream ps) { - Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, - DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { - noteId - }, null); - - if (dataCursor != null) { - if (dataCursor.moveToFirst()) { - do { - String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); - if (DataConstants.CALL_NOTE.equals(mimeType)) { - // Print phone number - String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER); - long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); - String location = dataCursor.getString(DATA_COLUMN_CONTENT); - - if (!TextUtils.isEmpty(phoneNumber)) { - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), - phoneNumber)); - } - // Print call date - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat - .format(mContext.getString(R.string.format_datetime_mdhm), - callDate))); - // Print call attachment location - if (!TextUtils.isEmpty(location)) { - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), - location)); - } - } else if (DataConstants.NOTE.equals(mimeType)) { - String content = dataCursor.getString(DATA_COLUMN_CONTENT); - if (!TextUtils.isEmpty(content)) { - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), - content)); - } - } - } while (dataCursor.moveToNext()); - } - dataCursor.close(); - } - // print a line separator between note - try { - ps.write(new byte[] { - Character.LINE_SEPARATOR, Character.LETTER_NUMBER - }); - } catch (IOException e) { - Log.e(TAG, e.toString()); - } - } - - /** - * Note will be exported as text which is user readable - */ - public int exportToText() { - if (!externalStorageAvailable()) { - Log.d(TAG, "Media was not mounted"); - return STATE_SD_CARD_UNMOUONTED; - } - - PrintStream ps = getExportToTextPrintStream(); - if (ps == null) { - Log.e(TAG, "get print stream error"); - return STATE_SYSTEM_ERROR; - } - // First export folder and its notes - Cursor folderCursor = mContext.getContentResolver().query( - Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, - "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " - + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR " - + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null); - - if (folderCursor != null) { - if (folderCursor.moveToFirst()) { - do { - // Print folder's name - String folderName = ""; - if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) { - folderName = mContext.getString(R.string.call_record_folder_name); - } else { - folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET); - } - if (!TextUtils.isEmpty(folderName)) { - ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName)); - } - String folderId = folderCursor.getString(NOTE_COLUMN_ID); - exportFolderToText(folderId, ps); - } while (folderCursor.moveToNext()); - } - folderCursor.close(); - } - - // Export notes in root's folder - Cursor noteCursor = mContext.getContentResolver().query( - Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, - NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID - + "=0", null, null); - - if (noteCursor != null) { - if (noteCursor.moveToFirst()) { - do { - ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( - mContext.getString(R.string.format_datetime_mdhm), - noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); - // Query data belong to this note - String noteId = noteCursor.getString(NOTE_COLUMN_ID); - exportNoteToText(noteId, ps); - } while (noteCursor.moveToNext()); - } - noteCursor.close(); - } - ps.close(); - - return STATE_SUCCESS; - } - - /** - * Get a print stream pointed to the file {@generateExportedTextFile} - */ - private PrintStream getExportToTextPrintStream() { - File file = generateFileMountedOnSDcard(mContext, R.string.file_path, - R.string.file_name_txt_format); - if (file == null) { - Log.e(TAG, "create file to exported failed"); - return null; - } - mFileName = file.getName(); - mFileDirectory = mContext.getString(R.string.file_path); - PrintStream ps = null; - try { - FileOutputStream fos = new FileOutputStream(file); - ps = new PrintStream(fos); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return null; - } catch (NullPointerException e) { - e.printStackTrace(); - return null; - } - return ps; - } - } - - /** - * Generate the text file to store imported data - */ - private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { - StringBuilder sb = new StringBuilder(); - sb.append(Environment.getExternalStorageDirectory()); - sb.append(context.getString(filePathResId)); - File filedir = new File(sb.toString()); - sb.append(context.getString( - fileNameFormatResId, - DateFormat.format(context.getString(R.string.format_date_ymd), - System.currentTimeMillis()))); - File file = new File(sb.toString()); - - try { - if (!filedir.exists()) { - filedir.mkdir(); - } - if (!file.exists()) { - file.createNewFile(); - } - return file; - } catch (SecurityException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; - } -} - - diff --git a/src/net/micode/notes/tool/DataUtils.java b/src/net/micode/notes/tool/DataUtils.java deleted file mode 100644 index 2a14982..0000000 --- a/src/net/micode/notes/tool/DataUtils.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.tool; - -import android.content.ContentProviderOperation; -import android.content.ContentProviderResult; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.OperationApplicationException; -import android.database.Cursor; -import android.os.RemoteException; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.CallNote; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; - -import java.util.ArrayList; -import java.util.HashSet; - - -public class DataUtils { - public static final String TAG = "DataUtils"; - public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - if (ids.size() == 0) { - Log.d(TAG, "no id is in the hashset"); - return true; - } - - ArrayList operationList = new ArrayList(); - for (long id : ids) { - if(id == Notes.ID_ROOT_FOLDER) { - Log.e(TAG, "Don't delete system folder root"); - continue; - } - ContentProviderOperation.Builder builder = ContentProviderOperation - .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); - operationList.add(builder.build()); - } - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.PARENT_ID, desFolderId); - values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); - } - - public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, - long folderId) { - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - - ArrayList operationList = new ArrayList(); - for (long id : ids) { - ContentProviderOperation.Builder builder = ContentProviderOperation - .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); - builder.withValue(NoteColumns.PARENT_ID, folderId); - builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); - operationList.add(builder.build()); - } - - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - /** - * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} - */ - public static int getUserFolderCount(ContentResolver resolver) { - Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { "COUNT(*)" }, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", - new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, - null); - - int count = 0; - if(cursor != null) { - if(cursor.moveToFirst()) { - try { - count = cursor.getInt(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "get folder count failed:" + e.toString()); - } finally { - cursor.close(); - } - } - } - return count; - } - - public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), - null, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, - new String [] {String.valueOf(type)}, - null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, - NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + - " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + - " AND " + NoteColumns.SNIPPET + "=?", - new String[] { name }, null); - boolean exist = false; - if(cursor != null) { - if(cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { - Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, - NoteColumns.PARENT_ID + "=?", - new String[] { String.valueOf(folderId) }, - null); - - HashSet set = null; - if (c != null) { - if (c.moveToFirst()) { - set = new HashSet(); - do { - try { - AppWidgetAttribute widget = new AppWidgetAttribute(); - widget.widgetId = c.getInt(0); - widget.widgetType = c.getInt(1); - set.add(widget); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, e.toString()); - } - } while (c.moveToNext()); - } - c.close(); - } - return set; - } - - public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.PHONE_NUMBER }, - CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", - new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, - null); - - if (cursor != null && cursor.moveToFirst()) { - try { - return cursor.getString(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call number fails " + e.toString()); - } finally { - cursor.close(); - } - } - return ""; - } - - public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.NOTE_ID }, - CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" - + CallNote.PHONE_NUMBER + ",?)", - new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, - null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - try { - return cursor.getLong(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call note id fails " + e.toString()); - } - } - cursor.close(); - } - return 0; - } - - public static String getSnippetById(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, - new String [] { NoteColumns.SNIPPET }, - NoteColumns.ID + "=?", - new String [] { String.valueOf(noteId)}, - null); - - if (cursor != null) { - String snippet = ""; - if (cursor.moveToFirst()) { - snippet = cursor.getString(0); - } - cursor.close(); - return snippet; - } - throw new IllegalArgumentException("Note is not found with id: " + noteId); - } - - public static String getFormattedSnippet(String snippet) { - if (snippet != null) { - snippet = snippet.trim(); - int index = snippet.indexOf('\n'); - if (index != -1) { - snippet = snippet.substring(0, index); - } - } - return snippet; - } -} diff --git a/src/net/micode/notes/tool/GTaskStringUtils.java b/src/net/micode/notes/tool/GTaskStringUtils.java deleted file mode 100644 index 6444b1f..0000000 --- a/src/net/micode/notes/tool/GTaskStringUtils.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.tool; - -public class GTaskStringUtils { - - public final static String GTASK_JSON_ACTION_ID = "action_id"; - - public final static String GTASK_JSON_ACTION_LIST = "action_list"; - - public final static String GTASK_JSON_ACTION_TYPE = "action_type"; - - public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; - - public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all"; - - public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move"; - - public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update"; - - public final static String GTASK_JSON_CREATOR_ID = "creator_id"; - - public final static String GTASK_JSON_CHILD_ENTITY = "child_entity"; - - public final static String GTASK_JSON_CLIENT_VERSION = "client_version"; - - public final static String GTASK_JSON_COMPLETED = "completed"; - - public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id"; - - public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id"; - - public final static String GTASK_JSON_DELETED = "deleted"; - - public final static String GTASK_JSON_DEST_LIST = "dest_list"; - - public final static String GTASK_JSON_DEST_PARENT = "dest_parent"; - - public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type"; - - public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta"; - - public final static String GTASK_JSON_ENTITY_TYPE = "entity_type"; - - public final static String GTASK_JSON_GET_DELETED = "get_deleted"; - - public final static String GTASK_JSON_ID = "id"; - - public final static String GTASK_JSON_INDEX = "index"; - - public final static String GTASK_JSON_LAST_MODIFIED = "last_modified"; - - public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point"; - - public final static String GTASK_JSON_LIST_ID = "list_id"; - - public final static String GTASK_JSON_LISTS = "lists"; - - public final static String GTASK_JSON_NAME = "name"; - - public final static String GTASK_JSON_NEW_ID = "new_id"; - - public final static String GTASK_JSON_NOTES = "notes"; - - public final static String GTASK_JSON_PARENT_ID = "parent_id"; - - public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id"; - - public final static String GTASK_JSON_RESULTS = "results"; - - public final static String GTASK_JSON_SOURCE_LIST = "source_list"; - - public final static String GTASK_JSON_TASKS = "tasks"; - - public final static String GTASK_JSON_TYPE = "type"; - - public final static String GTASK_JSON_TYPE_GROUP = "GROUP"; - - public final static String GTASK_JSON_TYPE_TASK = "TASK"; - - public final static String GTASK_JSON_USER = "user"; - - public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]"; - - public final static String FOLDER_DEFAULT = "Default"; - - public final static String FOLDER_CALL_NOTE = "Call_Note"; - - public final static String FOLDER_META = "METADATA"; - - public final static String META_HEAD_GTASK_ID = "meta_gid"; - - public final static String META_HEAD_NOTE = "meta_note"; - - public final static String META_HEAD_DATA = "meta_data"; - - public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE"; -} diff --git a/src/net/micode/notes/tool/ResourceParser.java b/src/net/micode/notes/tool/ResourceParser.java deleted file mode 100644 index 1ad3ad6..0000000 --- a/src/net/micode/notes/tool/ResourceParser.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.tool; - -import android.content.Context; -import android.preference.PreferenceManager; - -import net.micode.notes.R; -import net.micode.notes.ui.NotesPreferenceActivity; - -public class ResourceParser { - - public static final int YELLOW = 0; - public static final int BLUE = 1; - public static final int WHITE = 2; - public static final int GREEN = 3; - public static final int RED = 4; - - public static final int BG_DEFAULT_COLOR = YELLOW; - - public static final int TEXT_SMALL = 0; - public static final int TEXT_MEDIUM = 1; - public static final int TEXT_LARGE = 2; - public static final int TEXT_SUPER = 3; - - public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; - - public static class NoteBgResources { - private final static int [] BG_EDIT_RESOURCES = new int [] { - R.drawable.edit_yellow, - R.drawable.edit_blue, - R.drawable.edit_white, - R.drawable.edit_green, - R.drawable.edit_red - }; - - private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { - R.drawable.edit_title_yellow, - R.drawable.edit_title_blue, - R.drawable.edit_title_white, - R.drawable.edit_title_green, - R.drawable.edit_title_red - }; - - public static int getNoteBgResource(int id) { - return BG_EDIT_RESOURCES[id]; - } - - public static int getNoteTitleBgResource(int id) { - return BG_EDIT_TITLE_RESOURCES[id]; - } - } - - public static int getDefaultBgId(Context context) { - if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( - NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { - return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length); - } else { - return BG_DEFAULT_COLOR; - } - } - - public static class NoteItemBgResources { - private final static int [] BG_FIRST_RESOURCES = new int [] { - R.drawable.list_yellow_up, - R.drawable.list_blue_up, - R.drawable.list_white_up, - R.drawable.list_green_up, - R.drawable.list_red_up - }; - - private final static int [] BG_NORMAL_RESOURCES = new int [] { - R.drawable.list_yellow_middle, - R.drawable.list_blue_middle, - R.drawable.list_white_middle, - R.drawable.list_green_middle, - R.drawable.list_red_middle - }; - - private final static int [] BG_LAST_RESOURCES = new int [] { - R.drawable.list_yellow_down, - R.drawable.list_blue_down, - R.drawable.list_white_down, - R.drawable.list_green_down, - R.drawable.list_red_down, - }; - - private final static int [] BG_SINGLE_RESOURCES = new int [] { - R.drawable.list_yellow_single, - R.drawable.list_blue_single, - R.drawable.list_white_single, - R.drawable.list_green_single, - R.drawable.list_red_single - }; - - public static int getNoteBgFirstRes(int id) { - return BG_FIRST_RESOURCES[id]; - } - - public static int getNoteBgLastRes(int id) { - return BG_LAST_RESOURCES[id]; - } - - public static int getNoteBgSingleRes(int id) { - return BG_SINGLE_RESOURCES[id]; - } - - public static int getNoteBgNormalRes(int id) { - return BG_NORMAL_RESOURCES[id]; - } - - public static int getFolderBgRes() { - return R.drawable.list_folder; - } - } - - public static class WidgetBgResources { - private final static int [] BG_2X_RESOURCES = new int [] { - R.drawable.widget_2x_yellow, - R.drawable.widget_2x_blue, - R.drawable.widget_2x_white, - R.drawable.widget_2x_green, - R.drawable.widget_2x_red, - }; - - public static int getWidget2xBgResource(int id) { - return BG_2X_RESOURCES[id]; - } - - private final static int [] BG_4X_RESOURCES = new int [] { - R.drawable.widget_4x_yellow, - R.drawable.widget_4x_blue, - R.drawable.widget_4x_white, - R.drawable.widget_4x_green, - R.drawable.widget_4x_red - }; - - public static int getWidget4xBgResource(int id) { - return BG_4X_RESOURCES[id]; - } - } - - public static class TextAppearanceResources { - private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { - R.style.TextAppearanceNormal, - R.style.TextAppearanceMedium, - R.style.TextAppearanceLarge, - R.style.TextAppearanceSuper - }; - - public static int getTexAppearanceResource(int id) { - /** - * HACKME: Fix bug of store the resource id in shared preference. - * The id may larger than the length of resources, in this case, - * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} - */ - if (id >= TEXTAPPEARANCE_RESOURCES.length) { - return BG_DEFAULT_FONT_SIZE; - } - return TEXTAPPEARANCE_RESOURCES[id]; - } - - public static int getResourcesSize() { - return TEXTAPPEARANCE_RESOURCES.length; - } - } -} diff --git a/src/net/micode/notes/ui/AlarmAlertActivity.java b/src/net/micode/notes/ui/AlarmAlertActivity.java deleted file mode 100644 index 85723be..0000000 --- a/src/net/micode/notes/ui/AlarmAlertActivity.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.DialogInterface.OnDismissListener; -import android.content.Intent; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.media.RingtoneManager; -import android.net.Uri; -import android.os.Bundle; -import android.os.PowerManager; -import android.provider.Settings; -import android.view.Window; -import android.view.WindowManager; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.DataUtils; - -import java.io.IOException; - - -public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; - private String mSnippet; - private static final int SNIPPET_PREW_MAX_LEN = 60; - MediaPlayer mPlayer; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_NO_TITLE); - - final Window win = getWindow(); - win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); - - if (!isScreenOn()) { - win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON - | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON - | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); - } - - Intent intent = getIntent(); - - try { - mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); - mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); - mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, - SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) - : mSnippet; - } catch (IllegalArgumentException e) { - e.printStackTrace(); - return; - } - - mPlayer = new MediaPlayer(); - if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { - showActionDialog(); - playAlarmSound(); - } else { - finish(); - } - } - - private boolean isScreenOn() { - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - return pm.isScreenOn(); - } - - private void playAlarmSound() { - Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - - int silentModeStreams = Settings.System.getInt(getContentResolver(), - Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); - - if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { - mPlayer.setAudioStreamType(silentModeStreams); - } else { - mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); - } - try { - mPlayer.setDataSource(this, url); - mPlayer.prepare(); - mPlayer.setLooping(true); - mPlayer.start(); - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (SecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalStateException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - private void showActionDialog() { - AlertDialog.Builder dialog = new AlertDialog.Builder(this); - dialog.setTitle(R.string.app_name); - dialog.setMessage(mSnippet); - dialog.setPositiveButton(R.string.notealert_ok, this); - if (isScreenOn()) { - dialog.setNegativeButton(R.string.notealert_enter, this); - } - dialog.show().setOnDismissListener(this); - } - - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_NEGATIVE: - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, mNoteId); - startActivity(intent); - break; - default: - break; - } - } - - public void onDismiss(DialogInterface dialog) { - stopAlarmSound(); - finish(); - } - - private void stopAlarmSound() { - if (mPlayer != null) { - mPlayer.stop(); - mPlayer.release(); - mPlayer = null; - } - } -} diff --git a/src/net/micode/notes/ui/AlarmInitReceiver.java b/src/net/micode/notes/ui/AlarmInitReceiver.java deleted file mode 100644 index f221202..0000000 --- a/src/net/micode/notes/ui/AlarmInitReceiver.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.ContentUris; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; - - -public class AlarmInitReceiver extends BroadcastReceiver { - - private static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE - }; - - private static final int COLUMN_ID = 0; - private static final int COLUMN_ALERTED_DATE = 1; - - @Override - public void onReceive(Context context, Intent intent) { - long currentDate = System.currentTimeMillis(); - Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, - PROJECTION, - NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, - new String[] { String.valueOf(currentDate) }, - null); - - if (c != null) { - if (c.moveToFirst()) { - do { - long alertDate = c.getLong(COLUMN_ALERTED_DATE); - Intent sender = new Intent(context, AlarmReceiver.class); - sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); - AlarmManager alermManager = (AlarmManager) context - .getSystemService(Context.ALARM_SERVICE); - alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); - } while (c.moveToNext()); - } - c.close(); - } - } -} diff --git a/src/net/micode/notes/ui/AlarmReceiver.java b/src/net/micode/notes/ui/AlarmReceiver.java deleted file mode 100644 index 54e503b..0000000 --- a/src/net/micode/notes/ui/AlarmReceiver.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -public class AlarmReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - intent.setClass(context, AlarmAlertActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } -} diff --git a/src/net/micode/notes/ui/DateTimePicker.java b/src/net/micode/notes/ui/DateTimePicker.java deleted file mode 100644 index 496b0cd..0000000 --- a/src/net/micode/notes/ui/DateTimePicker.java +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import java.text.DateFormatSymbols; -import java.util.Calendar; - -import net.micode.notes.R; - - -import android.content.Context; -import android.text.format.DateFormat; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.NumberPicker; - -public class DateTimePicker extends FrameLayout { - - private static final boolean DEFAULT_ENABLE_STATE = true; - - private static final int HOURS_IN_HALF_DAY = 12; - private static final int HOURS_IN_ALL_DAY = 24; - private static final int DAYS_IN_ALL_WEEK = 7; - private static final int DATE_SPINNER_MIN_VAL = 0; - private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1; - private static final int HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = 0; - private static final int HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW = 23; - private static final int HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW = 1; - private static final int HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW = 12; - private static final int MINUT_SPINNER_MIN_VAL = 0; - private static final int MINUT_SPINNER_MAX_VAL = 59; - private static final int AMPM_SPINNER_MIN_VAL = 0; - private static final int AMPM_SPINNER_MAX_VAL = 1; - - private final NumberPicker mDateSpinner; - private final NumberPicker mHourSpinner; - private final NumberPicker mMinuteSpinner; - private final NumberPicker mAmPmSpinner; - private Calendar mDate; - - private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; - - private boolean mIsAm; - - private boolean mIs24HourView; - - private boolean mIsEnabled = DEFAULT_ENABLE_STATE; - - private boolean mInitialising; - - private OnDateTimeChangedListener mOnDateTimeChangedListener; - - private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal); - updateDateControl(); - onDateTimeChanged(); - } - }; - - private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - boolean isDateChanged = false; - Calendar cal = Calendar.getInstance(); - if (!mIs24HourView) { - if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, 1); - isDateChanged = true; - } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -1); - isDateChanged = true; - } - if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || - oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { - mIsAm = !mIsAm; - updateAmPmControl(); - } - } else { - if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, 1); - isDateChanged = true; - } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -1); - isDateChanged = true; - } - } - int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); - mDate.set(Calendar.HOUR_OF_DAY, newHour); - onDateTimeChanged(); - if (isDateChanged) { - setCurrentYear(cal.get(Calendar.YEAR)); - setCurrentMonth(cal.get(Calendar.MONTH)); - setCurrentDay(cal.get(Calendar.DAY_OF_MONTH)); - } - } - }; - - private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - int minValue = mMinuteSpinner.getMinValue(); - int maxValue = mMinuteSpinner.getMaxValue(); - int offset = 0; - if (oldVal == maxValue && newVal == minValue) { - offset += 1; - } else if (oldVal == minValue && newVal == maxValue) { - offset -= 1; - } - if (offset != 0) { - mDate.add(Calendar.HOUR_OF_DAY, offset); - mHourSpinner.setValue(getCurrentHour()); - updateDateControl(); - int newHour = getCurrentHourOfDay(); - if (newHour >= HOURS_IN_HALF_DAY) { - mIsAm = false; - updateAmPmControl(); - } else { - mIsAm = true; - updateAmPmControl(); - } - } - mDate.set(Calendar.MINUTE, newVal); - onDateTimeChanged(); - } - }; - - private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - mIsAm = !mIsAm; - if (mIsAm) { - mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY); - } else { - mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY); - } - updateAmPmControl(); - onDateTimeChanged(); - } - }; - - public interface OnDateTimeChangedListener { - void onDateTimeChanged(DateTimePicker view, int year, int month, - int dayOfMonth, int hourOfDay, int minute); - } - - public DateTimePicker(Context context) { - this(context, System.currentTimeMillis()); - } - - public DateTimePicker(Context context, long date) { - this(context, date, DateFormat.is24HourFormat(context)); - } - - public DateTimePicker(Context context, long date, boolean is24HourView) { - super(context); - mDate = Calendar.getInstance(); - mInitialising = true; - mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; - inflate(context, R.layout.datetime_picker, this); - - mDateSpinner = (NumberPicker) findViewById(R.id.date); - mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); - mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); - mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); - - mHourSpinner = (NumberPicker) findViewById(R.id.hour); - mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); - mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); - mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); - mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); - mMinuteSpinner.setOnLongPressUpdateInterval(100); - mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); - - String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); - mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); - mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); - mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); - mAmPmSpinner.setDisplayedValues(stringsForAmPm); - mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); - - // update controls to initial state - updateDateControl(); - updateHourControl(); - updateAmPmControl(); - - set24HourView(is24HourView); - - // set to current time - setCurrentDate(date); - - setEnabled(isEnabled()); - - // set the content descriptions - mInitialising = false; - } - - @Override - public void setEnabled(boolean enabled) { - if (mIsEnabled == enabled) { - return; - } - super.setEnabled(enabled); - mDateSpinner.setEnabled(enabled); - mMinuteSpinner.setEnabled(enabled); - mHourSpinner.setEnabled(enabled); - mAmPmSpinner.setEnabled(enabled); - mIsEnabled = enabled; - } - - @Override - public boolean isEnabled() { - return mIsEnabled; - } - - /** - * Get the current date in millis - * - * @return the current date in millis - */ - public long getCurrentDateInTimeMillis() { - return mDate.getTimeInMillis(); - } - - /** - * Set the current date - * - * @param date The current date in millis - */ - public void setCurrentDate(long date) { - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(date); - setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), - cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); - } - - /** - * Set the current date - * - * @param year The current year - * @param month The current month - * @param dayOfMonth The current dayOfMonth - * @param hourOfDay The current hourOfDay - * @param minute The current minute - */ - public void setCurrentDate(int year, int month, - int dayOfMonth, int hourOfDay, int minute) { - setCurrentYear(year); - setCurrentMonth(month); - setCurrentDay(dayOfMonth); - setCurrentHour(hourOfDay); - setCurrentMinute(minute); - } - - /** - * Get current year - * - * @return The current year - */ - public int getCurrentYear() { - return mDate.get(Calendar.YEAR); - } - - /** - * Set current year - * - * @param year The current year - */ - public void setCurrentYear(int year) { - if (!mInitialising && year == getCurrentYear()) { - return; - } - mDate.set(Calendar.YEAR, year); - updateDateControl(); - onDateTimeChanged(); - } - - /** - * Get current month in the year - * - * @return The current month in the year - */ - public int getCurrentMonth() { - return mDate.get(Calendar.MONTH); - } - - /** - * Set current month in the year - * - * @param month The month in the year - */ - public void setCurrentMonth(int month) { - if (!mInitialising && month == getCurrentMonth()) { - return; - } - mDate.set(Calendar.MONTH, month); - updateDateControl(); - onDateTimeChanged(); - } - - /** - * Get current day of the month - * - * @return The day of the month - */ - public int getCurrentDay() { - return mDate.get(Calendar.DAY_OF_MONTH); - } - - /** - * Set current day of the month - * - * @param dayOfMonth The day of the month - */ - public void setCurrentDay(int dayOfMonth) { - if (!mInitialising && dayOfMonth == getCurrentDay()) { - return; - } - mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); - updateDateControl(); - onDateTimeChanged(); - } - - /** - * Get current hour in 24 hour mode, in the range (0~23) - * @return The current hour in 24 hour mode - */ - public int getCurrentHourOfDay() { - return mDate.get(Calendar.HOUR_OF_DAY); - } - - private int getCurrentHour() { - if (mIs24HourView){ - return getCurrentHourOfDay(); - } else { - int hour = getCurrentHourOfDay(); - if (hour > HOURS_IN_HALF_DAY) { - return hour - HOURS_IN_HALF_DAY; - } else { - return hour == 0 ? HOURS_IN_HALF_DAY : hour; - } - } - } - - /** - * Set current hour in 24 hour mode, in the range (0~23) - * - * @param hourOfDay - */ - public void setCurrentHour(int hourOfDay) { - if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { - return; - } - mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); - if (!mIs24HourView) { - if (hourOfDay >= HOURS_IN_HALF_DAY) { - mIsAm = false; - if (hourOfDay > HOURS_IN_HALF_DAY) { - hourOfDay -= HOURS_IN_HALF_DAY; - } - } else { - mIsAm = true; - if (hourOfDay == 0) { - hourOfDay = HOURS_IN_HALF_DAY; - } - } - updateAmPmControl(); - } - mHourSpinner.setValue(hourOfDay); - onDateTimeChanged(); - } - - /** - * Get currentMinute - * - * @return The Current Minute - */ - public int getCurrentMinute() { - return mDate.get(Calendar.MINUTE); - } - - /** - * Set current minute - */ - public void setCurrentMinute(int minute) { - if (!mInitialising && minute == getCurrentMinute()) { - return; - } - mMinuteSpinner.setValue(minute); - mDate.set(Calendar.MINUTE, minute); - onDateTimeChanged(); - } - - /** - * @return true if this is in 24 hour view else false. - */ - public boolean is24HourView () { - return mIs24HourView; - } - - /** - * Set whether in 24 hour or AM/PM mode. - * - * @param is24HourView True for 24 hour mode. False for AM/PM mode. - */ - public void set24HourView(boolean is24HourView) { - if (mIs24HourView == is24HourView) { - return; - } - mIs24HourView = is24HourView; - mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE); - int hour = getCurrentHourOfDay(); - updateHourControl(); - setCurrentHour(hour); - updateAmPmControl(); - } - - private void updateDateControl() { - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1); - mDateSpinner.setDisplayedValues(null); - for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) { - cal.add(Calendar.DAY_OF_YEAR, 1); - mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal); - } - mDateSpinner.setDisplayedValues(mDateDisplayValues); - mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); - mDateSpinner.invalidate(); - } - - private void updateAmPmControl() { - if (mIs24HourView) { - mAmPmSpinner.setVisibility(View.GONE); - } else { - int index = mIsAm ? Calendar.AM : Calendar.PM; - mAmPmSpinner.setValue(index); - mAmPmSpinner.setVisibility(View.VISIBLE); - } - } - - private void updateHourControl() { - if (mIs24HourView) { - mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); - mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); - } else { - mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); - mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); - } - } - - /** - * Set the callback that indicates the 'Set' button has been pressed. - * @param callback the callback, if null will do nothing - */ - public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { - mOnDateTimeChangedListener = callback; - } - - private void onDateTimeChanged() { - if (mOnDateTimeChangedListener != null) { - mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), - getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); - } - } -} diff --git a/src/net/micode/notes/ui/DateTimePickerDialog.java b/src/net/micode/notes/ui/DateTimePickerDialog.java deleted file mode 100644 index 2c47ba4..0000000 --- a/src/net/micode/notes/ui/DateTimePickerDialog.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import java.util.Calendar; - -import net.micode.notes.R; -import net.micode.notes.ui.DateTimePicker; -import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.text.format.DateFormat; -import android.text.format.DateUtils; - -public class DateTimePickerDialog extends AlertDialog implements OnClickListener { - - private Calendar mDate = Calendar.getInstance(); - private boolean mIs24HourView; - private OnDateTimeSetListener mOnDateTimeSetListener; - private DateTimePicker mDateTimePicker; - - public interface OnDateTimeSetListener { - void OnDateTimeSet(AlertDialog dialog, long date); - } - - public DateTimePickerDialog(Context context, long date) { - super(context); - mDateTimePicker = new DateTimePicker(context); - setView(mDateTimePicker); - mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { - public void onDateTimeChanged(DateTimePicker view, int year, int month, - int dayOfMonth, int hourOfDay, int minute) { - mDate.set(Calendar.YEAR, year); - mDate.set(Calendar.MONTH, month); - mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); - mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); - mDate.set(Calendar.MINUTE, minute); - updateTitle(mDate.getTimeInMillis()); - } - }); - mDate.setTimeInMillis(date); - mDate.set(Calendar.SECOND, 0); - mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); - setButton(context.getString(R.string.datetime_dialog_ok), this); - setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); - set24HourView(DateFormat.is24HourFormat(this.getContext())); - updateTitle(mDate.getTimeInMillis()); - } - - public void set24HourView(boolean is24HourView) { - mIs24HourView = is24HourView; - } - - public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { - mOnDateTimeSetListener = callBack; - } - - private void updateTitle(long date) { - int flag = - DateUtils.FORMAT_SHOW_YEAR | - DateUtils.FORMAT_SHOW_DATE | - DateUtils.FORMAT_SHOW_TIME; - flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; - setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); - } - - public void onClick(DialogInterface arg0, int arg1) { - if (mOnDateTimeSetListener != null) { - mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); - } - } - -} \ No newline at end of file diff --git a/src/net/micode/notes/ui/DropdownMenu.java b/src/net/micode/notes/ui/DropdownMenu.java deleted file mode 100644 index 613dc74..0000000 --- a/src/net/micode/notes/ui/DropdownMenu.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.content.Context; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.PopupMenu; -import android.widget.PopupMenu.OnMenuItemClickListener; - -import net.micode.notes.R; - -public class DropdownMenu { - private Button mButton; - private PopupMenu mPopupMenu; - private Menu mMenu; - - public DropdownMenu(Context context, Button button, int menuId) { - mButton = button; - mButton.setBackgroundResource(R.drawable.dropdown_icon); - mPopupMenu = new PopupMenu(context, mButton); - mMenu = mPopupMenu.getMenu(); - mPopupMenu.getMenuInflater().inflate(menuId, mMenu); - mButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - mPopupMenu.show(); - } - }); - } - - public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { - if (mPopupMenu != null) { - mPopupMenu.setOnMenuItemClickListener(listener); - } - } - - public MenuItem findItem(int id) { - return mMenu.findItem(id); - } - - public void setTitle(CharSequence title) { - mButton.setText(title); - } -} diff --git a/src/net/micode/notes/ui/FoldersListAdapter.java b/src/net/micode/notes/ui/FoldersListAdapter.java deleted file mode 100644 index 96b77da..0000000 --- a/src/net/micode/notes/ui/FoldersListAdapter.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.content.Context; -import android.database.Cursor; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CursorAdapter; -import android.widget.LinearLayout; -import android.widget.TextView; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; - - -public class FoldersListAdapter extends CursorAdapter { - public static final String [] PROJECTION = { - NoteColumns.ID, - NoteColumns.SNIPPET - }; - - public static final int ID_COLUMN = 0; - public static final int NAME_COLUMN = 1; - - public FoldersListAdapter(Context context, Cursor c) { - super(context, c); - // TODO Auto-generated constructor stub - } - - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - return new FolderListItem(context); - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - if (view instanceof FolderListItem) { - String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context - .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); - ((FolderListItem) view).bind(folderName); - } - } - - public String getFolderName(Context context, int position) { - Cursor cursor = (Cursor) getItem(position); - return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context - .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); - } - - private class FolderListItem extends LinearLayout { - private TextView mName; - - public FolderListItem(Context context) { - super(context); - inflate(context, R.layout.folder_list_item, this); - mName = (TextView) findViewById(R.id.tv_folder_name); - } - - public void bind(String name) { - mName.setText(name); - } - } - -} diff --git a/src/net/micode/notes/ui/NoteEditActivity.java b/src/net/micode/notes/ui/NoteEditActivity.java deleted file mode 100644 index 96a9ff8..0000000 --- a/src/net/micode/notes/ui/NoteEditActivity.java +++ /dev/null @@ -1,873 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.app.Activity; -import android.app.AlarmManager; -import android.app.AlertDialog; -import android.app.PendingIntent; -import android.app.SearchManager; -import android.appwidget.AppWidgetManager; -import android.content.ContentUris; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.graphics.Paint; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.TextUtils; -import android.text.format.DateUtils; -import android.text.style.BackgroundColorSpan; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.WindowManager; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; -import android.widget.Toast; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.TextNote; -import net.micode.notes.model.WorkingNote; -import net.micode.notes.model.WorkingNote.NoteSettingChangedListener; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.tool.ResourceParser.TextAppearanceResources; -import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener; -import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; -import net.micode.notes.widget.NoteWidgetProvider_2x; -import net.micode.notes.widget.NoteWidgetProvider_4x; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -public class NoteEditActivity extends Activity implements OnClickListener, - NoteSettingChangedListener, OnTextViewChangeListener { - private class HeadViewHolder { - public TextView tvModified; - - public ImageView ivAlertIcon; - - public TextView tvAlertDate; - - public ImageView ibSetBgColor; - } - - private static final Map sBgSelectorBtnsMap = new HashMap(); - static { - sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); - sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED); - sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); - sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); - sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); - } - - private static final Map sBgSelectorSelectionMap = new HashMap(); - static { - sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select); - sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select); - sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); - sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); - sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); - } - - private static final Map sFontSizeBtnsMap = new HashMap(); - static { - sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); - sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL); - sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM); - sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); - } - - private static final Map sFontSelectorSelectionMap = new HashMap(); - static { - sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); - } - - private static final String TAG = "NoteEditActivity"; - - private HeadViewHolder mNoteHeaderHolder; - - private View mHeadViewPanel; - - private View mNoteBgColorSelector; - - private View mFontSizeSelector; - - private EditText mNoteEditor; - - private View mNoteEditorPanel; - - private WorkingNote mWorkingNote; - - private SharedPreferences mSharedPrefs; - private int mFontSizeId; - - private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; - - private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; - - public static final String TAG_CHECKED = String.valueOf('\u221A'); - public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); - - private LinearLayout mEditTextList; - - private String mUserQuery; - private Pattern mPattern; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - this.setContentView(R.layout.note_edit); - - if (savedInstanceState == null && !initActivityState(getIntent())) { - finish(); - return; - } - initResources(); - } - - /** - * Current activity may be killed when the memory is low. Once it is killed, for another time - * user load this activity, we should restore the former state - */ - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID)); - if (!initActivityState(intent)) { - finish(); - return; - } - Log.d(TAG, "Restoring from killed activity"); - } - } - - private boolean initActivityState(Intent intent) { - /** - * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id, - * then jump to the NotesListActivity - */ - mWorkingNote = null; - if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { - long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0); - mUserQuery = ""; - - /** - * Starting from the searched result - */ - if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) { - noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); - mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY); - } - - if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) { - Intent jump = new Intent(this, NotesListActivity.class); - startActivity(jump); - showToast(R.string.error_note_not_exist); - finish(); - return false; - } else { - mWorkingNote = WorkingNote.load(this, noteId); - if (mWorkingNote == null) { - Log.e(TAG, "load note failed with note id" + noteId); - finish(); - return false; - } - } - getWindow().setSoftInputMode( - WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); - } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) { - // New note - long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); - int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID); - int widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, - Notes.TYPE_WIDGET_INVALIDE); - int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, - ResourceParser.getDefaultBgId(this)); - - // Parse call-record note - String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); - long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0); - if (callDate != 0 && phoneNumber != null) { - if (TextUtils.isEmpty(phoneNumber)) { - Log.w(TAG, "The call record number is null"); - } - long noteId = 0; - if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(), - phoneNumber, callDate)) > 0) { - mWorkingNote = WorkingNote.load(this, noteId); - if (mWorkingNote == null) { - Log.e(TAG, "load call note failed with note id" + noteId); - finish(); - return false; - } - } else { - mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, - widgetType, bgResId); - mWorkingNote.convertToCallNote(phoneNumber, callDate); - } - } else { - mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType, - bgResId); - } - - getWindow().setSoftInputMode( - WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE - | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); - } else { - Log.e(TAG, "Intent not specified action, should not support"); - finish(); - return false; - } - mWorkingNote.setOnSettingStatusChangedListener(this); - return true; - } - - @Override - protected void onResume() { - super.onResume(); - initNoteScreen(); - } - - private void initNoteScreen() { - mNoteEditor.setTextAppearance(this, TextAppearanceResources - .getTexAppearanceResource(mFontSizeId)); - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - switchToListMode(mWorkingNote.getContent()); - } else { - mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); - mNoteEditor.setSelection(mNoteEditor.getText().length()); - } - for (Integer id : sBgSelectorSelectionMap.keySet()) { - findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE); - } - mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); - mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); - - mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this, - mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE - | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME - | DateUtils.FORMAT_SHOW_YEAR)); - - /** - * TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker - * is not ready - */ - showAlertHeader(); - } - - private void showAlertHeader() { - if (mWorkingNote.hasClockAlert()) { - long time = System.currentTimeMillis(); - if (time > mWorkingNote.getAlertDate()) { - mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired); - } else { - mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString( - mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS)); - } - mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE); - mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE); - } else { - mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE); - mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE); - }; - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - initActivityState(intent); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - /** - * For new note without note id, we should firstly save it to - * generate a id. If the editing note is not worth saving, there - * is no id which is equivalent to create new note - */ - if (!mWorkingNote.existInDatabase()) { - saveNote(); - } - outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId()); - Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState"); - } - - @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - if (mNoteBgColorSelector.getVisibility() == View.VISIBLE - && !inRangeOfView(mNoteBgColorSelector, ev)) { - mNoteBgColorSelector.setVisibility(View.GONE); - return true; - } - - if (mFontSizeSelector.getVisibility() == View.VISIBLE - && !inRangeOfView(mFontSizeSelector, ev)) { - mFontSizeSelector.setVisibility(View.GONE); - return true; - } - return super.dispatchTouchEvent(ev); - } - - private boolean inRangeOfView(View view, MotionEvent ev) { - int []location = new int[2]; - view.getLocationOnScreen(location); - int x = location[0]; - int y = location[1]; - if (ev.getX() < x - || ev.getX() > (x + view.getWidth()) - || ev.getY() < y - || ev.getY() > (y + view.getHeight())) { - return false; - } - return true; - } - - private void initResources() { - mHeadViewPanel = findViewById(R.id.note_title); - mNoteHeaderHolder = new HeadViewHolder(); - mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date); - mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon); - mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date); - mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color); - mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this); - mNoteEditor = (EditText) findViewById(R.id.note_edit_view); - mNoteEditorPanel = findViewById(R.id.sv_note_edit); - mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector); - for (int id : sBgSelectorBtnsMap.keySet()) { - ImageView iv = (ImageView) findViewById(id); - iv.setOnClickListener(this); - } - - mFontSizeSelector = findViewById(R.id.font_size_selector); - for (int id : sFontSizeBtnsMap.keySet()) { - View view = findViewById(id); - view.setOnClickListener(this); - }; - mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); - mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE); - /** - * HACKME: Fix bug of store the resource id in shared preference. - * The id may larger than the length of resources, in this case, - * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} - */ - if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) { - mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE; - } - mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list); - } - - @Override - protected void onPause() { - super.onPause(); - if(saveNote()) { - Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length()); - } - clearSettingState(); - } - - private void updateWidget() { - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) { - intent.setClass(this, NoteWidgetProvider_2x.class); - } else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) { - intent.setClass(this, NoteWidgetProvider_4x.class); - } else { - Log.e(TAG, "Unspported widget type"); - return; - } - - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { - mWorkingNote.getWidgetId() - }); - - sendBroadcast(intent); - setResult(RESULT_OK, intent); - } - - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.btn_set_bg_color) { - mNoteBgColorSelector.setVisibility(View.VISIBLE); - findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - - View.VISIBLE); - } else if (sBgSelectorBtnsMap.containsKey(id)) { - findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - View.GONE); - mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id)); - mNoteBgColorSelector.setVisibility(View.GONE); - } else if (sFontSizeBtnsMap.containsKey(id)) { - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE); - mFontSizeId = sFontSizeBtnsMap.get(id); - mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit(); - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - getWorkingText(); - switchToListMode(mWorkingNote.getContent()); - } else { - mNoteEditor.setTextAppearance(this, - TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); - } - mFontSizeSelector.setVisibility(View.GONE); - } - } - - @Override - public void onBackPressed() { - if(clearSettingState()) { - return; - } - - saveNote(); - super.onBackPressed(); - } - - private boolean clearSettingState() { - if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { - mNoteBgColorSelector.setVisibility(View.GONE); - return true; - } else if (mFontSizeSelector.getVisibility() == View.VISIBLE) { - mFontSizeSelector.setVisibility(View.GONE); - return true; - } - return false; - } - - public void onBackgroundColorChanged() { - findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - View.VISIBLE); - mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); - mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - if (isFinishing()) { - return true; - } - clearSettingState(); - menu.clear(); - if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) { - getMenuInflater().inflate(R.menu.call_note_edit, menu); - } else { - getMenuInflater().inflate(R.menu.note_edit, menu); - } - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode); - } else { - menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode); - } - if (mWorkingNote.hasClockAlert()) { - menu.findItem(R.id.menu_alert).setVisible(false); - } else { - menu.findItem(R.id.menu_delete_remind).setVisible(false); - } - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_new_note: - createNewNote(); - break; - case R.id.menu_delete: - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.alert_title_delete)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setMessage(getString(R.string.alert_message_delete_note)); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - deleteCurrentNote(); - finish(); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - break; - case R.id.menu_font_size: - mFontSizeSelector.setVisibility(View.VISIBLE); - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); - break; - case R.id.menu_list_mode: - mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? - TextNote.MODE_CHECK_LIST : 0); - break; - case R.id.menu_share: - getWorkingText(); - sendTo(this, mWorkingNote.getContent()); - break; - case R.id.menu_send_to_desktop: - sendToDesktop(); - break; - case R.id.menu_alert: - setReminder(); - break; - case R.id.menu_delete_remind: - mWorkingNote.setAlertDate(0, false); - break; - default: - break; - } - return true; - } - - private void setReminder() { - DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); - d.setOnDateTimeSetListener(new OnDateTimeSetListener() { - public void OnDateTimeSet(AlertDialog dialog, long date) { - mWorkingNote.setAlertDate(date , true); - } - }); - d.show(); - } - - /** - * Share note to apps that support {@link Intent#ACTION_SEND} action - * and {@text/plain} type - */ - private void sendTo(Context context, String info) { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_TEXT, info); - intent.setType("text/plain"); - context.startActivity(intent); - } - - private void createNewNote() { - // Firstly, save current editing notes - saveNote(); - - // For safety, start a new NoteEditActivity - finish(); - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId()); - startActivity(intent); - } - - private void deleteCurrentNote() { - if (mWorkingNote.existInDatabase()) { - HashSet ids = new HashSet(); - long id = mWorkingNote.getNoteId(); - if (id != Notes.ID_ROOT_FOLDER) { - ids.add(id); - } else { - Log.d(TAG, "Wrong note id, should not happen"); - } - if (!isSyncMode()) { - if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) { - Log.e(TAG, "Delete Note error"); - } - } else { - if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) { - Log.e(TAG, "Move notes to trash folder error, should not happens"); - } - } - } - mWorkingNote.markDeleted(true); - } - - private boolean isSyncMode() { - return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; - } - - public void onClockAlertChanged(long date, boolean set) { - /** - * User could set clock to an unsaved note, so before setting the - * alert clock, we should save the note first - */ - if (!mWorkingNote.existInDatabase()) { - saveNote(); - } - if (mWorkingNote.getNoteId() > 0) { - Intent intent = new Intent(this, AlarmReceiver.class); - intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId())); - PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); - AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE)); - showAlertHeader(); - if(!set) { - alarmManager.cancel(pendingIntent); - } else { - alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent); - } - } else { - /** - * There is the condition that user has input nothing (the note is - * not worthy saving), we have no note id, remind the user that he - * should input something - */ - Log.e(TAG, "Clock alert setting error"); - showToast(R.string.error_note_empty_for_clock); - } - } - - public void onWidgetChanged() { - updateWidget(); - } - - public void onEditTextDelete(int index, String text) { - int childCount = mEditTextList.getChildCount(); - if (childCount == 1) { - return; - } - - for (int i = index + 1; i < childCount; i++) { - ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) - .setIndex(i - 1); - } - - mEditTextList.removeViewAt(index); - NoteEditText edit = null; - if(index == 0) { - edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById( - R.id.et_edit_text); - } else { - edit = (NoteEditText) mEditTextList.getChildAt(index - 1).findViewById( - R.id.et_edit_text); - } - int length = edit.length(); - edit.append(text); - edit.requestFocus(); - edit.setSelection(length); - } - - public void onEditTextEnter(int index, String text) { - /** - * Should not happen, check for debug - */ - if(index > mEditTextList.getChildCount()) { - Log.e(TAG, "Index out of mEditTextList boundrary, should not happen"); - } - - View view = getListItem(text, index); - mEditTextList.addView(view, index); - NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.requestFocus(); - edit.setSelection(0); - for (int i = index + 1; i < mEditTextList.getChildCount(); i++) { - ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) - .setIndex(i); - } - } - - private void switchToListMode(String text) { - mEditTextList.removeAllViews(); - String[] items = text.split("\n"); - int index = 0; - for (String item : items) { - if(!TextUtils.isEmpty(item)) { - mEditTextList.addView(getListItem(item, index)); - index++; - } - } - mEditTextList.addView(getListItem("", index)); - mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus(); - - mNoteEditor.setVisibility(View.GONE); - mEditTextList.setVisibility(View.VISIBLE); - } - - private Spannable getHighlightQueryResult(String fullText, String userQuery) { - SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); - if (!TextUtils.isEmpty(userQuery)) { - mPattern = Pattern.compile(userQuery); - Matcher m = mPattern.matcher(fullText); - int start = 0; - while (m.find(start)) { - spannable.setSpan( - new BackgroundColorSpan(this.getResources().getColor( - R.color.user_query_highlight)), m.start(), m.end(), - Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - start = m.end(); - } - } - return spannable; - } - - private View getListItem(String item, int index) { - View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null); - final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); - CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item)); - cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked) { - edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); - } else { - edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); - } - } - }); - - if (item.startsWith(TAG_CHECKED)) { - cb.setChecked(true); - edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); - item = item.substring(TAG_CHECKED.length(), item.length()).trim(); - } else if (item.startsWith(TAG_UNCHECKED)) { - cb.setChecked(false); - edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); - item = item.substring(TAG_UNCHECKED.length(), item.length()).trim(); - } - - edit.setOnTextViewChangeListener(this); - edit.setIndex(index); - edit.setText(getHighlightQueryResult(item, mUserQuery)); - return view; - } - - public void onTextChange(int index, boolean hasText) { - if (index >= mEditTextList.getChildCount()) { - Log.e(TAG, "Wrong index, should not happen"); - return; - } - if(hasText) { - mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE); - } else { - mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE); - } - } - - public void onCheckListModeChanged(int oldMode, int newMode) { - if (newMode == TextNote.MODE_CHECK_LIST) { - switchToListMode(mNoteEditor.getText().toString()); - } else { - if (!getWorkingText()) { - mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ", - "")); - } - mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); - mEditTextList.setVisibility(View.GONE); - mNoteEditor.setVisibility(View.VISIBLE); - } - } - - private boolean getWorkingText() { - boolean hasChecked = false; - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < mEditTextList.getChildCount(); i++) { - View view = mEditTextList.getChildAt(i); - NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - if (!TextUtils.isEmpty(edit.getText())) { - if (((CheckBox) view.findViewById(R.id.cb_edit_item)).isChecked()) { - sb.append(TAG_CHECKED).append(" ").append(edit.getText()).append("\n"); - hasChecked = true; - } else { - sb.append(TAG_UNCHECKED).append(" ").append(edit.getText()).append("\n"); - } - } - } - mWorkingNote.setWorkingText(sb.toString()); - } else { - mWorkingNote.setWorkingText(mNoteEditor.getText().toString()); - } - return hasChecked; - } - - private boolean saveNote() { - getWorkingText(); - boolean saved = mWorkingNote.saveNote(); - if (saved) { - /** - * There are two modes from List view to edit view, open one note, - * create/edit a node. Opening node requires to the original - * position in the list when back from edit view, while creating a - * new node requires to the top of the list. This code - * {@link #RESULT_OK} is used to identify the create/edit state - */ - setResult(RESULT_OK); - } - return saved; - } - - private void sendToDesktop() { - /** - * Before send message to home, we should make sure that current - * editing note is exists in databases. So, for new note, firstly - * save it - */ - if (!mWorkingNote.existInDatabase()) { - saveNote(); - } - - if (mWorkingNote.getNoteId() > 0) { - Intent sender = new Intent(); - Intent shortcutIntent = new Intent(this, NoteEditActivity.class); - shortcutIntent.setAction(Intent.ACTION_VIEW); - shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId()); - sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); - sender.putExtra(Intent.EXTRA_SHORTCUT_NAME, - makeShortcutIconTitle(mWorkingNote.getContent())); - sender.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, - Intent.ShortcutIconResource.fromContext(this, R.drawable.icon_app)); - sender.putExtra("duplicate", true); - sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); - showToast(R.string.info_note_enter_desktop); - sendBroadcast(sender); - } else { - /** - * There is the condition that user has input nothing (the note is - * not worthy saving), we have no note id, remind the user that he - * should input something - */ - Log.e(TAG, "Send to desktop error"); - showToast(R.string.error_note_empty_for_send_to_desktop); - } - } - - private String makeShortcutIconTitle(String content) { - content = content.replace(TAG_CHECKED, ""); - content = content.replace(TAG_UNCHECKED, ""); - return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0, - SHORTCUT_ICON_TITLE_MAX_LEN) : content; - } - - private void showToast(int resId) { - showToast(resId, Toast.LENGTH_SHORT); - } - - private void showToast(int resId, int duration) { - Toast.makeText(this, resId, duration).show(); - } -} diff --git a/src/net/micode/notes/ui/NoteEditText.java b/src/net/micode/notes/ui/NoteEditText.java deleted file mode 100644 index 2afe2a8..0000000 --- a/src/net/micode/notes/ui/NoteEditText.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.content.Context; -import android.graphics.Rect; -import android.text.Layout; -import android.text.Selection; -import android.text.Spanned; -import android.text.TextUtils; -import android.text.style.URLSpan; -import android.util.AttributeSet; -import android.util.Log; -import android.view.ContextMenu; -import android.view.KeyEvent; -import android.view.MenuItem; -import android.view.MenuItem.OnMenuItemClickListener; -import android.view.MotionEvent; -import android.widget.EditText; - -import net.micode.notes.R; - -import java.util.HashMap; -import java.util.Map; - -public class NoteEditText extends EditText { - private static final String TAG = "NoteEditText"; - private int mIndex; - private int mSelectionStartBeforeDelete; - - private static final String SCHEME_TEL = "tel:" ; - private static final String SCHEME_HTTP = "http:" ; - private static final String SCHEME_EMAIL = "mailto:" ; - - private static final Map sSchemaActionResMap = new HashMap(); - static { - sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); - sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web); - sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email); - } - - /** - * Call by the {@link NoteEditActivity} to delete or add edit text - */ - public interface OnTextViewChangeListener { - /** - * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens - * and the text is null - */ - void onEditTextDelete(int index, String text); - - /** - * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} - * happen - */ - void onEditTextEnter(int index, String text); - - /** - * Hide or show item option when text change - */ - void onTextChange(int index, boolean hasText); - } - - private OnTextViewChangeListener mOnTextViewChangeListener; - - public NoteEditText(Context context) { - super(context, null); - mIndex = 0; - } - - public void setIndex(int index) { - mIndex = index; - } - - public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { - mOnTextViewChangeListener = listener; - } - - public NoteEditText(Context context, AttributeSet attrs) { - super(context, attrs, android.R.attr.editTextStyle); - } - - public NoteEditText(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - // TODO Auto-generated constructor stub - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - - int x = (int) event.getX(); - int y = (int) event.getY(); - x -= getTotalPaddingLeft(); - y -= getTotalPaddingTop(); - x += getScrollX(); - y += getScrollY(); - - Layout layout = getLayout(); - int line = layout.getLineForVertical(y); - int off = layout.getOffsetForHorizontal(line, x); - Selection.setSelection(getText(), off); - break; - } - - return super.onTouchEvent(event); - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_ENTER: - if (mOnTextViewChangeListener != null) { - return false; - } - break; - case KeyEvent.KEYCODE_DEL: - mSelectionStartBeforeDelete = getSelectionStart(); - break; - default: - break; - } - return super.onKeyDown(keyCode, event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - switch(keyCode) { - case KeyEvent.KEYCODE_DEL: - if (mOnTextViewChangeListener != null) { - if (0 == mSelectionStartBeforeDelete && mIndex != 0) { - mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString()); - return true; - } - } else { - Log.d(TAG, "OnTextViewChangeListener was not seted"); - } - break; - case KeyEvent.KEYCODE_ENTER: - if (mOnTextViewChangeListener != null) { - int selectionStart = getSelectionStart(); - String text = getText().subSequence(selectionStart, length()).toString(); - setText(getText().subSequence(0, selectionStart)); - mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); - } else { - Log.d(TAG, "OnTextViewChangeListener was not seted"); - } - break; - default: - break; - } - return super.onKeyUp(keyCode, event); - } - - @Override - protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { - if (mOnTextViewChangeListener != null) { - if (!focused && TextUtils.isEmpty(getText())) { - mOnTextViewChangeListener.onTextChange(mIndex, false); - } else { - mOnTextViewChangeListener.onTextChange(mIndex, true); - } - } - super.onFocusChanged(focused, direction, previouslyFocusedRect); - } - - @Override - protected void onCreateContextMenu(ContextMenu menu) { - if (getText() instanceof Spanned) { - int selStart = getSelectionStart(); - int selEnd = getSelectionEnd(); - - int min = Math.min(selStart, selEnd); - int max = Math.max(selStart, selEnd); - - final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); - if (urls.length == 1) { - int defaultResId = 0; - for(String schema: sSchemaActionResMap.keySet()) { - if(urls[0].getURL().indexOf(schema) >= 0) { - defaultResId = sSchemaActionResMap.get(schema); - break; - } - } - - if (defaultResId == 0) { - defaultResId = R.string.note_link_other; - } - - menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( - new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { - // goto a new intent - urls[0].onClick(NoteEditText.this); - return true; - } - }); - } - } - super.onCreateContextMenu(menu); - } -} diff --git a/src/net/micode/notes/ui/NoteItemData.java b/src/net/micode/notes/ui/NoteItemData.java deleted file mode 100644 index 0f5a878..0000000 --- a/src/net/micode/notes/ui/NoteItemData.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.content.Context; -import android.database.Cursor; -import android.text.TextUtils; - -import net.micode.notes.data.Contact; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.tool.DataUtils; - - -public class NoteItemData { - static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE, - NoteColumns.BG_COLOR_ID, - NoteColumns.CREATED_DATE, - NoteColumns.HAS_ATTACHMENT, - NoteColumns.MODIFIED_DATE, - NoteColumns.NOTES_COUNT, - NoteColumns.PARENT_ID, - NoteColumns.SNIPPET, - NoteColumns.TYPE, - NoteColumns.WIDGET_ID, - NoteColumns.WIDGET_TYPE, - }; - - private static final int ID_COLUMN = 0; - private static final int ALERTED_DATE_COLUMN = 1; - private static final int BG_COLOR_ID_COLUMN = 2; - private static final int CREATED_DATE_COLUMN = 3; - private static final int HAS_ATTACHMENT_COLUMN = 4; - private static final int MODIFIED_DATE_COLUMN = 5; - private static final int NOTES_COUNT_COLUMN = 6; - private static final int PARENT_ID_COLUMN = 7; - private static final int SNIPPET_COLUMN = 8; - private static final int TYPE_COLUMN = 9; - private static final int WIDGET_ID_COLUMN = 10; - private static final int WIDGET_TYPE_COLUMN = 11; - - private long mId; - private long mAlertDate; - private int mBgColorId; - private long mCreatedDate; - private boolean mHasAttachment; - private long mModifiedDate; - private int mNotesCount; - private long mParentId; - private String mSnippet; - private int mType; - private int mWidgetId; - private int mWidgetType; - private String mName; - private String mPhoneNumber; - - private boolean mIsLastItem; - private boolean mIsFirstItem; - private boolean mIsOnlyOneItem; - private boolean mIsOneNoteFollowingFolder; - private boolean mIsMultiNotesFollowingFolder; - - public NoteItemData(Context context, Cursor cursor) { - mId = cursor.getLong(ID_COLUMN); - mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); - mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); - mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); - mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false; - mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN); - mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN); - mParentId = cursor.getLong(PARENT_ID_COLUMN); - mSnippet = cursor.getString(SNIPPET_COLUMN); - mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace( - NoteEditActivity.TAG_UNCHECKED, ""); - mType = cursor.getInt(TYPE_COLUMN); - mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); - mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); - - mPhoneNumber = ""; - if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { - mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId); - if (!TextUtils.isEmpty(mPhoneNumber)) { - mName = Contact.getContact(context, mPhoneNumber); - if (mName == null) { - mName = mPhoneNumber; - } - } - } - - if (mName == null) { - mName = ""; - } - checkPostion(cursor); - } - - private void checkPostion(Cursor cursor) { - mIsLastItem = cursor.isLast() ? true : false; - mIsFirstItem = cursor.isFirst() ? true : false; - mIsOnlyOneItem = (cursor.getCount() == 1); - mIsMultiNotesFollowingFolder = false; - mIsOneNoteFollowingFolder = false; - - if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { - int position = cursor.getPosition(); - if (cursor.moveToPrevious()) { - if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER - || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) { - if (cursor.getCount() > (position + 1)) { - mIsMultiNotesFollowingFolder = true; - } else { - mIsOneNoteFollowingFolder = true; - } - } - if (!cursor.moveToNext()) { - throw new IllegalStateException("cursor move to previous but can't move back"); - } - } - } - } - - public boolean isOneFollowingFolder() { - return mIsOneNoteFollowingFolder; - } - - public boolean isMultiFollowingFolder() { - return mIsMultiNotesFollowingFolder; - } - - public boolean isLast() { - return mIsLastItem; - } - - public String getCallName() { - return mName; - } - - public boolean isFirst() { - return mIsFirstItem; - } - - public boolean isSingle() { - return mIsOnlyOneItem; - } - - public long getId() { - return mId; - } - - public long getAlertDate() { - return mAlertDate; - } - - public long getCreatedDate() { - return mCreatedDate; - } - - public boolean hasAttachment() { - return mHasAttachment; - } - - public long getModifiedDate() { - return mModifiedDate; - } - - public int getBgColorId() { - return mBgColorId; - } - - public long getParentId() { - return mParentId; - } - - public int getNotesCount() { - return mNotesCount; - } - - public long getFolderId () { - return mParentId; - } - - public int getType() { - return mType; - } - - public int getWidgetType() { - return mWidgetType; - } - - public int getWidgetId() { - return mWidgetId; - } - - public String getSnippet() { - return mSnippet; - } - - public boolean hasAlert() { - return (mAlertDate > 0); - } - - public boolean isCallRecord() { - return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber)); - } - - public static int getNoteType(Cursor cursor) { - return cursor.getInt(TYPE_COLUMN); - } -} diff --git a/src/net/micode/notes/ui/NotesListActivity.java b/src/net/micode/notes/ui/NotesListActivity.java deleted file mode 100644 index 1e6b10d..0000000 --- a/src/net/micode/notes/ui/NotesListActivity.java +++ /dev/null @@ -1,1002 +0,0 @@ -package net.micode.notes.ui; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.appwidget.AppWidgetManager; -import android.content.AsyncQueryHandler; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.os.AsyncTask; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.util.Log; -import android.view.ActionMode; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.Display; -import android.view.HapticFeedbackConstants; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MenuItem.OnMenuItemClickListener; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnCreateContextMenuListener; -import android.view.View.OnTouchListener; -import android.view.inputmethod.InputMethodManager; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ListView; -import android.widget.PopupMenu; -import android.widget.TextView; -import android.widget.Toast; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.remote.GTaskSyncService; -import net.micode.notes.model.WorkingNote; -import net.micode.notes.tool.BackupUtils; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; -import net.micode.notes.widget.NoteWidgetProvider_2x; -import net.micode.notes.widget.NoteWidgetProvider_4x; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.HashSet; -//主界面,一进入就是这个界面 -/** - * @author k - * - */ -public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener { //没有用特定的标签加注释。。。感觉没有什么用 - private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; - - private static final int FOLDER_LIST_QUERY_TOKEN = 1; - - private static final int MENU_FOLDER_DELETE = 0; - - private static final int MENU_FOLDER_VIEW = 1; - - private static final int MENU_FOLDER_CHANGE_NAME = 2; - - private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; //单行超过80个字符 - - private enum ListEditState { - NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER - }; - - private ListEditState mState; - - private BackgroundQueryHandler mBackgroundQueryHandler; - - private NotesListAdapter mNotesListAdapter; - - private ListView mNotesListView; - - private Button mAddNewNote; - - private boolean mDispatch; - - private int mOriginY; - - private int mDispatchY; - - private TextView mTitleBar; - - private long mCurrentFolderId; - - private ContentResolver mContentResolver; - - private ModeCallback mModeCallBack; - - private static final String TAG = "NotesListActivity"; - - public static final int NOTES_LISTVIEW_SCROLL_RATE = 30; - - private NoteItemData mFocusNoteDataItem; - - private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?"; - - private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>" - + Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR (" - + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND " - + NoteColumns.NOTES_COUNT + ">0)"; - - private final static int REQUEST_CODE_OPEN_NODE = 102; - private final static int REQUEST_CODE_NEW_NODE = 103; - - @Override - // 创建类 - protected void onCreate(final Bundle savedInstanceState) { //需要是final类型 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。 - // final类不能被继承,没有子类,final类中的方法默认是final的。 - //final方法不能被子类的方法覆盖,但可以被继承。 - //final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 - //final不能用于修饰构造方法。 - super.onCreate(savedInstanceState); // 调用父类的onCreate函数 - setContentView(R.layout.note_list); - initResources(); - - /** - * Insert an introduction when user firstly use this application - */ - setAppInfoFromRawRes(); - } - - @Override - // 返回一些子模块完成的数据交给主Activity处理 - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - // 结果值 和 要求值 符合要求 - if (resultCode == RESULT_OK - && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { - mNotesListAdapter.changeCursor(null); - } else { - super.onActivityResult(requestCode, resultCode, data); - // 调用 Activity 的onActivityResult() - } - } - - private void setAppInfoFromRawRes() { - // Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。 - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) { - StringBuilder sb = new StringBuilder(); - InputStream in = null; - try { - // 把资源文件放到应用程序的/raw/raw下,那么就可以在应用中使用getResources获取资源后, - // 以openRawResource方法(不带后缀的资源文件名)打开这个文件。 - in = getResources().openRawResource(R.raw.introduction); - if (in != null) { - InputStreamReader isr = new InputStreamReader(in); - BufferedReader br = new BufferedReader(isr); - char [] buf = new char[1024]; // 自行定义的数值,使用者不知道有什么意义 - int len = 0; - while ((len = br.read(buf)) > 0) { - sb.append(buf, 0, len); - } - } else { - Log.e(TAG, "Read introduction file error"); - return; - } - } catch (IOException e) { - e.printStackTrace(); - return; - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - // 创建空的WorkingNote - WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER, - AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE, - ResourceParser.RED); - note.setWorkingText(sb.toString()); - if (note.saveNote()) { - // 更新保存note的信息 - sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit(); - } else { - Log.e(TAG, "Save introduction note error"); - return; - } - } - } - - @Override - protected void onStart() { - super.onStart(); - startAsyncNotesListQuery(); - } - - // 初始化资源 - private void initResources() { - mContentResolver = this.getContentResolver(); // 获取应用程序的数据,得到类似数据表的东西 - mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - - // findViewById 是安卓编程的定位函数,主要是引用.R文件里的引用名 - mNotesListView = (ListView) findViewById(R.id.notes_list); // 绑定XML中的ListView,作为Item的容器 - mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null), - null, false); - mNotesListView.setOnItemClickListener(new OnListItemClickListener()); - mNotesListView.setOnItemLongClickListener(this); - mNotesListAdapter = new NotesListAdapter(this); - mNotesListView.setAdapter(mNotesListAdapter); - mAddNewNote = (Button) findViewById(R.id.btn_new_note);// 在activity中要获取该按钮 - mAddNewNote.setOnClickListener(this); - mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener()); - mDispatch = false; - mDispatchY = 0; - mOriginY = 0; - mTitleBar = (TextView) findViewById(R.id.tv_title_bar); - mState = ListEditState.NOTE_LIST; - mModeCallBack = new ModeCallback(); - } - - // 继承自ListView.MultiChoiceModeListener 和 OnMenuItemClickListener - private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { - private DropdownMenu mDropDownMenu; - private ActionMode mActionMode; - private MenuItem mMoveMenu; - - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - getMenuInflater().inflate(R.menu.note_list_options, menu); - menu.findItem(R.id.delete).setOnMenuItemClickListener(this); - mMoveMenu = menu.findItem(R.id.move); - if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER - || DataUtils.getUserFolderCount(mContentResolver) == 0) { - mMoveMenu.setVisible(false); - } else { - mMoveMenu.setVisible(true); - mMoveMenu.setOnMenuItemClickListener(this); - } - mActionMode = mode; - mNotesListAdapter.setChoiceMode(true); - mNotesListView.setLongClickable(false); - mAddNewNote.setVisibility(View.GONE); - - View customView = LayoutInflater.from(NotesListActivity.this).inflate( - R.layout.note_list_dropdown_menu, null); - mode.setCustomView(customView); - mDropDownMenu = new DropdownMenu(NotesListActivity.this, - (Button) customView.findViewById(R.id.selection_menu), - R.menu.note_list_dropdown); - mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ - public boolean onMenuItemClick(final MenuItem item) { - mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected()); - updateMenu(); - return true; - } - - }); - return true; - } - - // 更新菜单 - private void updateMenu() { - int selectedCount = mNotesListAdapter.getSelectedCount(); - // Update dropdown menu - String format = getResources().getString(R.string.menu_select_title, selectedCount); - mDropDownMenu.setTitle(format); // 更改标题 - MenuItem item = mDropDownMenu.findItem(R.id.action_select_all); - if (item != null) { - if (mNotesListAdapter.isAllSelected()) { - item.setChecked(true); - item.setTitle(R.string.menu_deselect_all); - } else { - item.setChecked(false); - item.setTitle(R.string.menu_select_all); - } - } - } - - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - // TODO Auto-generated method stub - return false; - } - - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - // TODO Auto-generated method stub - return false; - } - - public void onDestroyActionMode(ActionMode mode) { - mNotesListAdapter.setChoiceMode(false); - mNotesListView.setLongClickable(true); - mAddNewNote.setVisibility(View.VISIBLE); - } - - public void finishActionMode() { - mActionMode.finish(); - } - - public void onItemCheckedStateChanged(ActionMode mode, int position, long id, - boolean checked) { - mNotesListAdapter.setCheckedItem(position, checked); - updateMenu(); - } - - public boolean onMenuItemClick(MenuItem item) { - if (mNotesListAdapter.getSelectedCount() == 0) { - Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none), - Toast.LENGTH_SHORT).show(); - return true; - } - - switch (item.getItemId()) { - case R.id.delete: - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(getString(R.string.alert_title_delete)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setMessage(getString(R.string.alert_message_delete_notes, - mNotesListAdapter.getSelectedCount())); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - batchDelete(); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - break; - case R.id.move: - startQueryDestinationFolders(); - break; - default: - return false; - } - return true; - } - } - - private class NewNoteOnTouchListener implements OnTouchListener { - - public boolean onTouch(View v, MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: { - Display display = getWindowManager().getDefaultDisplay(); - int screenHeight = display.getHeight(); - int newNoteViewHeight = mAddNewNote.getHeight(); - int start = screenHeight - newNoteViewHeight; - int eventY = start + (int) event.getY(); - /** - * Minus TitleBar's height - */ - if (mState == ListEditState.SUB_FOLDER) { - eventY -= mTitleBar.getHeight(); - start -= mTitleBar.getHeight(); - } - /** - * HACKME:When click the transparent part of "New Note" button, dispatch - * the event to the list view behind this button. The transparent part of - * "New Note" button could be expressed by formula y=-0.12x+94锛圲nit:pixel锛� - * and the line top of the button. The coordinate based on left of the "New - * Note" button. The 94 represents maximum height of the transparent part. - * Notice that, if the background of the button changes, the formula should - * also change. This is very bad, just for the UI designer's strong requirement. - */ - if (event.getY() < (event.getX() * (-0.12) + 94)) { - View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1 - - mNotesListView.getFooterViewsCount()); - if (view != null && view.getBottom() > start - && (view.getTop() < (start + 94))) { - mOriginY = (int) event.getY(); - mDispatchY = eventY; - event.setLocation(event.getX(), mDispatchY); - mDispatch = true; - return mNotesListView.dispatchTouchEvent(event); - } - } - break; - } - case MotionEvent.ACTION_MOVE: { - if (mDispatch) { - mDispatchY += (int) event.getY() - mOriginY; - event.setLocation(event.getX(), mDispatchY); - return mNotesListView.dispatchTouchEvent(event); - } - break; - } - default: { - if (mDispatch) { - event.setLocation(event.getX(), mDispatchY); - mDispatch = false; - return mNotesListView.dispatchTouchEvent(event); - } - break; - } - } - return false; - } - - }; - - private void startAsyncNotesListQuery() { - String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION - : NORMAL_SELECTION; - mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, - Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] { - String.valueOf(mCurrentFolderId) - }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); - } - - private final class BackgroundQueryHandler extends AsyncQueryHandler { - public BackgroundQueryHandler(ContentResolver contentResolver) { - super(contentResolver); - } - - @Override - protected void onQueryComplete(int token, Object cookie, Cursor cursor) { - switch (token) { - case FOLDER_NOTE_LIST_QUERY_TOKEN: - mNotesListAdapter.changeCursor(cursor); - break; - case FOLDER_LIST_QUERY_TOKEN: - if (cursor != null && cursor.getCount() > 0) { - showFolderListMenu(cursor); - } else { - Log.e(TAG, "Query folder failed"); - } - break; - default: - return; - } - } - } - - private void showFolderListMenu(Cursor cursor) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(R.string.menu_title_select_folder); - final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor); - builder.setAdapter(adapter, new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface dialog, int which) { - DataUtils.batchMoveToFolder(mContentResolver, - mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which)); - Toast.makeText( - NotesListActivity.this, - getString(R.string.format_move_notes_to_folder, - mNotesListAdapter.getSelectedCount(), - adapter.getFolderName(NotesListActivity.this, which)), - Toast.LENGTH_SHORT).show(); - mModeCallBack.finishActionMode(); - } - }); - builder.show(); - } - - private void createNewNote() { - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId); - this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE); - } - - private void batchDelete() { - new AsyncTask>() { - protected HashSet doInBackground(Void... unused) { - HashSet widgets = mNotesListAdapter.getSelectedWidget(); - if (!isSyncMode()) { - // if not synced, delete notes directly - if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter - .getSelectedItemIds())) { - } else { - Log.e(TAG, "Delete notes error, should not happens"); - } - } else { - // in sync mode, we'll move the deleted note into the trash - // folder - if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter - .getSelectedItemIds(), Notes.ID_TRASH_FOLER)) { - Log.e(TAG, "Move notes to trash folder error, should not happens"); - } - } - return widgets; - } - - @Override - protected void onPostExecute(HashSet widgets) { - if (widgets != null) { - for (AppWidgetAttribute widget : widgets) { - if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { - updateWidget(widget.widgetId, widget.widgetType); - } - } - } - mModeCallBack.finishActionMode(); - } - }.execute(); - } - - private void deleteFolder(long folderId) { - if (folderId == Notes.ID_ROOT_FOLDER) { - Log.e(TAG, "Wrong folder id, should not happen " + folderId); - return; - } - - HashSet ids = new HashSet(); - ids.add(folderId); - HashSet widgets = DataUtils.getFolderNoteWidget(mContentResolver, - folderId); - if (!isSyncMode()) { - // if not synced, delete folder directly - DataUtils.batchDeleteNotes(mContentResolver, ids); - } else { - // in sync mode, we'll move the deleted folder into the trash folder - DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER); - } - if (widgets != null) { - for (AppWidgetAttribute widget : widgets) { - if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { - updateWidget(widget.widgetId, widget.widgetType); - } - } - } - } - - private void openNode(NoteItemData data) { - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, data.getId()); - this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); - } - - private void openFolder(NoteItemData data) { - mCurrentFolderId = data.getId(); - startAsyncNotesListQuery(); - if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mState = ListEditState.CALL_RECORD_FOLDER; - mAddNewNote.setVisibility(View.GONE); - } else { - mState = ListEditState.SUB_FOLDER; - } - if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mTitleBar.setText(R.string.call_record_folder_name); - } else { - mTitleBar.setText(data.getSnippet()); - } - mTitleBar.setVisibility(View.VISIBLE); - } - - public void onClick(View v) { - switch (v.getId()) { - case R.id.btn_new_note: - createNewNote(); - break; - default: - break; - } - } - - private void showSoftInput() { - InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - if (inputMethodManager != null) { - inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); - } - } - - private void hideSoftInput(View view) { - InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); - } - - private void showCreateOrModifyFolderDialog(final boolean create) { - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); - final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); - showSoftInput(); - if (!create) { - if (mFocusNoteDataItem != null) { - etName.setText(mFocusNoteDataItem.getSnippet()); - builder.setTitle(getString(R.string.menu_folder_change_name)); - } else { - Log.e(TAG, "The long click data item is null"); - return; - } - } else { - etName.setText(""); - builder.setTitle(this.getString(R.string.menu_create_folder)); - } - - builder.setPositiveButton(android.R.string.ok, null); - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - hideSoftInput(etName); - } - }); - - final Dialog dialog = builder.setView(view).show(); - final Button positive = (Button)dialog.findViewById(android.R.id.button1); - positive.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - hideSoftInput(etName); - String name = etName.getText().toString(); - if (DataUtils.checkVisibleFolderName(mContentResolver, name)) { - Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name), - Toast.LENGTH_LONG).show(); - etName.setSelection(0, etName.length()); - return; - } - if (!create) { - if (!TextUtils.isEmpty(name)) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.SNIPPET, name); - values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - mContentResolver.update(Notes.CONTENT_NOTE_URI, values, NoteColumns.ID - + "=?", new String[] { - String.valueOf(mFocusNoteDataItem.getId()) - }); - } - } else if (!TextUtils.isEmpty(name)) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.SNIPPET, name); - values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - mContentResolver.insert(Notes.CONTENT_NOTE_URI, values); - } - dialog.dismiss(); - } - }); - - if (TextUtils.isEmpty(etName.getText())) { - positive.setEnabled(false); - } - /** - * When the name edit text is null, disable the positive button - */ - etName.addTextChangedListener(new TextWatcher() { - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - // TODO Auto-generated method stub - - } - - public void onTextChanged(CharSequence s, int start, int before, int count) { - if (TextUtils.isEmpty(etName.getText())) { - positive.setEnabled(false); - } else { - positive.setEnabled(true); - } - } - - public void afterTextChanged(Editable s) { - // TODO Auto-generated method stub - - } - }); - } - - /* (non-Javadoc) - * @see android.app.Activity#onBackPressed() - * 按返回键时根据情况更改类中的数据 - */ - @Override - public void onBackPressed() { switch (mState) { - case SUB_FOLDER: - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mState = ListEditState.NOTE_LIST; - startAsyncNotesListQuery(); - mTitleBar.setVisibility(View.GONE); - break; - case CALL_RECORD_FOLDER: - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mState = ListEditState.NOTE_LIST; - mAddNewNote.setVisibility(View.VISIBLE); - mTitleBar.setVisibility(View.GONE); - startAsyncNotesListQuery(); - break; - case NOTE_LIST: - super.onBackPressed(); - break; - default: - break; - } - } - - /** - * @param appWidgetId - * @param appWidgetType - * 根据不同类型的widget更新插件,通过intent传送数据 - */ - private void updateWidget(int appWidgetId, int appWidgetType) { - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - if (appWidgetType == Notes.TYPE_WIDGET_2X) { - intent.setClass(this, NoteWidgetProvider_2x.class); - } else if (appWidgetType == Notes.TYPE_WIDGET_4X) { - intent.setClass(this, NoteWidgetProvider_4x.class); - } else { - Log.e(TAG, "Unspported widget type"); - return; - } - - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { - appWidgetId - }); - - sendBroadcast(intent); - setResult(RESULT_OK, intent); - } - - /** - * 声明监听器,建立菜单,包括名称,视图,删除操作,更改名称操作; - */ - private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() { - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - if (mFocusNoteDataItem != null) { - menu.setHeaderTitle(mFocusNoteDataItem.getSnippet()); - menu.add(0, MENU_FOLDER_VIEW, 0, R.string.menu_folder_view); - menu.add(0, MENU_FOLDER_DELETE, 0, R.string.menu_folder_delete); - menu.add(0, MENU_FOLDER_CHANGE_NAME, 0, R.string.menu_folder_change_name); - } - } - }; - - @Override - public void onContextMenuClosed(Menu menu) { - if (mNotesListView != null) { - mNotesListView.setOnCreateContextMenuListener(null); - } - super.onContextMenuClosed(menu); - } - - /* (non-Javadoc) - * @see android.app.Activity#onContextItemSelected(android.view.MenuItem) - * 针对menu中不同的选择进行不同的处理,里面详细注释 - */ - @Override - public boolean onContextItemSelected(MenuItem item) { - if (mFocusNoteDataItem == null) { - Log.e(TAG, "The long click data item is null"); - return false; - } - switch (item.getItemId()) { - case MENU_FOLDER_VIEW: - openFolder(mFocusNoteDataItem);//打开对应文件 - break; - case MENU_FOLDER_DELETE: - AlertDialog.Builder builder = new AlertDialog.Builder(this);//设置确认是否删除的对话框 - builder.setTitle(getString(R.string.alert_title_delete)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setMessage(getString(R.string.alert_message_delete_folder)); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - deleteFolder(mFocusNoteDataItem.getId()); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show();//显示对话框 - break; - case MENU_FOLDER_CHANGE_NAME: - showCreateOrModifyFolderDialog(false); - break; - default: - break; - } - - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - menu.clear(); - if (mState == ListEditState.NOTE_LIST) { - getMenuInflater().inflate(R.menu.note_list, menu); - // set sync or sync_cancel - menu.findItem(R.id.menu_sync).setTitle( - GTaskSyncService.isSyncing() ? R.string.menu_sync_cancel : R.string.menu_sync); - } else if (mState == ListEditState.SUB_FOLDER) { - getMenuInflater().inflate(R.menu.sub_folder, menu); - } else if (mState == ListEditState.CALL_RECORD_FOLDER) { - getMenuInflater().inflate(R.menu.call_record_folder, menu); - } else { - Log.e(TAG, "Wrong state:" + mState); - } - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_new_folder: { - showCreateOrModifyFolderDialog(true); - break; - } - case R.id.menu_export_text: { - exportNoteToText(); - break; - } - case R.id.menu_sync: { - if (isSyncMode()) { - if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) { - GTaskSyncService.startSync(this); - } else { - GTaskSyncService.cancelSync(this); - } - } else { - startPreferenceActivity(); - } - break; - } - case R.id.menu_setting: { - startPreferenceActivity(); - break; - } - case R.id.menu_new_note: { - createNewNote(); - break; - } - case R.id.menu_search: - onSearchRequested(); - break; - default: - break; - } - return true; - } - - /* (non-Javadoc) - * @see android.app.Activity#onSearchRequested() - * 直接调用startSearch函数 - */ - @Override - public boolean onSearchRequested() { - startSearch(null, false, null /* appData */, false); - return true; - } - - /** - * 函数功能:实现将便签导出到文本功能 - */ - private void exportNoteToText() { - final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this); - new AsyncTask() { - - @Override - protected Integer doInBackground(Void... unused) { - return backup.exportToText(); - } - - @Override - protected void onPostExecute(Integer result) { - if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(NotesListActivity.this - .getString(R.string.failed_sdcard_export)); - builder.setMessage(NotesListActivity.this - .getString(R.string.error_sdcard_unmounted)); - builder.setPositiveButton(android.R.string.ok, null); - builder.show(); - } else if (result == BackupUtils.STATE_SUCCESS) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(NotesListActivity.this - .getString(R.string.success_sdcard_export)); - builder.setMessage(NotesListActivity.this.getString( - R.string.format_exported_file_location, backup - .getExportedTextFileName(), backup.getExportedTextFileDir())); - builder.setPositiveButton(android.R.string.ok, null); - builder.show(); - } else if (result == BackupUtils.STATE_SYSTEM_ERROR) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(NotesListActivity.this - .getString(R.string.failed_sdcard_export)); - builder.setMessage(NotesListActivity.this - .getString(R.string.error_sdcard_export)); - builder.setPositiveButton(android.R.string.ok, null); - builder.show(); - } - } - - }.execute(); - } - - /** - * @return - * 功能:判断是否正在同步 - */ - private boolean isSyncMode() { - return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; - } - - /** - * 功能:跳转到PreferenceActivity界面 - */ - private void startPreferenceActivity() { - Activity from = getParent() != null ? getParent() : this; - Intent intent = new Intent(from, NotesPreferenceActivity.class); - from.startActivityIfNeeded(intent, -1); - } - - /** - * @author k - * 函数功能:实现对便签列表项的点击事件(短按) - */ - private class OnListItemClickListener implements OnItemClickListener { - - public void onItemClick(AdapterView parent, View view, int position, long id) { - if (view instanceof NotesListItem) { - NoteItemData item = ((NotesListItem) view).getItemData(); - if (mNotesListAdapter.isInChoiceMode()) { - if (item.getType() == Notes.TYPE_NOTE) { - position = position - mNotesListView.getHeaderViewsCount(); - mModeCallBack.onItemCheckedStateChanged(null, position, id, - !mNotesListAdapter.isSelectedItem(position)); - } - return; - } - - switch (mState) { - case NOTE_LIST: - if (item.getType() == Notes.TYPE_FOLDER - || item.getType() == Notes.TYPE_SYSTEM) { - openFolder(item); - } else if (item.getType() == Notes.TYPE_NOTE) { - openNode(item); - } else { - Log.e(TAG, "Wrong note type in NOTE_LIST"); - } - break; - case SUB_FOLDER: - case CALL_RECORD_FOLDER: - if (item.getType() == Notes.TYPE_NOTE) { - openNode(item); - } else { - Log.e(TAG, "Wrong note type in SUB_FOLDER"); - } - break; - default: - break; - } - } - } - - } - - /** - * 查询目标文件 - */ - private void startQueryDestinationFolders() { - String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?"; - selection = (mState == ListEditState.NOTE_LIST) ? selection: - "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")"; - - mBackgroundQueryHandler.startQuery(FOLDER_LIST_QUERY_TOKEN, - null, - Notes.CONTENT_NOTE_URI, - FoldersListAdapter.PROJECTION, - selection, - new String[] { - String.valueOf(Notes.TYPE_FOLDER), - String.valueOf(Notes.ID_TRASH_FOLER), - String.valueOf(mCurrentFolderId) - }, - NoteColumns.MODIFIED_DATE + " DESC"); - } - - /* (non-Javadoc) - * @see android.widget.AdapterView.OnItemLongClickListener#onItemLongClick(android.widget.AdapterView, android.view.View, int, long) - * 长按某一项时进行的操作 - * 如果长按的是便签,则通过ActionMode菜单实现;如果长按的是文件夹,则通过ContextMenu菜单实现; - * 具体ActionMOde菜单和ContextMenu菜单的详细见精度笔记 - */ - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - if (view instanceof NotesListItem) { - mFocusNoteDataItem = ((NotesListItem) view).getItemData(); - if (mFocusNoteDataItem.getType() == Notes.TYPE_NOTE && !mNotesListAdapter.isInChoiceMode()) { - if (mNotesListView.startActionMode(mModeCallBack) != null) { - mModeCallBack.onItemCheckedStateChanged(null, position, id, true); - mNotesListView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - } else { - Log.e(TAG, "startActionMode fails"); - } - } else if (mFocusNoteDataItem.getType() == Notes.TYPE_FOLDER) { - mNotesListView.setOnCreateContextMenuListener(mFolderOnCreateContextMenuListener); - } - } - return false; - } -} \ No newline at end of file diff --git a/src/net/micode/notes/ui/NotesListAdapter.java b/src/net/micode/notes/ui/NotesListAdapter.java deleted file mode 100644 index 51c9cb9..0000000 --- a/src/net/micode/notes/ui/NotesListAdapter.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.content.Context; -import android.database.Cursor; -import android.util.Log; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CursorAdapter; - -import net.micode.notes.data.Notes; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; - - -public class NotesListAdapter extends CursorAdapter { - private static final String TAG = "NotesListAdapter"; - private Context mContext; - private HashMap mSelectedIndex; - private int mNotesCount; - private boolean mChoiceMode; - - public static class AppWidgetAttribute { - public int widgetId; - public int widgetType; - }; - - public NotesListAdapter(Context context) { - super(context, null); - mSelectedIndex = new HashMap(); - mContext = context; - mNotesCount = 0; - } - - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - return new NotesListItem(context); - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - if (view instanceof NotesListItem) { - NoteItemData itemData = new NoteItemData(context, cursor); - ((NotesListItem) view).bind(context, itemData, mChoiceMode, - isSelectedItem(cursor.getPosition())); - } - } - - public void setCheckedItem(final int position, final boolean checked) { - mSelectedIndex.put(position, checked); - notifyDataSetChanged(); - } - - public boolean isInChoiceMode() { - return mChoiceMode; - } - - public void setChoiceMode(boolean mode) { - mSelectedIndex.clear(); - mChoiceMode = mode; - } - - public void selectAll(boolean checked) { - Cursor cursor = getCursor(); - for (int i = 0; i < getCount(); i++) { - if (cursor.moveToPosition(i)) { - if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { - setCheckedItem(i, checked); - } - } - } - } - - public HashSet getSelectedItemIds() { - HashSet itemSet = new HashSet(); - for (Integer position : mSelectedIndex.keySet()) { - if (mSelectedIndex.get(position) == true) { - Long id = getItemId(position); - if (id == Notes.ID_ROOT_FOLDER) { - Log.d(TAG, "Wrong item id, should not happen"); - } else { - itemSet.add(id); - } - } - } - - return itemSet; - } - - public HashSet getSelectedWidget() { - HashSet itemSet = new HashSet(); - for (Integer position : mSelectedIndex.keySet()) { - if (mSelectedIndex.get(position) == true) { - Cursor c = (Cursor) getItem(position); - if (c != null) { - AppWidgetAttribute widget = new AppWidgetAttribute(); - NoteItemData item = new NoteItemData(mContext, c); - widget.widgetId = item.getWidgetId(); - widget.widgetType = item.getWidgetType(); - itemSet.add(widget); - /** - * Don't close cursor here, only the adapter could close it - */ - } else { - Log.e(TAG, "Invalid cursor"); - return null; - } - } - } - return itemSet; - } - - public int getSelectedCount() { - Collection values = mSelectedIndex.values(); - if (null == values) { - return 0; - } - Iterator iter = values.iterator(); - int count = 0; - while (iter.hasNext()) { - if (true == iter.next()) { - count++; - } - } - return count; - } - - public boolean isAllSelected() { - int checkedCount = getSelectedCount(); - return (checkedCount != 0 && checkedCount == mNotesCount); - } - - public boolean isSelectedItem(final int position) { - if (null == mSelectedIndex.get(position)) { - return false; - } - return mSelectedIndex.get(position); - } - - @Override - protected void onContentChanged() { - super.onContentChanged(); - calcNotesCount(); - } - - @Override - public void changeCursor(Cursor cursor) { - super.changeCursor(cursor); - calcNotesCount(); - } - - private void calcNotesCount() { - mNotesCount = 0; - for (int i = 0; i < getCount(); i++) { - Cursor c = (Cursor) getItem(i); - if (c != null) { - if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { - mNotesCount++; - } - } else { - Log.e(TAG, "Invalid cursor"); - return; - } - } - } -} diff --git a/src/net/micode/notes/ui/NotesListItem.java b/src/net/micode/notes/ui/NotesListItem.java deleted file mode 100644 index 1221e80..0000000 --- a/src/net/micode/notes/ui/NotesListItem.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.content.Context; -import android.text.format.DateUtils; -import android.view.View; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.ResourceParser.NoteItemBgResources; - - -public class NotesListItem extends LinearLayout { - private ImageView mAlert; - private TextView mTitle; - private TextView mTime; - private TextView mCallName; - private NoteItemData mItemData; - private CheckBox mCheckBox; - - public NotesListItem(Context context) { - super(context); - inflate(context, R.layout.note_item, this); - mAlert = (ImageView) findViewById(R.id.iv_alert_icon); - mTitle = (TextView) findViewById(R.id.tv_title); - mTime = (TextView) findViewById(R.id.tv_time); - mCallName = (TextView) findViewById(R.id.tv_name); - mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); - } - - public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { - if (choiceMode && data.getType() == Notes.TYPE_NOTE) { - mCheckBox.setVisibility(View.VISIBLE); - mCheckBox.setChecked(checked); - } else { - mCheckBox.setVisibility(View.GONE); - } - - mItemData = data; - if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mCallName.setVisibility(View.GONE); - mAlert.setVisibility(View.VISIBLE); - mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); - mTitle.setText(context.getString(R.string.call_record_folder_name) - + context.getString(R.string.format_folder_files_count, data.getNotesCount())); - mAlert.setImageResource(R.drawable.call_record); - } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { - mCallName.setVisibility(View.VISIBLE); - mCallName.setText(data.getCallName()); - mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); - mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); - if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock); - mAlert.setVisibility(View.VISIBLE); - } else { - mAlert.setVisibility(View.GONE); - } - } else { - mCallName.setVisibility(View.GONE); - mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); - - if (data.getType() == Notes.TYPE_FOLDER) { - mTitle.setText(data.getSnippet() - + context.getString(R.string.format_folder_files_count, - data.getNotesCount())); - mAlert.setVisibility(View.GONE); - } else { - mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); - if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock); - mAlert.setVisibility(View.VISIBLE); - } else { - mAlert.setVisibility(View.GONE); - } - } - } - mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); - - setBackground(data); - } - - private void setBackground(NoteItemData data) { - int id = data.getBgColorId(); - if (data.getType() == Notes.TYPE_NOTE) { - if (data.isSingle() || data.isOneFollowingFolder()) { - setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); - } else if (data.isLast()) { - setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); - } else if (data.isFirst() || data.isMultiFollowingFolder()) { - setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); - } else { - setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); - } - } else { - setBackgroundResource(NoteItemBgResources.getFolderBgRes()); - } - } - - public NoteItemData getItemData() { - return mItemData; - } -} diff --git a/src/net/micode/notes/ui/NotesPreferenceActivity.java b/src/net/micode/notes/ui/NotesPreferenceActivity.java deleted file mode 100644 index 07c5f7e..0000000 --- a/src/net/micode/notes/ui/NotesPreferenceActivity.java +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.ui; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.app.ActionBar; -import android.app.AlertDialog; -import android.content.BroadcastReceiver; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceActivity; -import android.preference.PreferenceCategory; -import android.text.TextUtils; -import android.text.format.DateFormat; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Button; -import android.widget.TextView; -import android.widget.Toast; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.remote.GTaskSyncService; - - -public class NotesPreferenceActivity extends PreferenceActivity { - public static final String PREFERENCE_NAME = "notes_preferences"; - - public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name"; - - public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time"; - - public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear"; - - private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; - - private static final String AUTHORITIES_FILTER_KEY = "authorities"; - - private PreferenceCategory mAccountCategory; - - private GTaskReceiver mReceiver; - - private Account[] mOriAccounts; - - private boolean mHasAddedAccount; - - @Override - protected void onCreate(Bundle icicle) { - super.onCreate(icicle); - - /* using the app icon for navigation */ - getActionBar().setDisplayHomeAsUpEnabled(true); - - addPreferencesFromResource(R.xml.preferences); - mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); - mReceiver = new GTaskReceiver(); - IntentFilter filter = new IntentFilter(); - filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); - registerReceiver(mReceiver, filter); - - mOriAccounts = null; - View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); - getListView().addHeaderView(header, null, true); - } - - @Override - protected void onResume() { - super.onResume(); - - // need to set sync account automatically if user has added a new - // account - if (mHasAddedAccount) { - Account[] accounts = getGoogleAccounts(); - if (mOriAccounts != null && accounts.length > mOriAccounts.length) { - for (Account accountNew : accounts) { - boolean found = false; - for (Account accountOld : mOriAccounts) { - if (TextUtils.equals(accountOld.name, accountNew.name)) { - found = true; - break; - } - } - if (!found) { - setSyncAccount(accountNew.name); - break; - } - } - } - } - - refreshUI(); - } - - @Override - protected void onDestroy() { - if (mReceiver != null) { - unregisterReceiver(mReceiver); - } - super.onDestroy(); - } - - private void loadAccountPreference() { - mAccountCategory.removeAll(); - - Preference accountPref = new Preference(this); - final String defaultAccount = getSyncAccountName(this); - accountPref.setTitle(getString(R.string.preferences_account_title)); - accountPref.setSummary(getString(R.string.preferences_account_summary)); - accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - public boolean onPreferenceClick(Preference preference) { - if (!GTaskSyncService.isSyncing()) { - if (TextUtils.isEmpty(defaultAccount)) { - // the first time to set account - showSelectAccountAlertDialog(); - } else { - // if the account has already been set, we need to promp - // user about the risk - showChangeAccountConfirmAlertDialog(); - } - } else { - Toast.makeText(NotesPreferenceActivity.this, - R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) - .show(); - } - return true; - } - }); - - mAccountCategory.addPreference(accountPref); - } - - private void loadSyncButton() { - Button syncButton = (Button) findViewById(R.id.preference_sync_button); - TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - - // set button state - if (GTaskSyncService.isSyncing()) { - syncButton.setText(getString(R.string.preferences_button_sync_cancel)); - syncButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - GTaskSyncService.cancelSync(NotesPreferenceActivity.this); - } - }); - } else { - syncButton.setText(getString(R.string.preferences_button_sync_immediately)); - syncButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - GTaskSyncService.startSync(NotesPreferenceActivity.this); - } - }); - } - syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); - - // set last sync time - if (GTaskSyncService.isSyncing()) { - lastSyncTimeView.setText(GTaskSyncService.getProgressString()); - lastSyncTimeView.setVisibility(View.VISIBLE); - } else { - long lastSyncTime = getLastSyncTime(this); - if (lastSyncTime != 0) { - lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time, - DateFormat.format(getString(R.string.preferences_last_sync_time_format), - lastSyncTime))); - lastSyncTimeView.setVisibility(View.VISIBLE); - } else { - lastSyncTimeView.setVisibility(View.GONE); - } - } - } - - private void refreshUI() { - loadAccountPreference(); - loadSyncButton(); - } - - private void showSelectAccountAlertDialog() { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - - View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); - TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); - titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); - TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); - - dialogBuilder.setCustomTitle(titleView); - dialogBuilder.setPositiveButton(null, null); - - Account[] accounts = getGoogleAccounts(); - String defAccount = getSyncAccountName(this); - - mOriAccounts = accounts; - mHasAddedAccount = false; - - if (accounts.length > 0) { - CharSequence[] items = new CharSequence[accounts.length]; - final CharSequence[] itemMapping = items; - int checkedItem = -1; - int index = 0; - for (Account account : accounts) { - if (TextUtils.equals(account.name, defAccount)) { - checkedItem = index; - } - items[index++] = account.name; - } - dialogBuilder.setSingleChoiceItems(items, checkedItem, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - setSyncAccount(itemMapping[which].toString()); - dialog.dismiss(); - refreshUI(); - } - }); - } - - View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); - dialogBuilder.setView(addAccountView); - - final AlertDialog dialog = dialogBuilder.show(); - addAccountView.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - mHasAddedAccount = true; - Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); - intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] { - "gmail-ls" - }); - startActivityForResult(intent, -1); - dialog.dismiss(); - } - }); - } - - private void showChangeAccountConfirmAlertDialog() { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - - View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); - TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); - titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, - getSyncAccountName(this))); - TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); - dialogBuilder.setCustomTitle(titleView); - - CharSequence[] menuItemArray = new CharSequence[] { - getString(R.string.preferences_menu_change_account), - getString(R.string.preferences_menu_remove_account), - getString(R.string.preferences_menu_cancel) - }; - dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - if (which == 0) { - showSelectAccountAlertDialog(); - } else if (which == 1) { - removeSyncAccount(); - refreshUI(); - } - } - }); - dialogBuilder.show(); - } - - private Account[] getGoogleAccounts() { - AccountManager accountManager = AccountManager.get(this); - return accountManager.getAccountsByType("com.google"); - } - - private void setSyncAccount(String account) { - if (!getSyncAccountName(this).equals(account)) { - SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - if (account != null) { - editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); - } else { - editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); - } - editor.commit(); - - // clean up last sync time - setLastSyncTime(this, 0); - - // clean up local gtask related info - new Thread(new Runnable() { - public void run() { - ContentValues values = new ContentValues(); - values.put(NoteColumns.GTASK_ID, ""); - values.put(NoteColumns.SYNC_ID, 0); - getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); - } - }).start(); - - Toast.makeText(NotesPreferenceActivity.this, - getString(R.string.preferences_toast_success_set_accout, account), - Toast.LENGTH_SHORT).show(); - } - } - - private void removeSyncAccount() { - SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) { - editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME); - } - if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) { - editor.remove(PREFERENCE_LAST_SYNC_TIME); - } - editor.commit(); - - // clean up local gtask related info - new Thread(new Runnable() { - public void run() { - ContentValues values = new ContentValues(); - values.put(NoteColumns.GTASK_ID, ""); - values.put(NoteColumns.SYNC_ID, 0); - getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); - } - }).start(); - } - - public static String getSyncAccountName(Context context) { - SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); - return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); - } - - public static void setLastSyncTime(Context context, long time) { - SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); - editor.commit(); - } - - public static long getLastSyncTime(Context context) { - SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); - return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); - } - - private class GTaskReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - refreshUI(); - if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) { - TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - syncStatus.setText(intent - .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); - } - - } - } - - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - Intent intent = new Intent(this, NotesListActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - return true; - default: - return false; - } - } -} diff --git a/src/net/micode/notes/widget/NoteWidgetProvider.java b/src/net/micode/notes/widget/NoteWidgetProvider.java deleted file mode 100644 index ec6f819..0000000 --- a/src/net/micode/notes/widget/NoteWidgetProvider.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.widget; -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.util.Log; -import android.widget.RemoteViews; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.ui.NoteEditActivity; -import net.micode.notes.ui.NotesListActivity; - -public abstract class NoteWidgetProvider extends AppWidgetProvider { - public static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.BG_COLOR_ID, - NoteColumns.SNIPPET - }; - - public static final int COLUMN_ID = 0; - public static final int COLUMN_BG_COLOR_ID = 1; - public static final int COLUMN_SNIPPET = 2; - - private static final String TAG = "NoteWidgetProvider"; - - @Override - public void onDeleted(Context context, int[] appWidgetIds) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - for (int i = 0; i < appWidgetIds.length; i++) { - context.getContentResolver().update(Notes.CONTENT_NOTE_URI, - values, - NoteColumns.WIDGET_ID + "=?", - new String[] { String.valueOf(appWidgetIds[i])}); - } - } - - private Cursor getNoteWidgetInfo(Context context, int widgetId) { - return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, - PROJECTION, - NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?", - new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, - null); - } - - protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - update(context, appWidgetManager, appWidgetIds, false); - } - - private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, - boolean privacyMode) { - for (int i = 0; i < appWidgetIds.length; i++) { - if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { - int bgId = ResourceParser.getDefaultBgId(context); - String snippet = ""; - Intent intent = new Intent(context, NoteEditActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); - - Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]); - if (c != null && c.moveToFirst()) { - if (c.getCount() > 1) { - Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); - c.close(); - return; - } - snippet = c.getString(COLUMN_SNIPPET); - bgId = c.getInt(COLUMN_BG_COLOR_ID); - intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); - intent.setAction(Intent.ACTION_VIEW); - } else { - snippet = context.getResources().getString(R.string.widget_havenot_content); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - } - - if (c != null) { - c.close(); - } - - RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); - rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); - intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); - /** - * Generate the pending intent to start host for the widget - */ - PendingIntent pendingIntent = null; - if (privacyMode) { - rv.setTextViewText(R.id.widget_text, - context.getString(R.string.widget_under_visit_mode)); - pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( - context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); - } else { - rv.setTextViewText(R.id.widget_text, snippet); - pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, - PendingIntent.FLAG_UPDATE_CURRENT); - } - - rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); - appWidgetManager.updateAppWidget(appWidgetIds[i], rv); - } - } - } - - protected abstract int getBgResourceId(int bgId); - - protected abstract int getLayoutId(); - - protected abstract int getWidgetType(); -} diff --git a/src/net/micode/notes/widget/NoteWidgetProvider_2x.java b/src/net/micode/notes/widget/NoteWidgetProvider_2x.java deleted file mode 100644 index adcb2f7..0000000 --- a/src/net/micode/notes/widget/NoteWidgetProvider_2x.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.widget; - -import android.appwidget.AppWidgetManager; -import android.content.Context; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.ResourceParser; - - -public class NoteWidgetProvider_2x extends NoteWidgetProvider { - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); - } - - @Override - protected int getLayoutId() { - return R.layout.widget_2x; - } - - @Override - protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); - } - - @Override - protected int getWidgetType() { - return Notes.TYPE_WIDGET_2X; - } -} diff --git a/src/net/micode/notes/widget/NoteWidgetProvider_4x.java b/src/net/micode/notes/widget/NoteWidgetProvider_4x.java deleted file mode 100644 index c12a02e..0000000 --- a/src/net/micode/notes/widget/NoteWidgetProvider_4x.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * 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 net.micode.notes.widget; - -import android.appwidget.AppWidgetManager; -import android.content.Context; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.ResourceParser; - - -public class NoteWidgetProvider_4x extends NoteWidgetProvider { - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); - } - - protected int getLayoutId() { - return R.layout.widget_4x; - } - - @Override - protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); - } - - @Override - protected int getWidgetType() { - return Notes.TYPE_WIDGET_4X; - } -}