From da62690da5ce7227c556b08a0be33eead0084749 Mon Sep 17 00:00:00 2001 From: Ngewi Fet Date: Wed, 12 Feb 2014 10:20:13 +0100 Subject: [PATCH 1/4] - Renamed recurring transactions to "Scheduled transactions" and localized the string - Added icon for scheduled transactions - Add to ignore .classpath and .project used by eclipse Closes #142 --- .gitignore | 4 +++- .../drawable-hdpi/content_event_holo_dark.png | Bin 0 -> 1378 bytes .../drawable-hdpi/content_event_holo_light.png | Bin 0 -> 1380 bytes .../drawable-mdpi/content_event_holo_dark.png | Bin 0 -> 1273 bytes .../drawable-mdpi/content_event_holo_light.png | Bin 0 -> 1272 bytes .../drawable-xhdpi/content_event_holo_dark.png | Bin 0 -> 1529 bytes .../drawable-xhdpi/content_event_holo_light.png | Bin 0 -> 1517 bytes app/res/menu/account_actions.xml | 5 +++-- app/res/values-de/strings.xml | 3 ++- app/res/values-el/strings.xml | 3 ++- app/res/values-es-rMX/strings.xml | 3 ++- app/res/values-es/strings.xml | 3 ++- app/res/values-fr/strings.xml | 3 ++- app/res/values-hu/strings.xml | 3 ++- app/res/values-it/strings.xml | 3 ++- app/res/values-nb/strings.xml | 3 ++- app/res/values-nl/strings.xml | 3 ++- app/res/values-pt-rBR/strings.xml | 3 ++- app/res/values-ru/strings.xml | 3 ++- app/res/values-zh/strings.xml | 7 ++++--- app/res/values/strings.xml | 3 ++- .../android/ui/accounts/AccountsActivity.java | 4 ++-- ...va => ScheduledTransactionsListFragment.java} | 4 ++-- 23 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 app/res/drawable-hdpi/content_event_holo_dark.png create mode 100644 app/res/drawable-hdpi/content_event_holo_light.png create mode 100644 app/res/drawable-mdpi/content_event_holo_dark.png create mode 100644 app/res/drawable-mdpi/content_event_holo_light.png create mode 100644 app/res/drawable-xhdpi/content_event_holo_dark.png create mode 100644 app/res/drawable-xhdpi/content_event_holo_light.png rename app/src/org/gnucash/android/ui/transactions/{RecurringTransactionsListFragment.java => ScheduledTransactionsListFragment.java} (99%) diff --git a/.gitignore b/.gitignore index 44ee22b1a..50e45666e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,6 @@ gen-external-apklibs *.ipr .idea/ *.iws -out/ \ No newline at end of file +out/ +*.project +*.classpath \ No newline at end of file diff --git a/app/res/drawable-hdpi/content_event_holo_dark.png b/app/res/drawable-hdpi/content_event_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..33e13284f90e29644fc4bfe1e9d5140203fcca63 GIT binary patch literal 1378 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi))zHz{%)-^w$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O$kUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnrq& zG!Lpb1-DyVaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z&J+sjXJBBw;_2cT zQgQ3e%+p?n9YorUeP5L>6k!$Be{t&crPc>Q9|UW-4(_!M-`B8yfxbc$ckJ#G)utU9 zuMVwkT5!?qqkR>dQ%2JAnF}**ndO%}DXH3ba*mH$XrWB?-aA@x{pNxKjDiA<{{(I@ zEq}mr=IN1(JCh6e%5we`BzPvstZ5WCm?7-`eA+>g85);GI~+Ld9PeF{E9NHkkz{pd{uu6|*-T^I($G`XHa(dOwy*@cxoN4==pMs}%Wc*GL zj@cQ(UXpXQ_b!FD!KlchKEhzTmNBaAzLpo2vcq zC*2E{mf5Sic1o;+y~wI7>9@AsYdpP)`^DbEBCd;dzZu^&{*Kd5^7?nt&mq jC-q5?psv^bpnHH}MN_J^>TTgTe~DWM4f4QlC} literal 0 HcmV?d00001 diff --git a/app/res/drawable-hdpi/content_event_holo_light.png b/app/res/drawable-hdpi/content_event_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5a591c23b7fb5025c095419e7d83081fd5aece07 GIT binary patch literal 1380 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVip#mLOW%)r^y$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OecUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnrq% zG!Lpb1-DzAaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zHu>se%D}*Q&C|s( zq~g|_nY;ZC8;G>cUJ}E`;7J8&S%xKIghKHI!BnX%No(Z8j-ML?XCQT zy>aKQ_i&aSRJUMV+p|N;g5~l9rkJ$S8yO~VxV~frCy4H8-Z;miGDq@E(@Z1Yg%Twl zdzQwkJbGlr>C*ZB?wlQYUcbISW4NWn$?f~8_{(ngX&UFQ-&xAq)tSk0)x>heW8d3M z?k3li&u*A-vQ2@3opWZ%9Ct(c1nHd2M@+N4k8fi=)~S)4)9n(o{^ug0t8?vNEbeb) zdBpNp<;LpH9?thO&+rR3HrT1l=r!a{TD40c~VxKsA3oJx8r7c)K9A;ZgS<{xDXM*hWSovEMvm!0I-y09(8PR#FK z3CGI6^GiPjZP*a#zrg9_Y_1be)DPA*p7P1fTRFEqZQ>JO*0_}$_;qy`6lwokISIX^K|udS?83{1OOV{>OcSh literal 0 HcmV?d00001 diff --git a/app/res/drawable-mdpi/content_event_holo_dark.png b/app/res/drawable-mdpi/content_event_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c76f049240f380ac5cb2db6a44d39708573a13d9 GIT binary patch literal 1273 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi))zHz{%+koz$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1PCvUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfV zG!Lpb1-Dxaaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zUXZtK9|Hqpwx^3@ zNX4x;)AxHZI|>}zZ1|5m>W1s;h>j?&s2ji7ngl*@GOhf=x@ALnXGed+!|IOSh+CRB zZb_ONcD^?MAe*x>$4pwkdjq$9-|ocxeRpTx+!-A8+UZQ7j*Fb|VfkP1mgO&VmznSiU%NZ_(Xmmb*7GE~4m0*#V;$pW@bOFJRtQVedQJ<~G~> zIpJnGlOIUlxj9GUxMK<1x1CzW?E8Lv(wyKM_F%SC+6$A-XB(pnEZ*>y>|A6go6>ix zO`_N*B1fo?KRhCa>E6y;>~WzE`*a#ZKZq$kXcg{1n4K{5`T@ZTo|R0g0#+e!CL8Q( zxY9GJq49q8Qkl(hzo&eR=f1(rZev;R(5k*jZh8Zkb!zv+scofv?~bc3IDXYTeGaSm zgQ6<}8s~$3r8{-ct#>G%qB2E7uOWNeQ%9yvGsJhkS{8oI%Fe^=fZmMnn(E2Z=N;%R kzqurSvx>sDhImFc2E)Sv-#L!u%mWohp00i_>zopr0I%4+fdBvi literal 0 HcmV?d00001 diff --git a/app/res/drawable-mdpi/content_event_holo_light.png b/app/res/drawable-mdpi/content_event_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..ca94b6a6ca8c068b4c4fee3c89322a47a5740376 GIT binary patch literal 1272 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVip#mLOW%+SEp$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O9)D#HxMW>7ci&*tSfT^%;q(Vf)(ipD^YChgsL$ z)-|hV_xx|P7dUjnPwisnvjgroEN9NCe|F~NO^vmsPcE}5ofl)N5Wn#2tl;sDnH54g z&DjOs)OcAlCh)eSi}=JKDrt<%%rpe@d5%QksI zS8~^C;md6$(`q&6Pu#Uc;rv(G?O~xd`bsrSXBx`I8Q0ILV7Mo9x`z2pBYV8QQs{D? z(8degO$`bQvR-Q5Hp(%TsbS6ecy{K-+VuaL3(l^)@$lWL&-@41u4c&1unL^db}hA9 zj>-MOl5>134p|0@C4K&_`a{xUT`}8|*1pEt(|H;@<(}6r{~MO4{D3p2;UZUN#S{5U m-mfQd&QEh}$Y-=?;$aXq4X9YuaB~N!Eb?^qb6Mw<&;$V3E4c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=oi>0%no1wX>lYyI|p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaLazl*y`aR9TL84#CABECEH%ZgC_h&L>}jh^+-@<& zX&zK>3U0TU;nb@Sbc{YIYLTKECIn1BASOKF0y*%cpPC0u??u3by`yr{aRvsaY)==* zkcwMxX4~qs1d6nkziD5u;o;J(kkQ%Xr6}mtYro*a4?(W2PU{t1mR|9gBGg;2u%eTt zGvVgkz2`jdd8&CoJACfUyEl8(D>rYRU7h~E^4!kn=kCqi+GDs=C)!=_u^R)60~Fod z>U8FLeB-A@(iiuwkV^2Gy-1VgMO4Y8FoxtssthkUXB6H_3p45exOcfFbJwCgh8J8H z*K;4(60dodAxla6cv(l?w$-)0t_DXL?p!ox+T_k+Sk?N!*Ck)wH+4f_#Q!@2HwAsW?QCwnC^FZPYC4?1s5+%poT0SL=}LRq`9-&_ zW_-QYoLXkRl4pkC*@K$;s~y<*&a$77Y1Uc!u)<->i_6RTZ%(}-qM`gtUh(z8^cy@! zLq7eUXLIaGXaj@LEGE_KG4Jw}P8fBqZM~{&$Pm8bO4O1*SN<98o{_xC@xr}}B<8Df zI@B**+x%zci*=ro8x&@V?CsKA9$)Ag||4chy>J%;JsNFTWKvIQ)NdXmk z%#>v6IKZX*CSiYuv&oF#e|;J^tC}hO%1g;#FqQGe-FcxGE#~|={iS%fpgouFyhl~- zE8Z|3*qOe~c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=Gv!$t-iIa<|lYxt&p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaLa!@My`aR9TL84#CABECEH%ZgC_h&L>}jh^+-`Bg zX&zK>3U0SJXF4!3;qEiHmmykH zx9F>`HGaW)YG(`gS6^y9mvS}hDo=yJT8F4q=T9mNFS^HW_J~T9n7{IK zgMhE3!I95ToW7hkG*D03e}yr?KT2-*Uhzfqua|}FQ4#OZNjSi4wbwEIduqR7P%%pk zUzpJWf#uBGy4ZbtH@@wwTa>&euQ52QM^?Ha_EL>QOBlnl%D`7P=O=ypQT_0-p;>(N z^Vicnels$Bnv=%w!x*8UJNX`S+0v6iZM~DaW<55))ptmx`OD{RhL<*+R1SE4cYSNm zo2?whl~UiC_||hqGBEI@Gj^Y!H@9ThE5Wa?WfEA^C6XE5Sp=tQH;pTx|{0y^8U903w7_2^e zi~7%*)VKD*rP+;43wp|L{5ZTOwei}y`4dlNo?tRMC^6y2x$leFkL>zfSmCgGMq>My zw3ky4v`SXDnB@JvB7S7w=XzF!HTO47-P&Taaw?na?2k`(sCRN5c>G6Z>kGv-uj426 zT`JN3zopr E00&kl^8f$< literal 0 HcmV?d00001 diff --git a/app/res/menu/account_actions.xml b/app/res/menu/account_actions.xml index bbe9fe60b..e0a04b33a 100644 --- a/app/res/menu/account_actions.xml +++ b/app/res/menu/account_actions.xml @@ -22,12 +22,13 @@ android:showAsAction="always"/> diff --git a/app/res/values-de/strings.xml b/app/res/values-de/strings.xml index 07862a08f..a3e92de57 100644 --- a/app/res/values-de/strings.xml +++ b/app/res/values-de/strings.xml @@ -386,7 +386,7 @@ New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Wiederkehrende Buchungen + Eingeplante Buchungen Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. @@ -397,4 +397,5 @@ WÖCHENTLICH MONATLICH + Eingeplante Buchungen \ No newline at end of file diff --git a/app/res/values-el/strings.xml b/app/res/values-el/strings.xml index b5f69b0c0..ee0ed714f 100644 --- a/app/res/values-el/strings.xml +++ b/app/res/values-el/strings.xml @@ -402,7 +402,7 @@ New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Recurring Transactions + Scheduled Transactions Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. @@ -413,4 +413,5 @@ WEEKLY MONTHLY + Scheduled Transactions diff --git a/app/res/values-es-rMX/strings.xml b/app/res/values-es-rMX/strings.xml index 6ac17ab06..b4975cad1 100644 --- a/app/res/values-es-rMX/strings.xml +++ b/app/res/values-es-rMX/strings.xml @@ -386,7 +386,6 @@ New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Recurring Transactions Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. @@ -397,4 +396,6 @@ SEMANAL MENSUAL + Scheduled Transactions + Scheduled Transactions diff --git a/app/res/values-es/strings.xml b/app/res/values-es/strings.xml index 5a3dd3053..e7f4336e5 100644 --- a/app/res/values-es/strings.xml +++ b/app/res/values-es/strings.xml @@ -385,7 +385,6 @@ Crear cuentas por defecto Se crearán nuevas cuentas por defecto además de la estructura ya existente.\n\nSi desea reemplazar las cuentas ya existentes bórrelas primero antes de seguir. - Transacciones Recurrentes ¡Bienvenido a GnuCash Android! \nPuede crear una jerarquía de cuentas comúnmente usadas o importar su propia estructura de cuentas GnuCash. \n\nAmbas opciones están disponibles en las opciones de la aplicació por si quiere decidirlo más tarde. @@ -394,4 +393,6 @@ SEMANAL MENSUAL + Scheduled Transactions + Scheduled Transactions diff --git a/app/res/values-fr/strings.xml b/app/res/values-fr/strings.xml index 498d00c2e..86e6602cd 100644 --- a/app/res/values-fr/strings.xml +++ b/app/res/values-fr/strings.xml @@ -384,7 +384,6 @@ Les nouveaux comptes seront créés en plus de l\'existante structure de compte.\n\n Si vous souhaitez remplacer des comptes existants, supprimez-les d\'abord avant de commencer! - Transactions récurrentes Bienvenue à GnuCash Android!\n Vous pouvez soit créer une hiérarchie de comptes couramment utilisés, importer votre propre structure de compte GnuCash.\n\n Les deux options sont également disponible dans les paramètres d\'applications de sorte que vous puissiez décider plus tard. @@ -394,4 +393,6 @@ SEMAINE MENSUEL + Scheduled Transactions + Scheduled Transactions diff --git a/app/res/values-hu/strings.xml b/app/res/values-hu/strings.xml index d3a3731c6..8dfc1eac9 100644 --- a/app/res/values-hu/strings.xml +++ b/app/res/values-hu/strings.xml @@ -385,7 +385,7 @@ New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Recurring Transactions + Scheduled Transactions Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. @@ -396,4 +396,5 @@ WEEKLY MONTHLY + Scheduled Transactions \ No newline at end of file diff --git a/app/res/values-it/strings.xml b/app/res/values-it/strings.xml index 2d1d35f54..122b44c31 100644 --- a/app/res/values-it/strings.xml +++ b/app/res/values-it/strings.xml @@ -387,7 +387,6 @@ I nuovi conti saranno aggiunti alla struttura esistente.\n\n Per sostituire i conti esistenti, occorre eliminarli prima di proseguire! - Transazioni pianificate Benvenuti in GnuCash per Android! \nÈ possibile creare una struttura dei conti più comunemente utilizzati o importare la propria struttura da GnuCash. \n\nEntrambe le Opzioni sono disponibili nelle impostazioni dell\'applicazione ed è quindi possibile decidere in seguito. @@ -398,4 +397,6 @@ SETTIMANALE MENSILE + Scheduled Transactions + Scheduled Transactions diff --git a/app/res/values-nb/strings.xml b/app/res/values-nb/strings.xml index a77c1a8ac..6a8663253 100644 --- a/app/res/values-nb/strings.xml +++ b/app/res/values-nb/strings.xml @@ -388,7 +388,6 @@ format og importeres i regnskapsprogrammet GnuCash for PC. Opprette standard kontoer Nye kontoer vil bli opprettet i tillegg til eksisterende kontostruktur.\n\nHvis du vil erstatte de, slett de før du forsetter! - Gjentakende transaksjoner Velkommen til GnuCash Android! \nDu kan enten opprette et hieraki av de mest brukte kontoene, eller importere din egen GnuCash kontostruktur. \n\nBegge valgene er også tilgjengelige under Instillinger, så du kan velge senere. @@ -397,4 +396,6 @@ format og importeres i regnskapsprogrammet GnuCash for PC. UKENTLIG MÅNEDLIG + Scheduled Transactions + Scheduled Transactions diff --git a/app/res/values-nl/strings.xml b/app/res/values-nl/strings.xml index edc92d201..9925a2c73 100644 --- a/app/res/values-nl/strings.xml +++ b/app/res/values-nl/strings.xml @@ -388,7 +388,6 @@ New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Recurring Transactions Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. @@ -399,4 +398,6 @@ WEKELIJKSE MAANDELIJKS + Scheduled Transactions + Scheduled Transactions diff --git a/app/res/values-pt-rBR/strings.xml b/app/res/values-pt-rBR/strings.xml index 580344a13..cdec1e112 100644 --- a/app/res/values-pt-rBR/strings.xml +++ b/app/res/values-pt-rBR/strings.xml @@ -386,7 +386,6 @@ New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Recurring Transactions Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. @@ -397,4 +396,6 @@ SEMANAL MENSAL + Scheduled Transactions + Scheduled Transactions diff --git a/app/res/values-ru/strings.xml b/app/res/values-ru/strings.xml index f4c051d29..ad473ee90 100644 --- a/app/res/values-ru/strings.xml +++ b/app/res/values-ru/strings.xml @@ -385,7 +385,6 @@ будут созданы в дополнение к имеющейся структуре счетов.\n\nЕсли вы хотите заменить текущие счета, сперва их удалите! - Запланированные проводки Добро пожаловать в GnuCash для Android!\nВы можете как создать структуру часто используемых счетов, так и импортировать её из GnuCash.\n\nОбе @@ -398,4 +397,6 @@ ЕЖЕНЕДЕЛЬНЫЙ ЕЖЕМЕСЯЧНО + Scheduled Transactions + Scheduled Transactions diff --git a/app/res/values-zh/strings.xml b/app/res/values-zh/strings.xml index 300381846..46ac3b48b 100644 --- a/app/res/values-zh/strings.xml +++ b/app/res/values-zh/strings.xml @@ -384,13 +384,14 @@ 创建默认科目 准备创建新的科目结构,这不会覆盖现有的科目,如果你想创建全新的科目结构请先删除旧的科目。 - 计划的交易 + 计划的交易 欢迎使用GnuCash Android! \n你可以选择:1)创建常用的科目结构,2)导入自定义的科目结构。\或者稍后再决定,两种选择也能在设置中找到。 - 毫无 - 每日 + + 每天 每周 每月 + 计划的交易 diff --git a/app/res/values/strings.xml b/app/res/values/strings.xml index cb9af0ec4..c5444b399 100644 --- a/app/res/values/strings.xml +++ b/app/res/values/strings.xml @@ -622,9 +622,10 @@ New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Recurring Transactions + Scheduled Transactions Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. + Scheduled Transactions diff --git a/app/src/org/gnucash/android/ui/accounts/AccountsActivity.java b/app/src/org/gnucash/android/ui/accounts/AccountsActivity.java index 4cfc65580..47ea2ce63 100644 --- a/app/src/org/gnucash/android/ui/accounts/AccountsActivity.java +++ b/app/src/org/gnucash/android/ui/accounts/AccountsActivity.java @@ -49,7 +49,7 @@ import org.gnucash.android.data.Money; import org.gnucash.android.ui.Refreshable; import org.gnucash.android.ui.settings.SettingsActivity; -import org.gnucash.android.ui.transactions.RecurringTransactionsListFragment; +import org.gnucash.android.ui.transactions.ScheduledTransactionsListFragment; import org.gnucash.android.ui.transactions.TransactionsActivity; import org.gnucash.android.ui.transactions.TransactionsListFragment; import org.gnucash.android.util.GnucashAccountXmlHandler; @@ -366,7 +366,7 @@ private void showRecurringTransactionsFragment(){ FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); - RecurringTransactionsListFragment recurringTransactionsFragment = new RecurringTransactionsListFragment(); + ScheduledTransactionsListFragment recurringTransactionsFragment = new ScheduledTransactionsListFragment(); fragmentTransaction.replace(R.id.fragment_container, recurringTransactionsFragment, "fragment_recurring_transactions"); diff --git a/app/src/org/gnucash/android/ui/transactions/RecurringTransactionsListFragment.java b/app/src/org/gnucash/android/ui/transactions/ScheduledTransactionsListFragment.java similarity index 99% rename from app/src/org/gnucash/android/ui/transactions/RecurringTransactionsListFragment.java rename to app/src/org/gnucash/android/ui/transactions/ScheduledTransactionsListFragment.java index 1f36de7d2..1dbb7e6af 100644 --- a/app/src/org/gnucash/android/ui/transactions/RecurringTransactionsListFragment.java +++ b/app/src/org/gnucash/android/ui/transactions/ScheduledTransactionsListFragment.java @@ -51,7 +51,7 @@ * Fragment which displays the recurring transactions in the system. * @author Ngewi Fet */ -public class RecurringTransactionsListFragment extends SherlockListFragment implements +public class ScheduledTransactionsListFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks { /** @@ -152,7 +152,7 @@ public void onActivityCreated(Bundle savedInstanceState) { actionBar.setDisplayShowTitleEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); - actionBar.setTitle("Recurring Transactions"); + actionBar.setTitle(R.string.title_scheduled_transactions); setHasOptionsMenu(true); getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); From 9162bd097914dd548186322779f54d90992a9f4e Mon Sep 17 00:00:00 2001 From: Ngewi Fet Date: Thu, 13 Feb 2014 10:12:49 +0100 Subject: [PATCH 2/4] Code refactoring only (nothing to see here, move along) Extracted UI argument keys into own class aggregation --- app/AndroidManifest.xml | 4 +- app/res/layout/list_item_account.xml | 4 +- app/res/layout/list_item_transaction.xml | 4 +- app/res/menu/account_actions.xml | 2 +- app/res/values-de/strings.xml | 10 +- app/res/values-el/strings.xml | 10 +- app/res/values-es-rMX/strings.xml | 10 +- app/res/values-es/strings.xml | 10 +- app/res/values-fr/strings.xml | 10 +- app/res/values-hu/strings.xml | 10 +- app/res/values-it/strings.xml | 10 +- app/res/values-nb/strings.xml | 10 +- app/res/values-nl/strings.xml | 10 +- app/res/values-pt-rBR/strings.xml | 10 +- app/res/values-ru/strings.xml | 10 +- app/res/values-zh/strings.xml | 10 +- app/res/values/strings.xml | 10 +- .../gnucash/android/db/AccountsDbAdapter.java | 8 +- .../gnucash/android/db/DatabaseHelper.java | 2 +- .../android/db/TransactionsDbAdapter.java | 6 +- .../gnucash/android/export/ExporterTask.java | 13 ++- .../android/export/ofx/OfxExporter.java | 75 ++---------- .../gnucash/android/export/ofx/OfxHelper.java | 108 ++++++++++++++++++ .../android/export/qif/QifExporter.java | 2 +- .../gnucash/android/export/qif/QifHelper.java | 2 +- .../android/{data => model}/Account.java | 34 +++--- .../android/{data => model}/Money.java | 2 +- .../android/{data => model}/Transaction.java | 40 +++---- .../android/receivers/AccountCreator.java | 2 +- .../TransactionAppWidgetProvider.java | 6 +- .../receivers/TransactionRecorder.java | 8 +- .../org/gnucash/android/ui/UxArgument.java | 56 +++++++++ .../AccountFormFragment.java} | 22 ++-- .../AccountsActivity.java | 52 +++++---- .../AccountsListFragment.java | 59 ++++------ .../ui/settings/AboutPreferenceFragment.java | 2 +- .../settings/AccountPreferencesFragment.java | 6 +- ...eteAllTransacationsConfirmationDialog.java | 2 +- .../settings/GeneralPreferenceFragment.java | 2 +- .../android/ui/settings/SettingsActivity.java | 14 ++- .../BulkMoveDialogFragment.java | 7 +- .../ScheduledTransactionsListFragment.java | 11 +- .../TransactionFormFragment.java} | 37 +++--- .../TransactionsActivity.java | 56 ++++----- .../TransactionsListFragment.java | 48 +++----- .../dialog}/DatePickerDialogFragment.java | 2 +- .../dialog}/TimePickerDialogFragment.java | 2 +- ...ionsDeleteConfirmationDialogFragment.java} | 17 +-- .../{ => ui}/util/CheckableLinearLayout.java | 2 +- .../util/OnAccountClickedListener.java | 2 +- .../util/OnTransactionClickedListener.java | 2 +- .../android/ui/{ => util}/Refreshable.java | 2 +- .../widget/WidgetConfigurationActivity.java | 21 ++-- .../util/GnucashAccountXmlHandler.java | 2 +- .../test/db/AccountsDbAdapterTest.java | 4 +- .../test/db/TransactionsDbAdapterTest.java | 4 +- .../android/test/ui/AccountsActivityTest.java | 12 +- .../test/ui/ExportTransactionsTest.java | 7 +- .../test/ui/TransactionsActivityTest.java | 30 ++--- .../android/test/unit/AccountTest.java | 2 +- .../gnucash/android/test/unit/MoneyTest.java | 2 +- 61 files changed, 510 insertions(+), 429 deletions(-) create mode 100644 app/src/org/gnucash/android/export/ofx/OfxHelper.java rename app/src/org/gnucash/android/{data => model}/Account.java (94%) rename app/src/org/gnucash/android/{data => model}/Money.java (99%) rename app/src/org/gnucash/android/{data => model}/Transaction.java (92%) create mode 100644 app/src/org/gnucash/android/ui/UxArgument.java rename app/src/org/gnucash/android/ui/{accounts/AddAccountFragment.java => account/AccountFormFragment.java} (97%) rename app/src/org/gnucash/android/ui/{accounts => account}/AccountsActivity.java (92%) rename app/src/org/gnucash/android/ui/{accounts => account}/AccountsListFragment.java (93%) rename app/src/org/gnucash/android/ui/{transactions => transaction}/BulkMoveDialogFragment.java (95%) rename app/src/org/gnucash/android/ui/{transactions => transaction}/ScheduledTransactionsListFragment.java (97%) rename app/src/org/gnucash/android/ui/{transactions/NewTransactionFragment.java => transaction/TransactionFormFragment.java} (96%) rename app/src/org/gnucash/android/ui/{transactions => transaction}/TransactionsActivity.java (89%) rename app/src/org/gnucash/android/ui/{transactions => transaction}/TransactionsListFragment.java (92%) rename app/src/org/gnucash/android/ui/{ => transaction/dialog}/DatePickerDialogFragment.java (97%) rename app/src/org/gnucash/android/ui/{ => transaction/dialog}/TimePickerDialogFragment.java (97%) rename app/src/org/gnucash/android/ui/{transactions/TransactionsDeleteConfirmationDialog.java => transaction/dialog/TransactionsDeleteConfirmationDialogFragment.java} (79%) rename app/src/org/gnucash/android/{ => ui}/util/CheckableLinearLayout.java (99%) rename app/src/org/gnucash/android/{ => ui}/util/OnAccountClickedListener.java (96%) rename app/src/org/gnucash/android/{ => ui}/util/OnTransactionClickedListener.java (97%) rename app/src/org/gnucash/android/ui/{ => util}/Refreshable.java (96%) diff --git a/app/AndroidManifest.xml b/app/AndroidManifest.xml index 8d8442e5a..c496f35d8 100644 --- a/app/AndroidManifest.xml +++ b/app/AndroidManifest.xml @@ -48,7 +48,7 @@ android:label="@string/app_name" android:theme="@style/Theme.Sherlock.Light.DarkActionBar"> @@ -56,7 +56,7 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/res/layout/list_item_transaction.xml b/app/res/layout/list_item_transaction.xml index a78b39af2..0c9446948 100644 --- a/app/res/layout/list_item_transaction.xml +++ b/app/res/layout/list_item_transaction.xml @@ -15,7 +15,7 @@ limitations under the License. --> - @@ -63,4 +63,4 @@ android:layout_marginRight="12dp" style="@style/ListItemText"/> - \ No newline at end of file + \ No newline at end of file diff --git a/app/res/menu/account_actions.xml b/app/res/menu/account_actions.xml index e0a04b33a..e43e9b1c5 100644 --- a/app/res/menu/account_actions.xml +++ b/app/res/menu/account_actions.xml @@ -22,7 +22,7 @@ android:showAsAction="always"/> diff --git a/app/res/values-de/strings.xml b/app/res/values-de/strings.xml index a3e92de57..d73bab8d3 100644 --- a/app/res/values-de/strings.xml +++ b/app/res/values-de/strings.xml @@ -289,8 +289,8 @@ Haben Soll - Wollen Sie wirklich ALLE Buchungen löschen? - Wollen Sie wirklich diese Buchung löschen? + Wollen Sie wirklich ALLE Buchungen löschen? + Wollen Sie wirklich diese Buchung löschen? Exportieren Alle Buchungen exportieren Alle exportierten Buchungen löschen @@ -383,11 +383,11 @@ Alle Erstellt die häufig verwendete standard GnuCash Konten Standard Konten erstellen - New accounts will be created in addition to the existing + New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Eingeplante Buchungen - Welcome to GnuCash Android! \nYou can either create + Eingeplante Buchungen + Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. diff --git a/app/res/values-el/strings.xml b/app/res/values-el/strings.xml index ee0ed714f..8c415781d 100644 --- a/app/res/values-el/strings.xml +++ b/app/res/values-el/strings.xml @@ -295,8 +295,8 @@ ΠΙΣΤΩΣΗ ΧΡΕΩΣΗ - Σίγουρα θέλετε να διαγράψετε ΌΛΕΣ τις κινήσεις; - Σίγουρα θέλετε να διαγράψετε αυτή τη κίνηση; + Σίγουρα θέλετε να διαγράψετε ΌΛΕΣ τις κινήσεις; + Σίγουρα θέλετε να διαγράψετε αυτή τη κίνηση; Εξαγωγή Εξαγωγή όλων των κινήσεων Διαγραφή εξηγμένων κινήσεων @@ -399,11 +399,11 @@ All Creates default GnuCash commonly-used account structure Create default accounts - New accounts will be created in addition to the existing + New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Scheduled Transactions - Welcome to GnuCash Android! \nYou can either create + Scheduled Transactions + Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. diff --git a/app/res/values-es-rMX/strings.xml b/app/res/values-es-rMX/strings.xml index b4975cad1..600c4cb82 100644 --- a/app/res/values-es-rMX/strings.xml +++ b/app/res/values-es-rMX/strings.xml @@ -289,8 +289,8 @@ ABONO CARGO - ¿Está seguro de borrar TODAS las transacciones? - ¿Está seguro de borrar esta transacción? + ¿Está seguro de borrar TODAS las transacciones? + ¿Está seguro de borrar esta transacción? Exportación Exportar todas las transacciones Borrar las transacciones exportadas @@ -383,10 +383,10 @@ All Creates default GnuCash commonly-used account structure Create default accounts - New accounts will be created in addition to the existing + New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Welcome to GnuCash Android! \nYou can either create + Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. @@ -396,6 +396,6 @@ SEMANAL MENSUAL - Scheduled Transactions + Scheduled Transactions Scheduled Transactions diff --git a/app/res/values-es/strings.xml b/app/res/values-es/strings.xml index e7f4336e5..d6c754b94 100644 --- a/app/res/values-es/strings.xml +++ b/app/res/values-es/strings.xml @@ -289,8 +289,8 @@ ABONO CARGO - ¿Borrar TODAS las transacciones? - ¿Borrar esta transacción? + ¿Borrar TODAS las transacciones? + ¿Borrar esta transacción? Exportación Exportar todas las transacciones Borrar las transacciones exportadas @@ -383,9 +383,9 @@ Todas Crea una estructura por defecto de cuentas GnuCash comúnmente usadas Crear cuentas por defecto - Se crearán nuevas cuentas por defecto además de la estructura ya existente.\n\nSi desea reemplazar las cuentas ya existentes bórrelas primero antes de seguir. + Se crearán nuevas cuentas por defecto además de la estructura ya existente.\n\nSi desea reemplazar las cuentas ya existentes bórrelas primero antes de seguir. - ¡Bienvenido a GnuCash Android! \nPuede crear una jerarquía de cuentas comúnmente usadas o importar su propia estructura de cuentas GnuCash. \n\nAmbas opciones están disponibles en las opciones de la aplicació por si quiere decidirlo más tarde. + ¡Bienvenido a GnuCash Android! \nPuede crear una jerarquía de cuentas comúnmente usadas o importar su propia estructura de cuentas GnuCash. \n\nAmbas opciones están disponibles en las opciones de la aplicació por si quiere decidirlo más tarde. NINGUNO @@ -393,6 +393,6 @@ SEMANAL MENSUAL - Scheduled Transactions + Scheduled Transactions Scheduled Transactions diff --git a/app/res/values-fr/strings.xml b/app/res/values-fr/strings.xml index 86e6602cd..94887e1d6 100644 --- a/app/res/values-fr/strings.xml +++ b/app/res/values-fr/strings.xml @@ -289,8 +289,8 @@ CREDIT DEBIT - Etes vous sûre de vouloir supprimer TOUTES les transactions? - Etes vous sûre de vouloir supprimer cette transaction? + Etes vous sûre de vouloir supprimer TOUTES les transactions? + Etes vous sûre de vouloir supprimer cette transaction? Export Exporter toutes les transactions Supprimer les transactions exportées @@ -381,10 +381,10 @@ Tous Crée une structure de compte GnuCash par défaut couramment utilisé Crée comptes par défaut - Les nouveaux comptes seront créés en plus de l\'existante + Les nouveaux comptes seront créés en plus de l\'existante structure de compte.\n\n Si vous souhaitez remplacer des comptes existants, supprimez-les d\'abord avant de commencer! - Bienvenue à GnuCash Android!\n Vous pouvez soit créer + Bienvenue à GnuCash Android!\n Vous pouvez soit créer une hiérarchie de comptes couramment utilisés, importer votre propre structure de compte GnuCash.\n\n Les deux options sont également disponible dans les paramètres d\'applications de sorte que vous puissiez décider plus tard. @@ -393,6 +393,6 @@ SEMAINE MENSUEL - Scheduled Transactions + Scheduled Transactions Scheduled Transactions diff --git a/app/res/values-hu/strings.xml b/app/res/values-hu/strings.xml index 8dfc1eac9..2205af8c5 100644 --- a/app/res/values-hu/strings.xml +++ b/app/res/values-hu/strings.xml @@ -288,8 +288,8 @@ CREDIT DEBIT - Are you sure you want to delete ALL transactions? - Are you sure you want to delete this transaction? + Are you sure you want to delete ALL transactions? + Are you sure you want to delete this transaction? Export Export all transactions Delete exported transactions @@ -382,11 +382,11 @@ All Creates default GnuCash commonly-used account structure Create default accounts - New accounts will be created in addition to the existing + New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Scheduled Transactions - Welcome to GnuCash Android! \nYou can either create + Scheduled Transactions + Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. diff --git a/app/res/values-it/strings.xml b/app/res/values-it/strings.xml index 122b44c31..82aa4c51f 100644 --- a/app/res/values-it/strings.xml +++ b/app/res/values-it/strings.xml @@ -289,8 +289,8 @@ CREDITO DEBITO - Eliminare TUTTE le transazioni? - Eliminare davvero questa transazione? + Eliminare TUTTE le transazioni? + Eliminare davvero questa transazione? Esporta Esporta tutte le transazioni Elimina le transazioni esportate @@ -384,10 +384,10 @@ Tutti Crea la struttura predefinita dei conti comuni di GnuCash Crea conti predefiniti - I nuovi conti saranno aggiunti alla struttura esistente.\n\n + I nuovi conti saranno aggiunti alla struttura esistente.\n\n Per sostituire i conti esistenti, occorre eliminarli prima di proseguire! - Benvenuti in GnuCash per Android! \nÈ possibile + Benvenuti in GnuCash per Android! \nÈ possibile creare una struttura dei conti più comunemente utilizzati o importare la propria struttura da GnuCash. \n\nEntrambe le Opzioni sono disponibili nelle impostazioni dell\'applicazione ed è quindi possibile decidere in seguito. @@ -397,6 +397,6 @@ SETTIMANALE MENSILE - Scheduled Transactions + Scheduled Transactions Scheduled Transactions diff --git a/app/res/values-nb/strings.xml b/app/res/values-nb/strings.xml index 6a8663253..4db72c565 100644 --- a/app/res/values-nb/strings.xml +++ b/app/res/values-nb/strings.xml @@ -292,8 +292,8 @@ format og importeres i regnskapsprogrammet GnuCash for PC. KREDIT DEBET - Er du sikker at du vil slette ALLE transaksjonene? - Er du sikker at du vil slette denne transaksjonen? + Er du sikker at du vil slette ALLE transaksjonene? + Er du sikker at du vil slette denne transaksjonen? Eksport Eksportere alle transaksjoner Slette eksporterte transaksjoner @@ -386,9 +386,9 @@ format og importeres i regnskapsprogrammet GnuCash for PC. Alle Oppretter standard GnuCash kontostruktur Opprette standard kontoer - Nye kontoer vil bli opprettet i tillegg til eksisterende kontostruktur.\n\nHvis du vil erstatte de, slett de før du forsetter! + Nye kontoer vil bli opprettet i tillegg til eksisterende kontostruktur.\n\nHvis du vil erstatte de, slett de før du forsetter! - Velkommen til GnuCash Android! \nDu kan enten opprette et hieraki av de mest brukte kontoene, eller importere din egen GnuCash kontostruktur. \n\nBegge valgene er også tilgjengelige under Instillinger, så du kan velge senere. + Velkommen til GnuCash Android! \nDu kan enten opprette et hieraki av de mest brukte kontoene, eller importere din egen GnuCash kontostruktur. \n\nBegge valgene er også tilgjengelige under Instillinger, så du kan velge senere. NONE @@ -396,6 +396,6 @@ format og importeres i regnskapsprogrammet GnuCash for PC. UKENTLIG MÅNEDLIG - Scheduled Transactions + Scheduled Transactions Scheduled Transactions diff --git a/app/res/values-nl/strings.xml b/app/res/values-nl/strings.xml index 9925a2c73..be088a288 100644 --- a/app/res/values-nl/strings.xml +++ b/app/res/values-nl/strings.xml @@ -289,8 +289,8 @@ CREDIT DEBIT - Weet u zeker dat u alle transacties wil verwijderen? - Weet u zeker dat u deze transactie wil verwijderen? + Weet u zeker dat u alle transacties wil verwijderen? + Weet u zeker dat u deze transactie wil verwijderen? Exporteer Exporteer alle transacties Verwijder geëxporteerde transacties @@ -385,10 +385,10 @@ All Creates default GnuCash commonly-used account structure Create default accounts - New accounts will be created in addition to the existing + New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Welcome to GnuCash Android! \nYou can either create + Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. @@ -398,6 +398,6 @@ WEKELIJKSE MAANDELIJKS - Scheduled Transactions + Scheduled Transactions Scheduled Transactions diff --git a/app/res/values-pt-rBR/strings.xml b/app/res/values-pt-rBR/strings.xml index cdec1e112..a4e73d03c 100644 --- a/app/res/values-pt-rBR/strings.xml +++ b/app/res/values-pt-rBR/strings.xml @@ -288,8 +288,8 @@ CRÉDITO DÉBITO - Você tem certeza que quer deletar TODAS as transações? - Você tem certeza que quer deletar essa esta transação? + Você tem certeza que quer deletar TODAS as transações? + Você tem certeza que quer deletar essa esta transação? Exportar Exportar todas as transações Delear transações exportadas @@ -383,10 +383,10 @@ All Creates default GnuCash commonly-used account structure Create default accounts - New accounts will be created in addition to the existing + New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Welcome to GnuCash Android! \nYou can either create + Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. @@ -396,6 +396,6 @@ SEMANAL MENSAL - Scheduled Transactions + Scheduled Transactions Scheduled Transactions diff --git a/app/res/values-ru/strings.xml b/app/res/values-ru/strings.xml index ad473ee90..9b491b78f 100644 --- a/app/res/values-ru/strings.xml +++ b/app/res/values-ru/strings.xml @@ -289,8 +289,8 @@ КРЕДИТ ДЕБЕТ - Вы действительно хотите удалить ВСЕ проводки? - Вы действительно хотите удалить эту проводку? + Вы действительно хотите удалить ВСЕ проводки? + Вы действительно хотите удалить эту проводку? Экспорт Экспорт всех проводок Всегда удалять экспортированное @@ -381,11 +381,11 @@ Все Создание структуры счетов GnuCash по умолчанию Создание счетов по умолчанию - Новые счета + Новые счета будут созданы в дополнение к имеющейся структуре счетов.\n\nЕсли вы хотите заменить текущие счета, сперва их удалите! - Добро + Добро пожаловать в GnuCash для Android!\nВы можете как создать структуру часто используемых счетов, так и импортировать её из GnuCash.\n\nОбе возможности будут доступны из настроек приложения, если вы захотите @@ -397,6 +397,6 @@ ЕЖЕНЕДЕЛЬНЫЙ ЕЖЕМЕСЯЧНО - Scheduled Transactions + Scheduled Transactions Scheduled Transactions diff --git a/app/res/values-zh/strings.xml b/app/res/values-zh/strings.xml index 46ac3b48b..b70d4f7f2 100644 --- a/app/res/values-zh/strings.xml +++ b/app/res/values-zh/strings.xml @@ -288,8 +288,8 @@ 贷方 借方 - 确定删除所有交易? - 确定删除此项交易? + 确定删除所有交易? + 确定删除此项交易? 导出设置 导出所有交易 删除已导出的交易 @@ -382,10 +382,10 @@ 所有 创建通用的科目结构 创建默认科目 - 准备创建新的科目结构,这不会覆盖现有的科目,如果你想创建全新的科目结构请先删除旧的科目。 + 准备创建新的科目结构,这不会覆盖现有的科目,如果你想创建全新的科目结构请先删除旧的科目。 - 计划的交易 - 欢迎使用GnuCash Android! \n你可以选择:1)创建常用的科目结构,2)导入自定义的科目结构。\或者稍后再决定,两种选择也能在设置中找到。 + 计划的交易 + 欢迎使用GnuCash Android! \n你可以选择:1)创建常用的科目结构,2)导入自定义的科目结构。\或者稍后再决定,两种选择也能在设置中找到。 diff --git a/app/res/values/strings.xml b/app/res/values/strings.xml index c5444b399..840bfc11b 100644 --- a/app/res/values/strings.xml +++ b/app/res/values/strings.xml @@ -476,8 +476,8 @@ CREDIT DEBIT - Are you sure you want to delete ALL transactions? - Are you sure you want to delete this transaction? + Are you sure you want to delete ALL transactions? + Are you sure you want to delete this transaction? Export export_all_transactions Export all transactions @@ -619,11 +619,11 @@ create_default_accounts Creates default GnuCash commonly-used account structure Create default accounts - New accounts will be created in addition to the existing + New accounts will be created in addition to the existing account structure.\n\nIf you wish to replace currently existing accounts, delete them first before proceeding! - Scheduled Transactions - Welcome to GnuCash Android! \nYou can either create + Scheduled Transactions + Welcome to GnuCash Android! \nYou can either create a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also available in app Settings so you can decide later. diff --git a/app/src/org/gnucash/android/db/AccountsDbAdapter.java b/app/src/org/gnucash/android/db/AccountsDbAdapter.java index f67ee2592..66c97d524 100644 --- a/app/src/org/gnucash/android/db/AccountsDbAdapter.java +++ b/app/src/org/gnucash/android/db/AccountsDbAdapter.java @@ -18,10 +18,10 @@ import java.util.*; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Money; -import org.gnucash.android.data.Account.AccountType; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Money; +import org.gnucash.android.model.Account.AccountType; +import org.gnucash.android.model.Transaction; import android.content.ContentValues; import android.content.Context; diff --git a/app/src/org/gnucash/android/db/DatabaseHelper.java b/app/src/org/gnucash/android/db/DatabaseHelper.java index 49bc5fe03..5cc0fcf50 100644 --- a/app/src/org/gnucash/android/db/DatabaseHelper.java +++ b/app/src/org/gnucash/android/db/DatabaseHelper.java @@ -16,7 +16,7 @@ package org.gnucash.android.db; -import org.gnucash.android.data.Account.AccountType; +import org.gnucash.android.model.Account.AccountType; import android.content.ContentValues; import android.content.Context; diff --git a/app/src/org/gnucash/android/db/TransactionsDbAdapter.java b/app/src/org/gnucash/android/db/TransactionsDbAdapter.java index ad97dca58..f2c530473 100644 --- a/app/src/org/gnucash/android/db/TransactionsDbAdapter.java +++ b/app/src/org/gnucash/android/db/TransactionsDbAdapter.java @@ -21,9 +21,9 @@ import android.database.Cursor; import android.database.sqlite.SQLiteStatement; import android.util.Log; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Money; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Money; +import org.gnucash.android.model.Transaction; import java.math.BigDecimal; import java.util.ArrayList; diff --git a/app/src/org/gnucash/android/export/ExporterTask.java b/app/src/org/gnucash/android/export/ExporterTask.java index 8ba6b05ef..b322ee679 100644 --- a/app/src/org/gnucash/android/export/ExporterTask.java +++ b/app/src/org/gnucash/android/export/ExporterTask.java @@ -29,9 +29,10 @@ import android.widget.Toast; import org.gnucash.android.R; import org.gnucash.android.export.ofx.OfxExporter; +import org.gnucash.android.export.ofx.OfxHelper; import org.gnucash.android.export.qif.QifExporter; -import org.gnucash.android.ui.accounts.AccountsActivity; -import org.gnucash.android.ui.transactions.TransactionsDeleteConfirmationDialog; +import org.gnucash.android.ui.account.AccountsActivity; +import org.gnucash.android.ui.transaction.dialog.TransactionsDeleteConfirmationDialogFragment; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -168,8 +169,8 @@ protected void onPostExecute(Boolean exportResult) { android.support.v4.app.FragmentManager fragmentManager = ((FragmentActivity)mContext).getSupportFragmentManager(); Fragment currentFragment = fragmentManager .findFragmentByTag(AccountsActivity.FRAGMENT_ACCOUNTS_LIST); - TransactionsDeleteConfirmationDialog alertFragment = - TransactionsDeleteConfirmationDialog.newInstance(R.string.title_confirm_delete, 0); + TransactionsDeleteConfirmationDialogFragment alertFragment = + TransactionsDeleteConfirmationDialogFragment.newInstance(R.string.title_confirm_delete, 0); alertFragment.setTargetFragment(currentFragment, 0); alertFragment.show(fragmentManager, "transactions_delete_confirmation_dialog"); @@ -195,7 +196,7 @@ protected Document exportOfx(boolean exportAll) throws ParserConfigurationExcept Document document = docBuilder.newDocument(); Element root = document.createElement("OFX"); - ProcessingInstruction pi = document.createProcessingInstruction("OFX", OfxExporter.OFX_HEADER); + ProcessingInstruction pi = document.createProcessingInstruction("OFX", OfxHelper.OFX_HEADER); document.appendChild(pi); document.appendChild(root); @@ -239,7 +240,7 @@ private void writeOfxToExternalStorage(Document doc) throws IOException{ StringWriter stringWriter = new StringWriter(); write(ofxNode, stringWriter, true); - StringBuffer stringBuffer = new StringBuffer(OfxExporter.OFX_SGML_HEADER); + StringBuffer stringBuffer = new StringBuffer(OfxHelper.OFX_SGML_HEADER); stringBuffer.append('\n'); writer.write(stringBuffer.toString() + stringWriter.toString()); } diff --git a/app/src/org/gnucash/android/export/ofx/OfxExporter.java b/app/src/org/gnucash/android/export/ofx/OfxExporter.java index 439a4f59a..878c0c162 100644 --- a/app/src/org/gnucash/android/export/ofx/OfxExporter.java +++ b/app/src/org/gnucash/android/export/ofx/OfxExporter.java @@ -16,15 +16,10 @@ package org.gnucash.android.export.ofx; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; import java.util.List; -import java.util.Locale; -import java.util.TimeZone; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Transaction; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.TransactionsDbAdapter; import org.w3c.dom.Document; @@ -38,23 +33,7 @@ */ public class OfxExporter { - /** - * A date formatter used when creating file names for the exported data - */ - public final static SimpleDateFormat OFX_DATE_FORMATTER = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US); - - /** - * ID which will be used as the bank ID for OFX from this app - */ - public static String APP_ID = "org.gnucash.android"; - - /** - * The Transaction ID is usually the client ID sent in a request. - * Since the data exported is not as a result of a request, we use 0 - */ - public static final String UNSOLICITED_TRANSACTION_ID = "0"; - - /** + /** * List of accounts in the expense report */ private List mAccountsList; @@ -70,17 +49,7 @@ public class OfxExporter { */ private Context mContext; - /** - * Header for OFX documents - */ - public static final String OFX_HEADER = "OFXHEADER=\"200\" VERSION=\"211\" SECURITY=\"NONE\" OLDFILEUID=\"NONE\" NEWFILEUID=\"NONE\""; - - /** - * SGML header for OFX. Used for compatibility with desktop GnuCash - */ - public static final String OFX_SGML_HEADER = "ENCODING:UTF-8\nOFXHEADER:100\nDATA:OFXSGML\nVERSION:211\nSECURITY:NONE\nCHARSET:UTF-8\nCOMPRESSION:NONE\nOLDFILEUID:NONE\nNEWFILEUID:NONE"; - - /** + /** * Builds an XML representation of the {@link Account}s and {@link Transaction}s in the database * @param context Application context * @param exportAll Whether all transactions should be exported or only new ones since last export @@ -91,45 +60,21 @@ public OfxExporter(Context context, boolean exportAll) { mExportAll = exportAll; mContext = context; } - - /** - * Returns the current time formatted using the pattern in {@link #OFX_DATE_FORMATTER} - * @return Current time as a formatted string - * @see #getOfxFormattedTime(long) - */ - public static String getFormattedCurrentTime(){ - return getOfxFormattedTime(System.currentTimeMillis()); - } - - /** - * Returns a formatted string representation of time in milliseconds - * @param milliseconds Long value representing the time to be formatted - * @return Formatted string representation of time in milliseconds - */ - public static String getOfxFormattedTime(long milliseconds){ - Date date = new Date(milliseconds); - String dateString = OFX_DATE_FORMATTER.format(date); - TimeZone tz = Calendar.getInstance().getTimeZone(); - int offset = tz.getRawOffset(); - int hours = (int) (( offset / (1000*60*60)) % 24); - String sign = offset > 0 ? "+" : ""; - return dateString + "[" + sign + hours + ":" + tz.getDisplayName(false, TimeZone.SHORT, Locale.getDefault()) + "]"; - } - - /** + + /** * Converts all expenses into OFX XML format and adds them to the XML document * @param doc DOM document of the OFX expenses. * @param parent Parent node for all expenses in report */ public void toOfx(Document doc, Element parent){ - Element transactionUid = doc.createElement("TRNUID"); + Element transactionUid = doc.createElement(OfxHelper.TAG_TRANSACTION_UID); //unsolicited because the data exported is not as a result of a request - transactionUid.appendChild(doc.createTextNode(UNSOLICITED_TRANSACTION_ID)); + transactionUid.appendChild(doc.createTextNode(OfxHelper.UNSOLICITED_TRANSACTION_ID)); - Element statementTransactionResponse = doc.createElement("STMTTRNRS"); + Element statementTransactionResponse = doc.createElement(OfxHelper.TAG_STATEMENT_TRANSACTION_RESPONSE); statementTransactionResponse.appendChild(transactionUid); - Element bankmsgs = doc.createElement("BANKMSGSRSV1"); + Element bankmsgs = doc.createElement(OfxHelper.TAG_BANK_MESSAGES_V1); bankmsgs.appendChild(statementTransactionResponse); parent.appendChild(bankmsgs); diff --git a/app/src/org/gnucash/android/export/ofx/OfxHelper.java b/app/src/org/gnucash/android/export/ofx/OfxHelper.java new file mode 100644 index 000000000..9a23feca0 --- /dev/null +++ b/app/src/org/gnucash/android/export/ofx/OfxHelper.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2014 Ngewi Fet + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.gnucash.android.export.ofx; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; + +/** + * Helper class with collection of useful method and constants for the OFX export + * + * @author Ngewi Fet + */ +public class OfxHelper { + /** + * A date formatter used when creating file names for the exported data + */ + public final static SimpleDateFormat OFX_DATE_FORMATTER = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US); + + /** + * The Transaction ID is usually the client ID sent in a request. + * Since the data exported is not as a result of a request, we use 0 + */ + public static final String UNSOLICITED_TRANSACTION_ID = "0"; + + /** + * Header for OFX documents + */ + public static final String OFX_HEADER = "OFXHEADER=\"200\" VERSION=\"211\" SECURITY=\"NONE\" OLDFILEUID=\"NONE\" NEWFILEUID=\"NONE\""; + + /** + * SGML header for OFX. Used for compatibility with desktop GnuCash + */ + public static final String OFX_SGML_HEADER = "ENCODING:UTF-8\nOFXHEADER:100\nDATA:OFXSGML\nVERSION:211\nSECURITY:NONE\nCHARSET:UTF-8\nCOMPRESSION:NONE\nOLDFILEUID:NONE\nNEWFILEUID:NONE"; + + /* + * XML tag name constants for the OFX file + */ + public static final String TAG_TRANSACTION_UID = "TRNUID"; + public static final String TAG_BANK_MESSAGES_V1 = "BANKMSGSRSV1"; + public static final String TAG_CURRENCY_DEF = "CURDEF"; + public static final String TAG_BANK_ID = "BANKID"; + public static final String TAG_ACCOUNT_ID = "ACCTID"; + public static final String TAG_ACCOUNT_TYPE = "ACCTTYPE"; + public static final String TAG_BANK_ACCOUNT_FROM = "BANKACCTFROM"; + public static final String TAG_BALANCE_AMOUNT = "BALAMT"; + public static final String TAG_DATE_AS_OF = "DTASOF"; + public static final String TAG_LEDGER_BALANCE = "LEDGERBAL"; + public static final String TAG_DATE_START = "DTSTART"; + public static final String TAG_DATE_END = "DTEND"; + public static final String TAG_TRANSACTION_TYPE = "TRNTYPE"; + public static final String TAG_DATE_POSTED = "DTPOSTED"; + public static final String TAG_DATE_USER = "DTUSER"; + public static final String TAG_TRANSACTION_AMOUNT = "TRNAMT"; + public static final String TAG_TRANSACTION_FITID = "FITID"; + public static final String TAG_NAME = "NAME"; + public static final String TAG_MEMO = "MEMO"; + public static final String TAG_BANK_ACCOUNT_TO = "BANKACCTTO"; + public static final String TAG_BANK_TRANSACTION_LIST = "BANKTRANLIST"; + public static final String TAG_STATEMENT_TRANSACTIONS = "STMTRS"; + public static final String TAG_STATEMENT_TRANSACTION = "STMTTRN"; + public static final String TAG_STATEMENT_TRANSACTION_RESPONSE = "STMTTRNRS"; + + + /** + * ID which will be used as the bank ID for OFX from this app + */ + public static String APP_ID = "org.gnucash.android"; + + /** + * Returns the current time formatted using the pattern in {@link #OFX_DATE_FORMATTER} + * @return Current time as a formatted string + * @see #getOfxFormattedTime(long) + */ + public static String getFormattedCurrentTime(){ + return getOfxFormattedTime(System.currentTimeMillis()); + } + + /** + * Returns a formatted string representation of time in milliseconds + * @param milliseconds Long value representing the time to be formatted + * @return Formatted string representation of time in milliseconds + */ + public static String getOfxFormattedTime(long milliseconds){ + Date date = new Date(milliseconds); + String dateString = OFX_DATE_FORMATTER.format(date); + TimeZone tz = Calendar.getInstance().getTimeZone(); + int offset = tz.getRawOffset(); + int hours = (int) (( offset / (1000*60*60)) % 24); + String sign = offset > 0 ? "+" : ""; + return dateString + "[" + sign + hours + ":" + tz.getDisplayName(false, TimeZone.SHORT, Locale.getDefault()) + "]"; + } +} diff --git a/app/src/org/gnucash/android/export/qif/QifExporter.java b/app/src/org/gnucash/android/export/qif/QifExporter.java index 71dbb23cd..c2209700c 100644 --- a/app/src/org/gnucash/android/export/qif/QifExporter.java +++ b/app/src/org/gnucash/android/export/qif/QifExporter.java @@ -16,7 +16,7 @@ package org.gnucash.android.export.qif; import android.content.Context; -import org.gnucash.android.data.Account; +import org.gnucash.android.model.Account; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.TransactionsDbAdapter; diff --git a/app/src/org/gnucash/android/export/qif/QifHelper.java b/app/src/org/gnucash/android/export/qif/QifHelper.java index 1ca72be62..37c83af0c 100644 --- a/app/src/org/gnucash/android/export/qif/QifHelper.java +++ b/app/src/org/gnucash/android/export/qif/QifHelper.java @@ -18,7 +18,7 @@ import org.gnucash.android.R; import org.gnucash.android.app.GnuCashApplication; -import org.gnucash.android.data.Account; +import org.gnucash.android.model.Account; import java.text.SimpleDateFormat; import java.util.Currency; diff --git a/app/src/org/gnucash/android/data/Account.java b/app/src/org/gnucash/android/model/Account.java similarity index 94% rename from app/src/org/gnucash/android/data/Account.java rename to app/src/org/gnucash/android/model/Account.java index 6e4a6e8d6..1f25a99dc 100644 --- a/app/src/org/gnucash/android/data/Account.java +++ b/app/src/org/gnucash/android/model/Account.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package org.gnucash.android.data; +package org.gnucash.android.model; import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.db.AccountsDbAdapter; -import org.gnucash.android.export.ofx.OfxExporter; +import org.gnucash.android.export.ofx.OfxHelper; import org.gnucash.android.export.qif.QifHelper; -import org.gnucash.android.data.Transaction.TransactionType; +import org.gnucash.android.model.Transaction.TransactionType; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -500,22 +500,22 @@ public static OfxAccountType convertToOfxAccountType(AccountType accountType){ * @param parent Parent node to which to add this account's transactions in XML */ public void toOfx(Document doc, Element parent, boolean exportAllTransactions){ - Element currency = doc.createElement("CURDEF"); + Element currency = doc.createElement(OfxHelper.TAG_CURRENCY_DEF); currency.appendChild(doc.createTextNode(mCurrency.getCurrencyCode())); //================= BEGIN BANK ACCOUNT INFO (BANKACCTFROM) ================================= - Element bankId = doc.createElement("BANKID"); - bankId.appendChild(doc.createTextNode(OfxExporter.APP_ID)); + Element bankId = doc.createElement(OfxHelper.TAG_BANK_ID); + bankId.appendChild(doc.createTextNode(OfxHelper.APP_ID)); - Element acctId = doc.createElement("ACCTID"); + Element acctId = doc.createElement(OfxHelper.TAG_ACCOUNT_ID); acctId.appendChild(doc.createTextNode(mUID)); - Element accttype = doc.createElement("ACCTTYPE"); + Element accttype = doc.createElement(OfxHelper.TAG_ACCOUNT_TYPE); String ofxAccountType = convertToOfxAccountType(mAccountType).toString(); accttype.appendChild(doc.createTextNode(ofxAccountType)); - Element bankFrom = doc.createElement("BANKACCTFROM"); + Element bankFrom = doc.createElement(OfxHelper.TAG_BANK_ACCOUNT_FROM); bankFrom.appendChild(bankId); bankFrom.appendChild(acctId); bankFrom.appendChild(accttype); @@ -525,14 +525,14 @@ public void toOfx(Document doc, Element parent, boolean exportAllTransactions){ //================= BEGIN ACCOUNT BALANCE INFO ================================= String balance = getBalance().toPlainString(); - String formattedCurrentTimeString = OfxExporter.getFormattedCurrentTime(); + String formattedCurrentTimeString = OfxHelper.getFormattedCurrentTime(); - Element balanceAmount = doc.createElement("BALAMT"); + Element balanceAmount = doc.createElement(OfxHelper.TAG_BALANCE_AMOUNT); balanceAmount.appendChild(doc.createTextNode(balance)); - Element dtasof = doc.createElement("DTASOF"); + Element dtasof = doc.createElement(OfxHelper.TAG_DATE_AS_OF); dtasof.appendChild(doc.createTextNode(formattedCurrentTimeString)); - Element ledgerBalance = doc.createElement("LEDGERBAL"); + Element ledgerBalance = doc.createElement(OfxHelper.TAG_LEDGER_BALANCE); ledgerBalance.appendChild(balanceAmount); ledgerBalance.appendChild(dtasof); @@ -541,17 +541,17 @@ public void toOfx(Document doc, Element parent, boolean exportAllTransactions){ //================= BEGIN TIME PERIOD INFO ================================= - Element dtstart = doc.createElement("DTSTART"); + Element dtstart = doc.createElement(OfxHelper.TAG_DATE_START); dtstart.appendChild(doc.createTextNode(formattedCurrentTimeString)); - Element dtend = doc.createElement("DTEND"); + Element dtend = doc.createElement(OfxHelper.TAG_DATE_END); dtend.appendChild(doc.createTextNode(formattedCurrentTimeString)); //================= END TIME PERIOD INFO ================================= //================= BEGIN TRANSACTIONS LIST ================================= - Element bankTransactionsList = doc.createElement("BANKTRANLIST"); + Element bankTransactionsList = doc.createElement(OfxHelper.TAG_BANK_TRANSACTION_LIST); bankTransactionsList.appendChild(dtstart); bankTransactionsList.appendChild(dtend); @@ -563,7 +563,7 @@ public void toOfx(Document doc, Element parent, boolean exportAllTransactions){ } //================= END TRANSACTIONS LIST ================================= - Element statementTransactions = doc.createElement("STMTRS"); + Element statementTransactions = doc.createElement(OfxHelper.TAG_STATEMENT_TRANSACTIONS); statementTransactions.appendChild(currency); statementTransactions.appendChild(bankFrom); statementTransactions.appendChild(bankTransactionsList); diff --git a/app/src/org/gnucash/android/data/Money.java b/app/src/org/gnucash/android/model/Money.java similarity index 99% rename from app/src/org/gnucash/android/data/Money.java rename to app/src/org/gnucash/android/model/Money.java index dca7499fc..3ef535a4c 100644 --- a/app/src/org/gnucash/android/data/Money.java +++ b/app/src/org/gnucash/android/model/Money.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.data; +package org.gnucash.android.model; import java.math.BigDecimal; import java.math.MathContext; diff --git a/app/src/org/gnucash/android/data/Transaction.java b/app/src/org/gnucash/android/model/Transaction.java similarity index 92% rename from app/src/org/gnucash/android/data/Transaction.java rename to app/src/org/gnucash/android/model/Transaction.java index b48441f3f..0456b75bf 100644 --- a/app/src/org/gnucash/android/data/Transaction.java +++ b/app/src/org/gnucash/android/model/Transaction.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.data; +package org.gnucash.android.model; import java.math.BigDecimal; import java.util.Currency; @@ -23,9 +23,9 @@ import java.util.UUID; import org.gnucash.android.app.GnuCashApplication; -import org.gnucash.android.data.Account.OfxAccountType; +import org.gnucash.android.model.Account.OfxAccountType; import org.gnucash.android.db.AccountsDbAdapter; -import org.gnucash.android.export.ofx.OfxExporter; +import org.gnucash.android.export.ofx.OfxHelper; import org.gnucash.android.export.qif.QifHelper; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -425,55 +425,55 @@ public void setRecurrencePeriod(long recurrenceId) { * @return Element in DOM corresponding to transaction */ public Element toOfx(Document doc, String accountUID){ - Element transactionNode = doc.createElement("STMTTRN"); - Element type = doc.createElement("TRNTYPE"); + Element transactionNode = doc.createElement(OfxHelper.TAG_STATEMENT_TRANSACTION); + Element type = doc.createElement(OfxHelper.TAG_TRANSACTION_TYPE); type.appendChild(doc.createTextNode(mType.toString())); transactionNode.appendChild(type); - Element datePosted = doc.createElement("DTPOSTED"); - datePosted.appendChild(doc.createTextNode(OfxExporter.getOfxFormattedTime(mTimestamp))); + Element datePosted = doc.createElement(OfxHelper.TAG_DATE_POSTED); + datePosted.appendChild(doc.createTextNode(OfxHelper.getOfxFormattedTime(mTimestamp))); transactionNode.appendChild(datePosted); - Element dateUser = doc.createElement("DTUSER"); + Element dateUser = doc.createElement(OfxHelper.TAG_DATE_USER); dateUser.appendChild(doc.createTextNode( - OfxExporter.getOfxFormattedTime(mTimestamp))); + OfxHelper.getOfxFormattedTime(mTimestamp))); transactionNode.appendChild(dateUser); - Element amount = doc.createElement("TRNAMT"); + Element amount = doc.createElement(OfxHelper.TAG_TRANSACTION_AMOUNT); amount.appendChild(doc.createTextNode(mAmount.toPlainString())); transactionNode.appendChild(amount); - Element transID = doc.createElement("FITID"); + Element transID = doc.createElement(OfxHelper.TAG_TRANSACTION_FITID); transID.appendChild(doc.createTextNode(mTransactionUID)); transactionNode.appendChild(transID); - Element name = doc.createElement("NAME"); + Element name = doc.createElement(OfxHelper.TAG_NAME); name.appendChild(doc.createTextNode(mName)); transactionNode.appendChild(name); if (mDescription != null && mDescription.length() > 0){ - Element memo = doc.createElement("MEMO"); + Element memo = doc.createElement(OfxHelper.TAG_MEMO); memo.appendChild(doc.createTextNode(mDescription)); transactionNode.appendChild(memo); } if (mDoubleEntryAccountUID != null && mDoubleEntryAccountUID.length() > 0){ - Element bankId = doc.createElement("BANKID"); - bankId.appendChild(doc.createTextNode(OfxExporter.APP_ID)); + Element bankId = doc.createElement(OfxHelper.TAG_BANK_ID); + bankId.appendChild(doc.createTextNode(OfxHelper.APP_ID)); //select the proper account as the double account String doubleAccountUID = mDoubleEntryAccountUID.equals(accountUID) ? mAccountUID : mDoubleEntryAccountUID; - Element acctId = doc.createElement("ACCTID"); + Element acctId = doc.createElement(OfxHelper.TAG_ACCOUNT_ID); acctId.appendChild(doc.createTextNode(doubleAccountUID)); - Element accttype = doc.createElement("ACCTTYPE"); + Element accttype = doc.createElement(OfxHelper.TAG_ACCOUNT_TYPE); AccountsDbAdapter acctDbAdapter = new AccountsDbAdapter(GnuCashApplication.getAppContext()); OfxAccountType ofxAccountType = Account.convertToOfxAccountType(acctDbAdapter.getAccountType(doubleAccountUID)); accttype.appendChild(doc.createTextNode(ofxAccountType.toString())); acctDbAdapter.close(); - Element bankAccountTo = doc.createElement("BANKACCTTO"); + Element bankAccountTo = doc.createElement(OfxHelper.TAG_BANK_ACCOUNT_TO); bankAccountTo.appendChild(bankId); bankAccountTo.appendChild(acctId); bankAccountTo.appendChild(accttype); @@ -499,7 +499,7 @@ public String toQIF(){ splitAccountFullName = accountsDbAdapter.getFullyQualifiedAccountName(mDoubleEntryAccountUID); } - StringBuffer transactionQifBuffer = new StringBuffer(); + StringBuilder transactionQifBuffer = new StringBuilder(); transactionQifBuffer.append(QifHelper.DATE_PREFIX).append(QifHelper.formatDate(mTimestamp)).append(newLine); transactionQifBuffer.append(QifHelper.MEMO_PREFIX).append(mName).append(newLine); @@ -518,7 +518,7 @@ public String toQIF(){ * Creates an Intent with arguments from the transaction. * This intent can be broadcast to create a new transaction * @param transaction Transaction used to create intent - * @return + * @return Intent with transaction details as extras */ public static Intent createIntent(Transaction transaction){ Intent intent = new Intent(Intent.ACTION_INSERT); diff --git a/app/src/org/gnucash/android/receivers/AccountCreator.java b/app/src/org/gnucash/android/receivers/AccountCreator.java index 0fa57e46f..768db160c 100644 --- a/app/src/org/gnucash/android/receivers/AccountCreator.java +++ b/app/src/org/gnucash/android/receivers/AccountCreator.java @@ -18,7 +18,7 @@ import java.util.Currency; -import org.gnucash.android.data.Account; +import org.gnucash.android.model.Account; import org.gnucash.android.db.AccountsDbAdapter; import android.content.BroadcastReceiver; diff --git a/app/src/org/gnucash/android/receivers/TransactionAppWidgetProvider.java b/app/src/org/gnucash/android/receivers/TransactionAppWidgetProvider.java index 06b1cd874..52435d7ec 100644 --- a/app/src/org/gnucash/android/receivers/TransactionAppWidgetProvider.java +++ b/app/src/org/gnucash/android/receivers/TransactionAppWidgetProvider.java @@ -15,7 +15,7 @@ */ package org.gnucash.android.receivers; -import org.gnucash.android.ui.transactions.TransactionsListFragment; +import org.gnucash.android.ui.UxArgument; import org.gnucash.android.ui.widget.WidgetConfigurationActivity; import android.appwidget.AppWidgetManager; @@ -45,7 +45,7 @@ public void onUpdate(Context context, AppWidgetManager appWidgetManager, long accountId = PreferenceManager .getDefaultSharedPreferences(context) - .getLong(TransactionsListFragment.SELECTED_ACCOUNT_ID + appWidgetId, -1); + .getLong(UxArgument.SELECTED_ACCOUNT_ID + appWidgetId, -1); if (accountId <= 0) return; @@ -66,7 +66,7 @@ public void onDeleted(Context context, int[] appWidgetIds) { Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); for (int appWidgetId : appWidgetIds) { - editor.remove(TransactionsListFragment.SELECTED_ACCOUNT_ID + appWidgetId); + editor.remove(UxArgument.SELECTED_ACCOUNT_ID + appWidgetId); } editor.commit(); } diff --git a/app/src/org/gnucash/android/receivers/TransactionRecorder.java b/app/src/org/gnucash/android/receivers/TransactionRecorder.java index 2aa0e3235..5ecf87324 100644 --- a/app/src/org/gnucash/android/receivers/TransactionRecorder.java +++ b/app/src/org/gnucash/android/receivers/TransactionRecorder.java @@ -19,12 +19,10 @@ import java.math.BigDecimal; import java.util.Currency; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Money; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Money; +import org.gnucash.android.model.Transaction; import org.gnucash.android.db.TransactionsDbAdapter; -import org.gnucash.android.export.ofx.OfxExporter; -import org.gnucash.android.export.qif.QifExporter; import org.gnucash.android.export.qif.QifHelper; import org.gnucash.android.ui.widget.WidgetConfigurationActivity; diff --git a/app/src/org/gnucash/android/ui/UxArgument.java b/app/src/org/gnucash/android/ui/UxArgument.java new file mode 100644 index 000000000..049c945a7 --- /dev/null +++ b/app/src/org/gnucash/android/ui/UxArgument.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014 Ngewi Fet + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.gnucash.android.ui; + +/** + * Collection of constants which are passed across multiple pieces of the UI (fragments, activities, dialogs) + * + * @author Ngewi Fet + */ +public final class UxArgument { + + /** + * Arguments key for database ID of transaction. + * Is used to pass a transaction ID into a bundle or intent + */ + public static final String SELECTED_TRANSACTION_ID = "selected_transaction_id"; + + /** + * Key for passing the selected account ID as an argument in a bundle or intent + */ + public static final String SELECTED_ACCOUNT_ID = "selected_account_id"; + + /** + * Key for passing list of IDs selected transactions as an argument in a bundle or intent + */ + public static final String SELECTED_TRANSACTION_IDS = "selected_transactions"; + + /** + * Key for the origin account as argument when moving accounts + */ + public static final String ORIGIN_ACCOUNT_ID = "origin_acccount_id"; + + /** + * Key for passing argument for the parent account ID. + */ + public static final String PARENT_ACCOUNT_ID = "parent_account_id"; + + //prevent initialization of instances of this class + private UxArgument(){ + //prevent even the native class from calling the ctor + throw new AssertionError(); + } +} diff --git a/app/src/org/gnucash/android/ui/accounts/AddAccountFragment.java b/app/src/org/gnucash/android/ui/account/AccountFormFragment.java similarity index 97% rename from app/src/org/gnucash/android/ui/accounts/AddAccountFragment.java rename to app/src/org/gnucash/android/ui/account/AccountFormFragment.java index a1ed79b2a..3401ef9e2 100644 --- a/app/src/org/gnucash/android/ui/accounts/AddAccountFragment.java +++ b/app/src/org/gnucash/android/ui/account/AccountFormFragment.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.ui.accounts; +package org.gnucash.android.ui.account; import java.util.Arrays; import java.util.Currency; @@ -29,14 +29,14 @@ import android.preference.PreferenceManager; import android.support.v4.app.FragmentManager; import org.gnucash.android.R; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Money; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Money; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.DatabaseHelper; +import org.gnucash.android.ui.UxArgument; import org.gnucash.android.ui.colorpicker.ColorPickerDialog; import org.gnucash.android.ui.colorpicker.ColorPickerSwatch; import org.gnucash.android.ui.colorpicker.ColorSquare; -import org.gnucash.android.ui.transactions.TransactionsListFragment; import android.content.Context; import android.database.Cursor; @@ -64,7 +64,7 @@ * Fragment used for creating and editing accounts * @author Ngewi Fet */ -public class AddAccountFragment extends SherlockFragment { +public class AccountFormFragment extends SherlockFragment { /** * Tag for the color picker dialog fragment @@ -127,7 +127,7 @@ public class AddAccountFragment extends SherlockFragment { /** * Spinner for the account type - * @see org.gnucash.android.data.Account.AccountType + * @see org.gnucash.android.model.Account.AccountType */ private Spinner mAccountTypeSpinner; @@ -183,7 +183,7 @@ public void onColorSelected(int color) { * Default constructor * Required, else the app crashes on screen rotation */ - public AddAccountFragment() { + public AccountFormFragment() { //nothing to see here, move along } @@ -192,8 +192,8 @@ public AddAccountFragment() { * @param dbAdapter {@link AccountsDbAdapter} for saving the account * @return New instance of the dialog fragment */ - static public AddAccountFragment newInstance(AccountsDbAdapter dbAdapter){ - AddAccountFragment f = new AddAccountFragment(); + static public AccountFormFragment newInstance(AccountsDbAdapter dbAdapter){ + AccountFormFragment f = new AccountFormFragment(); f.mAccountsDbAdapter = dbAdapter; return f; } @@ -274,7 +274,7 @@ public void onActivityCreated(Bundle savedInstanceState) { currencyArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mCurrencySpinner.setAdapter(currencyArrayAdapter); - mSelectedAccountId = getArguments().getLong(TransactionsListFragment.SELECTED_ACCOUNT_ID); + mSelectedAccountId = getArguments().getLong(UxArgument.SELECTED_ACCOUNT_ID); if (mSelectedAccountId > 0) { mAccount = mAccountsDbAdapter.getAccount(mSelectedAccountId); getSherlockActivity().getSupportActionBar().setTitle(R.string.title_edit_account); @@ -326,7 +326,7 @@ private void initializeViewsWithAccount(Account account){ private void initializeViews(){ setSelectedCurrency(Money.DEFAULT_CURRENCY_CODE); mColorSquare.setBackgroundColor(Color.LTGRAY); - long parentAccountId = getArguments().getLong(AccountsListFragment.ARG_PARENT_ACCOUNT_ID); + long parentAccountId = getArguments().getLong(UxArgument.PARENT_ACCOUNT_ID); setParentAccountSelection(parentAccountId); /* This snippet causes the child account to default to same color as parent. Not sure if we want that diff --git a/app/src/org/gnucash/android/ui/accounts/AccountsActivity.java b/app/src/org/gnucash/android/ui/account/AccountsActivity.java similarity index 92% rename from app/src/org/gnucash/android/ui/accounts/AccountsActivity.java rename to app/src/org/gnucash/android/ui/account/AccountsActivity.java index 47ea2ce63..bf5769bef 100644 --- a/app/src/org/gnucash/android/ui/accounts/AccountsActivity.java +++ b/app/src/org/gnucash/android/ui/account/AccountsActivity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.ui.accounts; +package org.gnucash.android.ui.account; import android.app.AlertDialog; import android.app.ProgressDialog; @@ -46,14 +46,14 @@ import com.actionbarsherlock.view.MenuItem; import com.viewpagerindicator.TitlePageIndicator; import org.gnucash.android.R; -import org.gnucash.android.data.Money; -import org.gnucash.android.ui.Refreshable; +import org.gnucash.android.model.Money; +import org.gnucash.android.ui.util.Refreshable; +import org.gnucash.android.ui.UxArgument; import org.gnucash.android.ui.settings.SettingsActivity; -import org.gnucash.android.ui.transactions.ScheduledTransactionsListFragment; -import org.gnucash.android.ui.transactions.TransactionsActivity; -import org.gnucash.android.ui.transactions.TransactionsListFragment; +import org.gnucash.android.ui.transaction.ScheduledTransactionsListFragment; +import org.gnucash.android.ui.transaction.TransactionsActivity; import org.gnucash.android.util.GnucashAccountXmlHandler; -import org.gnucash.android.util.OnAccountClickedListener; +import org.gnucash.android.ui.util.OnAccountClickedListener; import java.io.FileNotFoundException; import java.io.InputStream; @@ -71,7 +71,17 @@ public class AccountsActivity extends SherlockFragmentActivity implements OnAcco /** * Tag used for identifying the account list fragment when it is added to this activity */ - public static final String FRAGMENT_ACCOUNTS_LIST = "accounts_list"; + public static final String FRAGMENT_ACCOUNTS_LIST = "accounts_list_fragment"; + + /** + * Request code for GnuCash account structure file to import + */ + public static final int REQUEST_PICK_ACCOUNTS_FILE = 0x1; + + /** + * Request code for opening the account to edit + */ + public static final int REQUEST_EDIT_ACCOUNT = 0x10; /** * Tag used for identifying the account export fragment @@ -86,7 +96,7 @@ public class AccountsActivity extends SherlockFragmentActivity implements OnAcco /** * Logging tag */ - protected static final String TAG = "AccountsActivity"; + protected static final String LOG_TAG = "AccountsActivity"; /** * Intent action for viewing recurring transactions @@ -201,11 +211,11 @@ public void onCreate(Bundle savedInstanceState) { pager.setVisibility(View.GONE); titlePageIndicator.setVisibility(View.GONE); - long accountId = intent.getLongExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, 0L); + long accountId = intent.getLongExtra(UxArgument.SELECTED_ACCOUNT_ID, 0L); if (accountId > 0) showEditAccountFragment(accountId); else { - long parentAccountId = intent.getLongExtra(AccountsListFragment.ARG_PARENT_ACCOUNT_ID, 0L); + long parentAccountId = intent.getLongExtra(UxArgument.PARENT_ACCOUNT_ID, 0L); showAddAccountFragment(parentAccountId); } } else if (action != null && action.equals(ACTION_VIEW_RECURRING)) { @@ -237,7 +247,7 @@ private void init() { currencyCode = prefs.getString(getString(R.string.key_default_currency), Currency.getInstance(locale).getCurrencyCode()); } catch (Exception e) { - Log.e(TAG, e.getMessage()); + Log.e(LOG_TAG, e.getMessage()); currencyCode = "USD"; //just use USD and let the user choose } @@ -354,7 +364,7 @@ private Intent createNewAccountIntent(){ */ private void showAddAccountFragment(long parentAccountId){ Bundle args = new Bundle(); - args.putLong(AccountsListFragment.ARG_PARENT_ACCOUNT_ID, parentAccountId); + args.putLong(UxArgument.PARENT_ACCOUNT_ID, parentAccountId); showAccountFormFragment(args); } @@ -379,7 +389,7 @@ private void showRecurringTransactionsFragment(){ */ private void showEditAccountFragment(long accountId) { Bundle args = new Bundle(); - args.putLong(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountId); + args.putLong(UxArgument.SELECTED_ACCOUNT_ID, accountId); showAccountFormFragment(args); } @@ -393,11 +403,11 @@ private void showAccountFormFragment(Bundle args){ FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); - AddAccountFragment newAccountFragment = AddAccountFragment.newInstance(null); - newAccountFragment.setArguments(args); + AccountFormFragment accountFormFragment = AccountFormFragment.newInstance(null); + accountFormFragment.setArguments(args); fragmentTransaction.replace(R.id.fragment_container, - newAccountFragment, AccountsActivity.FRAGMENT_NEW_ACCOUNT); + accountFormFragment, AccountsActivity.FRAGMENT_NEW_ACCOUNT); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); @@ -417,7 +427,7 @@ public void onNewAccountClick(View v) { private void createDefaultAccounts(){ AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.title_default_accounts); - builder.setMessage(R.string.message_confirm_create_default_accounts_first_run); + builder.setMessage(R.string.msg_confirm_create_default_accounts_first_run); builder.setPositiveButton(R.string.btn_create_accounts, new DialogInterface.OnClickListener() { @@ -459,7 +469,7 @@ public void importAccounts() { pickIntent.setType("application/octet-stream"); Intent chooser = Intent.createChooser(pickIntent, "Select GnuCash account file"); - startActivityForResult(chooser, AccountsListFragment.REQUEST_PICK_ACCOUNTS_FILE); + startActivityForResult(chooser, REQUEST_PICK_ACCOUNTS_FILE); } @@ -471,7 +481,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } switch (requestCode){ - case AccountsListFragment.REQUEST_PICK_ACCOUNTS_FILE: + case REQUEST_PICK_ACCOUNTS_FILE: try { InputStream accountInputStream = getContentResolver().openInputStream(data.getData()); new AccountImporterTask(this).execute(accountInputStream); @@ -497,7 +507,7 @@ public static void start(Context context){ public void accountSelected(long accountRowId) { Intent intent = new Intent(this, TransactionsActivity.class); intent.setAction(Intent.ACTION_VIEW); - intent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountRowId); + intent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, accountRowId); startActivity(intent); } diff --git a/app/src/org/gnucash/android/ui/accounts/AccountsListFragment.java b/app/src/org/gnucash/android/ui/account/AccountsListFragment.java similarity index 93% rename from app/src/org/gnucash/android/ui/accounts/AccountsListFragment.java rename to app/src/org/gnucash/android/ui/account/AccountsListFragment.java index cf8e1cf00..5863897ed 100644 --- a/app/src/org/gnucash/android/ui/accounts/AccountsListFragment.java +++ b/app/src/org/gnucash/android/ui/account/AccountsListFragment.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.ui.accounts; +package org.gnucash.android.ui.account; import android.app.Activity; import android.app.AlertDialog; @@ -52,16 +52,15 @@ import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import org.gnucash.android.R; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Money; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Money; import org.gnucash.android.db.*; import org.gnucash.android.export.ExportDialogFragment; -import org.gnucash.android.ui.Refreshable; -import org.gnucash.android.ui.settings.SettingsActivity; -import org.gnucash.android.ui.transactions.TransactionsActivity; -import org.gnucash.android.ui.transactions.TransactionsListFragment; +import org.gnucash.android.ui.util.Refreshable; +import org.gnucash.android.ui.UxArgument; +import org.gnucash.android.ui.transaction.TransactionsActivity; import org.gnucash.android.ui.widget.WidgetConfigurationActivity; -import org.gnucash.android.util.OnAccountClickedListener; +import org.gnucash.android.ui.util.OnAccountClickedListener; import java.lang.ref.WeakReference; @@ -90,22 +89,6 @@ public enum DisplayMode { */ private DisplayMode mDisplayMode = DisplayMode.TOP_LEVEL; - /** - * Request code for GnuCash account structure file to import - */ - public static final int REQUEST_PICK_ACCOUNTS_FILE = 0x1; - - /** - * Request code for opening the account to edit - */ - private static final int REQUEST_EDIT_ACCOUNT = 0x10; - - /** - * Key for passing argument for the parent account ID. - * When this argument is set, only sub-accounts of the account will be loaded. - */ - public static final String ARG_PARENT_ACCOUNT_ID = "parent_account_id"; - /** * Logging tag */ @@ -224,7 +207,7 @@ public void onCreate(Bundle savedInstanceState) { Bundle args = getArguments(); if (args != null) - mParentAccountId = args.getLong(ARG_PARENT_ACCOUNT_ID); + mParentAccountId = args.getLong(UxArgument.PARENT_ACCOUNT_ID); mAccountsDbAdapter = new AccountsDbAdapter(getActivity()); mAccountsCursorAdapter = new AccountsCursorAdapter( @@ -392,8 +375,8 @@ public boolean onOptionsItemSelected(MenuItem item) { case R.id.menu_add_account: Intent addAccountIntent = new Intent(getActivity(), AccountsActivity.class); addAccountIntent.setAction(Intent.ACTION_INSERT_OR_EDIT); - addAccountIntent.putExtra(AccountsListFragment.ARG_PARENT_ACCOUNT_ID, mParentAccountId); - startActivityForResult(addAccountIntent, REQUEST_EDIT_ACCOUNT); + addAccountIntent.putExtra(UxArgument.PARENT_ACCOUNT_ID, mParentAccountId); + startActivityForResult(addAccountIntent, AccountsActivity.REQUEST_EDIT_ACCOUNT); return true; case R.id.menu_export: @@ -407,7 +390,7 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override public void refresh(long parentAccountId) { - getArguments().putLong(ARG_PARENT_ACCOUNT_ID, parentAccountId); + getArguments().putLong(UxArgument.PARENT_ACCOUNT_ID, parentAccountId); refresh(); } @@ -455,12 +438,12 @@ public void showAddAccountFragment(long accountId) { .beginTransaction(); Bundle args = new Bundle(); - args.putLong(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountId); - AddAccountFragment newAccountFragment = AddAccountFragment.newInstance(mAccountsDbAdapter); - newAccountFragment.setArguments(args); + args.putLong(UxArgument.SELECTED_ACCOUNT_ID, accountId); + AccountFormFragment accountFormFragment = AccountFormFragment.newInstance(mAccountsDbAdapter); + accountFormFragment.setArguments(args); fragmentTransaction.replace(R.id.fragment_container, - newAccountFragment, AccountsActivity.FRAGMENT_NEW_ACCOUNT); + accountFormFragment, AccountsActivity.FRAGMENT_NEW_ACCOUNT); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); @@ -474,8 +457,8 @@ public void showAddAccountFragment(long accountId) { public void openCreateOrEditActivity(long accountId){ Intent editAccountIntent = new Intent(AccountsListFragment.this.getActivity(), AccountsActivity.class); editAccountIntent.setAction(Intent.ACTION_INSERT_OR_EDIT); - editAccountIntent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountId); - startActivityForResult(editAccountIntent, REQUEST_EDIT_ACCOUNT); + editAccountIntent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, accountId); + startActivityForResult(editAccountIntent, AccountsActivity.REQUEST_EDIT_ACCOUNT); } /** @@ -499,7 +482,7 @@ public void showExportDialog() { public Loader onCreateLoader(int id, Bundle args) { Log.d(TAG, "Creating the accounts loader"); Bundle fragmentArguments = getArguments(); - long accountId = fragmentArguments == null ? -1 : fragmentArguments.getLong(ARG_PARENT_ACCOUNT_ID); + long accountId = fragmentArguments == null ? -1 : fragmentArguments.getLong(UxArgument.PARENT_ACCOUNT_ID); if (mCurrentFilter != null){ return new AccountsCursorLoader(getActivity(), mCurrentFilter); @@ -563,7 +546,7 @@ public static DeleteConfirmationDialogFragment newInstance(int title, long id) { DeleteConfirmationDialogFragment frag = new DeleteConfirmationDialogFragment(); Bundle args = new Bundle(); args.putInt("title", title); - args.putLong(TransactionsListFragment.SELECTED_ACCOUNT_ID, id); + args.putLong(UxArgument.SELECTED_ACCOUNT_ID, id); frag.setArguments(args); return frag; } @@ -571,7 +554,7 @@ public static DeleteConfirmationDialogFragment newInstance(int title, long id) { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { int title = getArguments().getInt("title"); - final long rowId = getArguments().getLong(TransactionsListFragment.SELECTED_ACCOUNT_ID); + final long rowId = getArguments().getLong(UxArgument.SELECTED_ACCOUNT_ID); LayoutInflater layoutInflater = getSherlockActivity().getLayoutInflater(); final View dialogLayout = layoutInflater.inflate(R.layout.dialog_account_delete, (ViewGroup) getView()); AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()) @@ -740,7 +723,7 @@ public void bindView(View v, Context context, Cursor cursor) { public void onClick(View v) { Intent intent = new Intent(getActivity(), TransactionsActivity.class); intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - intent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountId); + intent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, accountId); getActivity().startActivity(intent); } }); diff --git a/app/src/org/gnucash/android/ui/settings/AboutPreferenceFragment.java b/app/src/org/gnucash/android/ui/settings/AboutPreferenceFragment.java index 9c036e002..caf97708d 100644 --- a/app/src/org/gnucash/android/ui/settings/AboutPreferenceFragment.java +++ b/app/src/org/gnucash/android/ui/settings/AboutPreferenceFragment.java @@ -26,7 +26,7 @@ import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockPreferenceActivity; -import org.gnucash.android.ui.accounts.AccountsActivity; +import org.gnucash.android.ui.account.AccountsActivity; /** diff --git a/app/src/org/gnucash/android/ui/settings/AccountPreferencesFragment.java b/app/src/org/gnucash/android/ui/settings/AccountPreferencesFragment.java index e081cf0d8..2ceb09cf6 100644 --- a/app/src/org/gnucash/android/ui/settings/AccountPreferencesFragment.java +++ b/app/src/org/gnucash/android/ui/settings/AccountPreferencesFragment.java @@ -26,8 +26,8 @@ import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockPreferenceActivity; import org.gnucash.android.R; -import org.gnucash.android.data.Money; -import org.gnucash.android.ui.accounts.AccountsActivity; +import org.gnucash.android.model.Money; +import org.gnucash.android.ui.account.AccountsActivity; import java.io.InputStream; @@ -75,7 +75,7 @@ public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) { new AlertDialog.Builder(getActivity()) .setTitle(R.string.title_create_default_accounts) - .setMessage(R.string.message_confirm_create_default_accounts_setting) + .setMessage(R.string.msg_confirm_create_default_accounts_setting) .setIcon(android.R.drawable.ic_dialog_alert) .setPositiveButton(R.string.btn_create_accounts, new DialogInterface.OnClickListener() { @Override diff --git a/app/src/org/gnucash/android/ui/settings/DeleteAllTransacationsConfirmationDialog.java b/app/src/org/gnucash/android/ui/settings/DeleteAllTransacationsConfirmationDialog.java index 0c5ec5877..d69f7ca01 100644 --- a/app/src/org/gnucash/android/ui/settings/DeleteAllTransacationsConfirmationDialog.java +++ b/app/src/org/gnucash/android/ui/settings/DeleteAllTransacationsConfirmationDialog.java @@ -28,7 +28,7 @@ public static DeleteAllTransacationsConfirmationDialog newInstance() { public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setIcon(android.R.drawable.ic_delete) - .setTitle(R.string.title_confirm_delete).setMessage(R.string.delete_all_transactions_confirmation_message) + .setTitle(R.string.title_confirm_delete).setMessage(R.string.msg_delete_all_transactions_confirmation) .setPositiveButton(R.string.alert_dialog_ok_delete, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { diff --git a/app/src/org/gnucash/android/ui/settings/GeneralPreferenceFragment.java b/app/src/org/gnucash/android/ui/settings/GeneralPreferenceFragment.java index be15e5956..b0e174b91 100644 --- a/app/src/org/gnucash/android/ui/settings/GeneralPreferenceFragment.java +++ b/app/src/org/gnucash/android/ui/settings/GeneralPreferenceFragment.java @@ -17,7 +17,7 @@ package org.gnucash.android.ui.settings; import org.gnucash.android.R; -import org.gnucash.android.data.Money; +import org.gnucash.android.model.Money; import android.content.SharedPreferences; import android.os.Bundle; diff --git a/app/src/org/gnucash/android/ui/settings/SettingsActivity.java b/app/src/org/gnucash/android/ui/settings/SettingsActivity.java index 813c6f0cb..08f084c2d 100644 --- a/app/src/org/gnucash/android/ui/settings/SettingsActivity.java +++ b/app/src/org/gnucash/android/ui/settings/SettingsActivity.java @@ -32,11 +32,10 @@ import com.actionbarsherlock.app.SherlockPreferenceActivity; import com.actionbarsherlock.view.MenuItem; import org.gnucash.android.R; -import org.gnucash.android.data.Money; +import org.gnucash.android.model.Money; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.TransactionsDbAdapter; -import org.gnucash.android.ui.accounts.AccountsActivity; -import org.gnucash.android.ui.accounts.AccountsListFragment; +import org.gnucash.android.ui.account.AccountsActivity; import java.io.FileNotFoundException; import java.io.InputStream; @@ -51,7 +50,12 @@ */ public class SettingsActivity extends SherlockPreferenceActivity implements OnPreferenceChangeListener, Preference.OnPreferenceClickListener{ + /** + * Allowed delay between two consecutive taps of a setting for it to be considered a double tap + * Used on Android v2.3.3 or lower devices where dialogs cannot be instantiated easily in settings + */ public static final int DOUBLE_TAP_DELAY = 2000; + /** * Counts the number of times the preference for deleting all accounts has been clicked. * It is reset every time the SettingsActivity is resumed. @@ -242,7 +246,7 @@ public void importAccounts() { pickIntent.setType("application/*"); Intent chooser = Intent.createChooser(pickIntent, "Select GnuCash account file"); - startActivityForResult(chooser, AccountsListFragment.REQUEST_PICK_ACCOUNTS_FILE); + startActivityForResult(chooser, AccountsActivity.REQUEST_PICK_ACCOUNTS_FILE); } @@ -253,7 +257,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } switch (requestCode){ - case AccountsListFragment.REQUEST_PICK_ACCOUNTS_FILE: + case AccountsActivity.REQUEST_PICK_ACCOUNTS_FILE: try { InputStream accountInputStream = getContentResolver().openInputStream(data.getData()); new AccountsActivity.AccountImporterTask(this).execute(accountInputStream); diff --git a/app/src/org/gnucash/android/ui/transactions/BulkMoveDialogFragment.java b/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java similarity index 95% rename from app/src/org/gnucash/android/ui/transactions/BulkMoveDialogFragment.java rename to app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java index 0dbcfd5e3..6b72af9f9 100644 --- a/app/src/org/gnucash/android/ui/transactions/BulkMoveDialogFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java @@ -14,11 +14,12 @@ * limitations under the License. */ -package org.gnucash.android.ui.transactions; +package org.gnucash.android.ui.transaction; import org.gnucash.android.R; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.TransactionsDbAdapter; +import org.gnucash.android.ui.UxArgument; import org.gnucash.android.ui.widget.WidgetConfigurationActivity; import android.database.Cursor; @@ -93,8 +94,8 @@ public void onActivityCreated(Bundle savedInstanceState) { getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); Bundle args = getArguments(); - mTransactionIds = args.getLongArray(TransactionsListFragment.SELECTED_TRANSACTION_IDS); - mOriginAccountId = args.getLong(TransactionsListFragment.ORIGIN_ACCOUNT_ID); + mTransactionIds = args.getLongArray(UxArgument.SELECTED_TRANSACTION_IDS); + mOriginAccountId = args.getLong(UxArgument.ORIGIN_ACCOUNT_ID); String title = getActivity().getString(R.string.title_move_transactions, mTransactionIds.length); diff --git a/app/src/org/gnucash/android/ui/transactions/ScheduledTransactionsListFragment.java b/app/src/org/gnucash/android/ui/transaction/ScheduledTransactionsListFragment.java similarity index 97% rename from app/src/org/gnucash/android/ui/transactions/ScheduledTransactionsListFragment.java rename to app/src/org/gnucash/android/ui/transaction/ScheduledTransactionsListFragment.java index 1dbb7e6af..4c12ad4fb 100644 --- a/app/src/org/gnucash/android/ui/transactions/ScheduledTransactionsListFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/ScheduledTransactionsListFragment.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.ui.transactions; +package org.gnucash.android.ui.transaction; import android.app.AlarmManager; import android.app.PendingIntent; @@ -40,9 +40,10 @@ import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import org.gnucash.android.R; -import org.gnucash.android.data.Money; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Money; +import org.gnucash.android.model.Transaction; import org.gnucash.android.db.*; +import org.gnucash.android.ui.UxArgument; import org.gnucash.android.ui.widget.WidgetConfigurationActivity; import java.util.Locale; @@ -200,8 +201,8 @@ public void onListItemClick(ListView l, View v, int position, long id) { public void openTransactionForEdit(long accountId, long transactionId){ Intent createTransactionIntent = new Intent(getActivity(), TransactionsActivity.class); createTransactionIntent.setAction(Intent.ACTION_INSERT_OR_EDIT); - createTransactionIntent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountId); - createTransactionIntent.putExtra(NewTransactionFragment.SELECTED_TRANSACTION_ID, transactionId); + createTransactionIntent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, accountId); + createTransactionIntent.putExtra(UxArgument.SELECTED_TRANSACTION_ID, transactionId); startActivity(createTransactionIntent); } diff --git a/app/src/org/gnucash/android/ui/transactions/NewTransactionFragment.java b/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java similarity index 96% rename from app/src/org/gnucash/android/ui/transactions/NewTransactionFragment.java rename to app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java index 77a965a33..5f7fb9be2 100644 --- a/app/src/org/gnucash/android/ui/transactions/NewTransactionFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.ui.transactions; +package org.gnucash.android.ui.transaction; import java.math.BigDecimal; import java.math.RoundingMode; @@ -28,15 +28,16 @@ import android.app.PendingIntent; import android.widget.*; import org.gnucash.android.R; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Money; -import org.gnucash.android.data.Transaction; -import org.gnucash.android.data.Transaction.TransactionType; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Money; +import org.gnucash.android.model.Transaction; +import org.gnucash.android.model.Transaction.TransactionType; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.DatabaseHelper; import org.gnucash.android.db.TransactionsDbAdapter; -import org.gnucash.android.ui.DatePickerDialogFragment; -import org.gnucash.android.ui.TimePickerDialogFragment; +import org.gnucash.android.ui.transaction.dialog.DatePickerDialogFragment; +import org.gnucash.android.ui.transaction.dialog.TimePickerDialogFragment; +import org.gnucash.android.ui.UxArgument; import org.gnucash.android.ui.widget.WidgetConfigurationActivity; import android.app.DatePickerDialog; @@ -71,7 +72,7 @@ * Fragment for creating or editing transactions * @author Ngewi Fet */ -public class NewTransactionFragment extends SherlockFragment implements +public class TransactionFormFragment extends SherlockFragment implements OnDateSetListener, OnTimeSetListener { /** @@ -98,14 +99,8 @@ public class NewTransactionFragment extends SherlockFragment implements * Transaction to be created/updated */ private Transaction mTransaction; - - /** - * Arguments key for database ID of transaction. - * Is used to pass a transaction ID into a bundle or intent - */ - public static final String SELECTED_TRANSACTION_ID = "selected_transaction_id"; - - /** + + /** * Formats a {@link Date} object into a date string of the format dd MMM yyyy e.g. 18 July 2012 */ public final static DateFormat DATE_FORMATTER = DateFormat.getDateInstance(); @@ -232,11 +227,11 @@ public void onActivityCreated(Bundle savedInstanceState) { recurrenceAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mRecurringTransactionSpinner.setAdapter(recurrenceAdapter); - long transactionId = getArguments().getLong(SELECTED_TRANSACTION_ID); + long transactionId = getArguments().getLong(UxArgument.SELECTED_TRANSACTION_ID); mTransactionsDbAdapter = new TransactionsDbAdapter(getActivity()); mTransaction = mTransactionsDbAdapter.getTransaction(transactionId); - final long accountId = getArguments().getLong(TransactionsListFragment.SELECTED_ACCOUNT_ID); + final long accountId = getArguments().getLong(UxArgument.SELECTED_ACCOUNT_ID); mAccountType = mAccountsDbAdapter.getAccountType(accountId); toggleTransactionTypeState(); @@ -376,7 +371,7 @@ private void initalizeViews() { mTransactionTypeButton.setChecked(false); } - final long accountId = getArguments().getLong(TransactionsListFragment.SELECTED_ACCOUNT_ID); + final long accountId = getArguments().getLong(UxArgument.SELECTED_ACCOUNT_ID); String code = Money.DEFAULT_CURRENCY_CODE; if (accountId != 0){ code = mTransactionsDbAdapter.getCurrencyCode(accountId); @@ -476,7 +471,7 @@ public void onClick(View v) { } catch (ParseException e) { Log.e(getTag(), "Error converting input time to Date object"); } - DialogFragment newFragment = new DatePickerDialogFragment(NewTransactionFragment.this, dateMillis); + DialogFragment newFragment = new DatePickerDialogFragment(TransactionFormFragment.this, dateMillis); newFragment.show(ft, "date_dialog"); } }); @@ -493,7 +488,7 @@ public void onClick(View v) { } catch (ParseException e) { Log.e(getTag(), "Error converting input time to Date object"); } - DialogFragment fragment = new TimePickerDialogFragment(NewTransactionFragment.this, timeMillis); + DialogFragment fragment = new TimePickerDialogFragment(TransactionFormFragment.this, timeMillis); fragment.show(ft, "time_dialog"); } }); diff --git a/app/src/org/gnucash/android/ui/transactions/TransactionsActivity.java b/app/src/org/gnucash/android/ui/transaction/TransactionsActivity.java similarity index 89% rename from app/src/org/gnucash/android/ui/transactions/TransactionsActivity.java rename to app/src/org/gnucash/android/ui/transaction/TransactionsActivity.java index ed5296d4c..ae035c045 100644 --- a/app/src/org/gnucash/android/ui/transactions/TransactionsActivity.java +++ b/app/src/org/gnucash/android/ui/transaction/TransactionsActivity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.ui.transactions; +package org.gnucash.android.ui.transaction; import android.content.Context; import android.content.Intent; @@ -42,15 +42,16 @@ import com.actionbarsherlock.view.MenuItem; import com.viewpagerindicator.TitlePageIndicator; import org.gnucash.android.R; -import org.gnucash.android.data.Account; +import org.gnucash.android.model.Account; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.DatabaseAdapter; import org.gnucash.android.db.DatabaseHelper; -import org.gnucash.android.ui.Refreshable; -import org.gnucash.android.ui.accounts.AccountsActivity; -import org.gnucash.android.ui.accounts.AccountsListFragment; -import org.gnucash.android.util.OnAccountClickedListener; -import org.gnucash.android.util.OnTransactionClickedListener; +import org.gnucash.android.ui.util.Refreshable; +import org.gnucash.android.ui.UxArgument; +import org.gnucash.android.ui.account.AccountsActivity; +import org.gnucash.android.ui.account.AccountsListFragment; +import org.gnucash.android.ui.util.OnAccountClickedListener; +import org.gnucash.android.ui.util.OnTransactionClickedListener; import org.gnucash.android.util.QualifiedAccountNameCursorAdapter; /** @@ -72,10 +73,9 @@ public class TransactionsActivity extends SherlockFragmentActivity implements public static final String FRAGMENT_TRANSACTIONS_LIST = "transactions_list"; /** - * Tag for {@link NewTransactionFragment} + * Tag for {@link TransactionFormFragment} */ public static final String FRAGMENT_NEW_TRANSACTION = "new_transaction"; - private static final int REQUEST_EDIT_ACCOUNT = 0x21; /** * ViewPager index for sub-accounts fragment @@ -136,7 +136,7 @@ public boolean onNavigationItemSelected(int position, long itemId) { FragmentManager fragmentManager = getSupportFragmentManager(); //inform new accounts fragment that account was changed - NewTransactionFragment newTransactionsFragment = (NewTransactionFragment) fragmentManager + TransactionFormFragment newTransactionsFragment = (TransactionFormFragment) fragmentManager .findFragmentByTag(FRAGMENT_NEW_TRANSACTION); if (newTransactionsFragment != null){ newTransactionsFragment.onAccountChanged(itemId); @@ -219,7 +219,7 @@ public int getCount() { private AccountsListFragment prepareSubAccountsListFragment(){ AccountsListFragment subAccountsListFragment = new AccountsListFragment(); Bundle args = new Bundle(); - args.putLong(AccountsListFragment.ARG_PARENT_ACCOUNT_ID, mAccountId); + args.putLong(UxArgument.PARENT_ACCOUNT_ID, mAccountId); subAccountsListFragment.setArguments(args); return subAccountsListFragment; } @@ -231,7 +231,7 @@ private AccountsListFragment prepareSubAccountsListFragment(){ private TransactionsListFragment prepareTransactionsListFragment(){ TransactionsListFragment transactionsListFragment = new TransactionsListFragment(); Bundle args = new Bundle(); - args.putLong(TransactionsListFragment.SELECTED_ACCOUNT_ID, + args.putLong(UxArgument.SELECTED_ACCOUNT_ID, mAccountId); transactionsListFragment.setArguments(args); Log.i(TAG, "Opening transactions for account id " + mAccountId); @@ -277,7 +277,7 @@ protected void onCreate(Bundle savedInstanceState) { sLastTitleColor = getResources().getColor(R.color.title_green); mAccountId = getIntent().getLongExtra( - TransactionsListFragment.SELECTED_ACCOUNT_ID, -1); + UxArgument.SELECTED_ACCOUNT_ID, -1); mAccountsDbAdapter = new AccountsDbAdapter(this); @@ -306,15 +306,15 @@ protected void onCreate(Bundle savedInstanceState) { * Loads the fragment for creating/editing transactions and initializes it to be displayed */ private void initializeCreateOrEditTransaction() { - long transactionId = getIntent().getLongExtra(NewTransactionFragment.SELECTED_TRANSACTION_ID, -1); + long transactionId = getIntent().getLongExtra(UxArgument.SELECTED_TRANSACTION_ID, -1); Bundle args = new Bundle(); if (transactionId > 0) { mSectionHeaderTransactions.setText(R.string.title_edit_transaction); - args.putLong(NewTransactionFragment.SELECTED_TRANSACTION_ID, transactionId); - args.putLong(TransactionsListFragment.SELECTED_ACCOUNT_ID, mAccountId); + args.putLong(UxArgument.SELECTED_TRANSACTION_ID, transactionId); + args.putLong(UxArgument.SELECTED_ACCOUNT_ID, mAccountId); } else { mSectionHeaderTransactions.setText(R.string.title_add_transaction); - args.putLong(TransactionsListFragment.SELECTED_ACCOUNT_ID, mAccountId); + args.putLong(UxArgument.SELECTED_ACCOUNT_ID, mAccountId); } mSectionHeaderTransactions.setBackgroundColor(sLastTitleColor); showTransactionFormFragment(args); @@ -427,8 +427,8 @@ public boolean onOptionsItemSelected(MenuItem item) { case R.id.menu_edit_account: Intent editAccountIntent = new Intent(this, AccountsActivity.class); editAccountIntent.setAction(Intent.ACTION_INSERT_OR_EDIT); - editAccountIntent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, mAccountId); - startActivityForResult(editAccountIntent, REQUEST_EDIT_ACCOUNT); + editAccountIntent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, mAccountId); + startActivityForResult(editAccountIntent, AccountsActivity.REQUEST_EDIT_ACCOUNT); return true; default: @@ -476,8 +476,8 @@ public void onNewTransactionClick(View v){ public void onNewAccountClick(View v) { Intent addAccountIntent = new Intent(this, AccountsActivity.class); addAccountIntent.setAction(Intent.ACTION_INSERT_OR_EDIT); - addAccountIntent.putExtra(AccountsListFragment.ARG_PARENT_ACCOUNT_ID, mAccountId); - startActivityForResult(addAccountIntent, REQUEST_EDIT_ACCOUNT); + addAccountIntent.putExtra(UxArgument.PARENT_ACCOUNT_ID, mAccountId); + startActivityForResult(addAccountIntent, AccountsActivity.REQUEST_EDIT_ACCOUNT); } /** @@ -489,11 +489,11 @@ private void showTransactionFormFragment(Bundle args){ FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); - NewTransactionFragment newTransactionFragment = new NewTransactionFragment(); - newTransactionFragment.setArguments(args); + TransactionFormFragment transactionFormFragment = new TransactionFormFragment(); + transactionFormFragment.setArguments(args); fragmentTransaction.add(R.id.fragment_container, - newTransactionFragment, TransactionsActivity.FRAGMENT_NEW_TRANSACTION); + transactionFormFragment, TransactionsActivity.FRAGMENT_NEW_TRANSACTION); if (mActivityRunning) fragmentTransaction.addToBackStack(null); @@ -504,7 +504,7 @@ private void showTransactionFormFragment(Bundle args){ public void createNewTransaction(long accountRowId) { Intent createTransactionIntent = new Intent(this.getApplicationContext(), TransactionsActivity.class); createTransactionIntent.setAction(Intent.ACTION_INSERT_OR_EDIT); - createTransactionIntent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountRowId); + createTransactionIntent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, accountRowId); startActivity(createTransactionIntent); } @@ -512,8 +512,8 @@ public void createNewTransaction(long accountRowId) { public void editTransaction(long transactionId){ Intent createTransactionIntent = new Intent(this.getApplicationContext(), TransactionsActivity.class); createTransactionIntent.setAction(Intent.ACTION_INSERT_OR_EDIT); - createTransactionIntent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, mAccountId); - createTransactionIntent.putExtra(NewTransactionFragment.SELECTED_TRANSACTION_ID, transactionId); + createTransactionIntent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, mAccountId); + createTransactionIntent.putExtra(UxArgument.SELECTED_TRANSACTION_ID, transactionId); startActivity(createTransactionIntent); } @@ -521,7 +521,7 @@ public void editTransaction(long transactionId){ public void accountSelected(long accountRowId) { Intent restartIntent = new Intent(this.getApplicationContext(), TransactionsActivity.class); restartIntent.setAction(Intent.ACTION_VIEW); - restartIntent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountRowId); + restartIntent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, accountRowId); startActivity(restartIntent); } } diff --git a/app/src/org/gnucash/android/ui/transactions/TransactionsListFragment.java b/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java similarity index 92% rename from app/src/org/gnucash/android/ui/transactions/TransactionsListFragment.java rename to app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java index d1395397c..3e0b06a5d 100644 --- a/app/src/org/gnucash/android/ui/transactions/TransactionsListFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.ui.transactions; +package org.gnucash.android.ui.transaction; import android.app.Activity; import android.content.Context; @@ -47,15 +47,16 @@ import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import org.gnucash.android.R; -import org.gnucash.android.data.Money; +import org.gnucash.android.model.Money; import org.gnucash.android.db.DatabaseAdapter; import org.gnucash.android.db.DatabaseCursorLoader; import org.gnucash.android.db.DatabaseHelper; import org.gnucash.android.db.TransactionsDbAdapter; -import org.gnucash.android.ui.Refreshable; -import org.gnucash.android.ui.accounts.AccountsListFragment; +import org.gnucash.android.ui.util.Refreshable; +import org.gnucash.android.ui.UxArgument; +import org.gnucash.android.ui.account.AccountsListFragment; import org.gnucash.android.ui.widget.WidgetConfigurationActivity; -import org.gnucash.android.util.OnTransactionClickedListener; +import org.gnucash.android.ui.util.OnTransactionClickedListener; import java.text.SimpleDateFormat; import java.util.Date; @@ -72,30 +73,9 @@ public class TransactionsListFragment extends SherlockListFragment implements /** * Logging tag */ - protected static final String TAG = "TransactionsListFragment"; + protected static final String LOG_TAG = "TransactionsListFragment"; - /** - * Key for passing list of selected items as an argument in a bundle or intent - */ - private static final String SAVED_SELECTED_ITEMS = "selected_items"; - - /** - * Key for passing the selected account ID as an argument in a bundle or intent - * This is the account whose transactions are to be displayed - */ - public static final String SELECTED_ACCOUNT_ID = "selected_account_id"; - - /** - * Key for passing list of IDs selected transactions as an argument in a bundle or intent - */ - public static final String SELECTED_TRANSACTION_IDS = "selected_transactions"; - - /** - * Key for the origin account as argument when moving accounts - */ - public static final String ORIGIN_ACCOUNT_ID = "origin_acccount_id"; - - private TransactionsDbAdapter mTransactionsDbAdapter; + private TransactionsDbAdapter mTransactionsDbAdapter; private SimpleCursorAdapter mCursorAdapter; private ActionMode mActionMode = null; private boolean mInEditMode = false; @@ -163,7 +143,7 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); Bundle args = getArguments(); - mAccountID = args.getLong(SELECTED_ACCOUNT_ID); + mAccountID = args.getLong(UxArgument.SELECTED_ACCOUNT_ID); mTransactionsDbAdapter = new TransactionsDbAdapter(getActivity()); mCursorAdapter = new TransactionsCursorAdapter( @@ -267,20 +247,20 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override public Loader onCreateLoader(int arg0, Bundle arg1) { - Log.d(TAG, "Creating transactions loader"); + Log.d(LOG_TAG, "Creating transactions loader"); return new TransactionsCursorLoader(getActivity(), mAccountID); } @Override public void onLoadFinished(Loader loader, Cursor cursor) { - Log.d(TAG, "Transactions loader finished. Swapping in cursor"); + Log.d(LOG_TAG, "Transactions loader finished. Swapping in cursor"); mCursorAdapter.swapCursor(cursor); mCursorAdapter.notifyDataSetChanged(); } @Override public void onLoaderReset(Loader loader) { - Log.d(TAG, "Resetting transactions loader"); + Log.d(LOG_TAG, "Resetting transactions loader"); mCursorAdapter.swapCursor(null); } @@ -358,8 +338,8 @@ protected void showBulkMoveDialog(){ // Create and show the dialog. DialogFragment bulkMoveFragment = new BulkMoveDialogFragment(); Bundle args = new Bundle(); - args.putLong(ORIGIN_ACCOUNT_ID, mAccountID); - args.putLongArray(SELECTED_TRANSACTION_IDS, getListView().getCheckedItemIds()); + args.putLong(UxArgument.ORIGIN_ACCOUNT_ID, mAccountID); + args.putLongArray(UxArgument.SELECTED_TRANSACTION_IDS, getListView().getCheckedItemIds()); bulkMoveFragment.setArguments(args); bulkMoveFragment.show(ft, "bulk_move_dialog"); } diff --git a/app/src/org/gnucash/android/ui/DatePickerDialogFragment.java b/app/src/org/gnucash/android/ui/transaction/dialog/DatePickerDialogFragment.java similarity index 97% rename from app/src/org/gnucash/android/ui/DatePickerDialogFragment.java rename to app/src/org/gnucash/android/ui/transaction/dialog/DatePickerDialogFragment.java index f5d22eb36..b64c64625 100644 --- a/app/src/org/gnucash/android/ui/DatePickerDialogFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/dialog/DatePickerDialogFragment.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.ui; +package org.gnucash.android.ui.transaction.dialog; import java.util.Calendar; import java.util.GregorianCalendar; diff --git a/app/src/org/gnucash/android/ui/TimePickerDialogFragment.java b/app/src/org/gnucash/android/ui/transaction/dialog/TimePickerDialogFragment.java similarity index 97% rename from app/src/org/gnucash/android/ui/TimePickerDialogFragment.java rename to app/src/org/gnucash/android/ui/transaction/dialog/TimePickerDialogFragment.java index c292a2618..626bc9a62 100644 --- a/app/src/org/gnucash/android/ui/TimePickerDialogFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/dialog/TimePickerDialogFragment.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.gnucash.android.ui; +package org.gnucash.android.ui.transaction.dialog; import java.util.Calendar; import java.util.GregorianCalendar; diff --git a/app/src/org/gnucash/android/ui/transactions/TransactionsDeleteConfirmationDialog.java b/app/src/org/gnucash/android/ui/transaction/dialog/TransactionsDeleteConfirmationDialogFragment.java similarity index 79% rename from app/src/org/gnucash/android/ui/transactions/TransactionsDeleteConfirmationDialog.java rename to app/src/org/gnucash/android/ui/transaction/dialog/TransactionsDeleteConfirmationDialogFragment.java index cb134172d..e80b184a3 100644 --- a/app/src/org/gnucash/android/ui/transactions/TransactionsDeleteConfirmationDialog.java +++ b/app/src/org/gnucash/android/ui/transaction/dialog/TransactionsDeleteConfirmationDialogFragment.java @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.gnucash.android.ui.transactions; +package org.gnucash.android.ui.transaction.dialog; import org.gnucash.android.R; import org.gnucash.android.db.TransactionsDbAdapter; -import org.gnucash.android.ui.accounts.AccountsListFragment; +import org.gnucash.android.ui.UxArgument; +import org.gnucash.android.ui.account.AccountsListFragment; import android.app.AlertDialog; import android.app.Dialog; @@ -33,13 +34,13 @@ * @author Ngewi Fet * */ -public class TransactionsDeleteConfirmationDialog extends SherlockDialogFragment { +public class TransactionsDeleteConfirmationDialogFragment extends SherlockDialogFragment { - public static TransactionsDeleteConfirmationDialog newInstance(int title, long id) { - TransactionsDeleteConfirmationDialog frag = new TransactionsDeleteConfirmationDialog(); + public static TransactionsDeleteConfirmationDialogFragment newInstance(int title, long id) { + TransactionsDeleteConfirmationDialogFragment frag = new TransactionsDeleteConfirmationDialogFragment(); Bundle args = new Bundle(); args.putInt("title", title); - args.putLong(TransactionsListFragment.SELECTED_TRANSACTION_IDS, id); + args.putLong(UxArgument.SELECTED_TRANSACTION_IDS, id); frag.setArguments(args); return frag; } @@ -47,8 +48,8 @@ public static TransactionsDeleteConfirmationDialog newInstance(int title, long i @Override public Dialog onCreateDialog(Bundle savedInstanceState) { int title = getArguments().getInt("title"); - final long rowId = getArguments().getLong(TransactionsListFragment.SELECTED_TRANSACTION_IDS); - int message = rowId == 0 ? R.string.delete_all_transactions_confirmation_message : R.string.delete_transaction_confirmation_message; + final long rowId = getArguments().getLong(UxArgument.SELECTED_TRANSACTION_IDS); + int message = rowId == 0 ? R.string.msg_delete_all_transactions_confirmation : R.string.msg_delete_transaction_confirmation; return new AlertDialog.Builder(getActivity()) .setIcon(android.R.drawable.ic_delete) .setTitle(title).setMessage(message) diff --git a/app/src/org/gnucash/android/util/CheckableLinearLayout.java b/app/src/org/gnucash/android/ui/util/CheckableLinearLayout.java similarity index 99% rename from app/src/org/gnucash/android/util/CheckableLinearLayout.java rename to app/src/org/gnucash/android/ui/util/CheckableLinearLayout.java index 4c8e2d03d..534c873cb 100644 --- a/app/src/org/gnucash/android/util/CheckableLinearLayout.java +++ b/app/src/org/gnucash/android/ui/util/CheckableLinearLayout.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.gnucash.android.util; +package org.gnucash.android.ui.util; import android.content.Context; import android.util.AttributeSet; diff --git a/app/src/org/gnucash/android/util/OnAccountClickedListener.java b/app/src/org/gnucash/android/ui/util/OnAccountClickedListener.java similarity index 96% rename from app/src/org/gnucash/android/util/OnAccountClickedListener.java rename to app/src/org/gnucash/android/ui/util/OnAccountClickedListener.java index c463a342c..1ca690186 100644 --- a/app/src/org/gnucash/android/util/OnAccountClickedListener.java +++ b/app/src/org/gnucash/android/ui/util/OnAccountClickedListener.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.util; +package org.gnucash.android.ui.util; /** * Interface for implemented by activities which wish to be notified when diff --git a/app/src/org/gnucash/android/util/OnTransactionClickedListener.java b/app/src/org/gnucash/android/ui/util/OnTransactionClickedListener.java similarity index 97% rename from app/src/org/gnucash/android/util/OnTransactionClickedListener.java rename to app/src/org/gnucash/android/ui/util/OnTransactionClickedListener.java index 5bd601c12..c4639a208 100644 --- a/app/src/org/gnucash/android/util/OnTransactionClickedListener.java +++ b/app/src/org/gnucash/android/ui/util/OnTransactionClickedListener.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gnucash.android.util; +package org.gnucash.android.ui.util; /** * Interface for implemented by activities which wish to be notified when diff --git a/app/src/org/gnucash/android/ui/Refreshable.java b/app/src/org/gnucash/android/ui/util/Refreshable.java similarity index 96% rename from app/src/org/gnucash/android/ui/Refreshable.java rename to app/src/org/gnucash/android/ui/util/Refreshable.java index f34a0e1e3..7ca7f3777 100644 --- a/app/src/org/gnucash/android/ui/Refreshable.java +++ b/app/src/org/gnucash/android/ui/util/Refreshable.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.gnucash.android.ui; +package org.gnucash.android.ui.util; /** * Interface for fragments which are refreshable diff --git a/app/src/org/gnucash/android/ui/widget/WidgetConfigurationActivity.java b/app/src/org/gnucash/android/ui/widget/WidgetConfigurationActivity.java index 5cd6ccbf9..b3c988912 100644 --- a/app/src/org/gnucash/android/ui/widget/WidgetConfigurationActivity.java +++ b/app/src/org/gnucash/android/ui/widget/WidgetConfigurationActivity.java @@ -19,14 +19,13 @@ import java.util.Locale; import org.gnucash.android.R; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Money; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Money; import org.gnucash.android.db.AccountsDbAdapter; -import org.gnucash.android.db.DatabaseHelper; import org.gnucash.android.receivers.TransactionAppWidgetProvider; -import org.gnucash.android.ui.accounts.AccountsActivity; -import org.gnucash.android.ui.transactions.TransactionsActivity; -import org.gnucash.android.ui.transactions.TransactionsListFragment; +import org.gnucash.android.ui.UxArgument; +import org.gnucash.android.ui.account.AccountsActivity; +import org.gnucash.android.ui.transaction.TransactionsActivity; import android.app.Activity; import android.app.PendingIntent; @@ -119,7 +118,7 @@ public void onClick(View v) { long accountId = mAccountsSpinner.getSelectedItemId(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(WidgetConfigurationActivity.this); Editor editor = prefs.edit(); - editor.putLong(TransactionsListFragment.SELECTED_ACCOUNT_ID + mAppWidgetId, accountId); + editor.putLong(UxArgument.SELECTED_ACCOUNT_ID + mAppWidgetId, accountId); editor.commit(); updateWidget(WidgetConfigurationActivity.this, mAppWidgetId, accountId); @@ -169,7 +168,7 @@ public static void updateWidget(Context context, int appWidgetId, long accountId views.setOnClickPendingIntent(R.id.btn_new_transaction, pendingIntent); appWidgetManager.updateAppWidget(appWidgetId, views); Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); - editor.remove(TransactionsListFragment.SELECTED_ACCOUNT_ID + appWidgetId); + editor.remove(UxArgument.SELECTED_ACCOUNT_ID + appWidgetId); editor.commit(); return; } @@ -189,7 +188,7 @@ public static void updateWidget(Context context, int appWidgetId, long accountId Intent accountViewIntent = new Intent(context, TransactionsActivity.class); accountViewIntent.setAction(Intent.ACTION_VIEW); accountViewIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK); - accountViewIntent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountId); + accountViewIntent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, accountId); PendingIntent accountPendingIntent = PendingIntent .getActivity(context, appWidgetId, accountViewIntent, 0); views.setOnClickPendingIntent(R.id.widget_layout, accountPendingIntent); @@ -197,7 +196,7 @@ public static void updateWidget(Context context, int appWidgetId, long accountId Intent newTransactionIntent = new Intent(context, TransactionsActivity.class); newTransactionIntent.setAction(Intent.ACTION_INSERT_OR_EDIT); newTransactionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK); - newTransactionIntent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, accountId); + newTransactionIntent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, accountId); PendingIntent pendingIntent = PendingIntent .getActivity(context, appWidgetId, newTransactionIntent, 0); views.setOnClickPendingIntent(R.id.btn_new_transaction, pendingIntent); @@ -218,7 +217,7 @@ public static void updateAllWidgets(Context context){ SharedPreferences defaultSharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); for (int widgetId : appWidgetIds) { long accountId = defaultSharedPrefs - .getLong(TransactionsListFragment.SELECTED_ACCOUNT_ID + widgetId, -1); + .getLong(UxArgument.SELECTED_ACCOUNT_ID + widgetId, -1); if (accountId <= 0) continue; diff --git a/app/src/org/gnucash/android/util/GnucashAccountXmlHandler.java b/app/src/org/gnucash/android/util/GnucashAccountXmlHandler.java index d3f62f79a..d82ed3b93 100644 --- a/app/src/org/gnucash/android/util/GnucashAccountXmlHandler.java +++ b/app/src/org/gnucash/android/util/GnucashAccountXmlHandler.java @@ -20,7 +20,7 @@ import android.util.Log; import android.widget.Toast; import org.gnucash.android.R; -import org.gnucash.android.data.Account; +import org.gnucash.android.model.Account; import org.gnucash.android.db.AccountsDbAdapter; import org.xml.sax.Attributes; import org.xml.sax.InputSource; diff --git a/integration-tests/src/org/gnucash/android/test/db/AccountsDbAdapterTest.java b/integration-tests/src/org/gnucash/android/test/db/AccountsDbAdapterTest.java index 5f15b7d7b..a5eacc71b 100644 --- a/integration-tests/src/org/gnucash/android/test/db/AccountsDbAdapterTest.java +++ b/integration-tests/src/org/gnucash/android/test/db/AccountsDbAdapterTest.java @@ -3,8 +3,8 @@ import java.util.Currency; import java.util.List; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Transaction; import org.gnucash.android.db.AccountsDbAdapter; import android.test.AndroidTestCase; diff --git a/integration-tests/src/org/gnucash/android/test/db/TransactionsDbAdapterTest.java b/integration-tests/src/org/gnucash/android/test/db/TransactionsDbAdapterTest.java index 3ebf6e345..c59577624 100644 --- a/integration-tests/src/org/gnucash/android/test/db/TransactionsDbAdapterTest.java +++ b/integration-tests/src/org/gnucash/android/test/db/TransactionsDbAdapterTest.java @@ -2,8 +2,8 @@ import java.util.List; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Transaction; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.TransactionsDbAdapter; diff --git a/integration-tests/src/org/gnucash/android/test/ui/AccountsActivityTest.java b/integration-tests/src/org/gnucash/android/test/ui/AccountsActivityTest.java index a8d1791bc..e97b86033 100644 --- a/integration-tests/src/org/gnucash/android/test/ui/AccountsActivityTest.java +++ b/integration-tests/src/org/gnucash/android/test/ui/AccountsActivityTest.java @@ -28,15 +28,15 @@ import android.widget.TextView; import com.jayway.android.robotium.solo.Solo; import org.gnucash.android.R; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Money; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Money; +import org.gnucash.android.model.Transaction; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.TransactionsDbAdapter; import org.gnucash.android.test.util.ActionBarUtils; -import org.gnucash.android.ui.accounts.AccountsActivity; -import org.gnucash.android.ui.accounts.AccountsListFragment; -import org.gnucash.android.ui.transactions.TransactionsActivity; +import org.gnucash.android.ui.account.AccountsActivity; +import org.gnucash.android.ui.account.AccountsListFragment; +import org.gnucash.android.ui.transaction.TransactionsActivity; import java.util.Currency; import java.util.List; diff --git a/integration-tests/src/org/gnucash/android/test/ui/ExportTransactionsTest.java b/integration-tests/src/org/gnucash/android/test/ui/ExportTransactionsTest.java index 552ac3229..f5ebfc976 100644 --- a/integration-tests/src/org/gnucash/android/test/ui/ExportTransactionsTest.java +++ b/integration-tests/src/org/gnucash/android/test/ui/ExportTransactionsTest.java @@ -19,17 +19,16 @@ import java.io.File; import org.gnucash.android.R; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Transaction; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.TransactionsDbAdapter; import org.gnucash.android.export.ExportFormat; -import org.gnucash.android.ui.accounts.AccountsActivity; +import org.gnucash.android.ui.account.AccountsActivity; import org.gnucash.android.export.ExportDialogFragment; import android.os.Environment; import android.test.ActivityInstrumentationTestCase2; -import android.widget.Button; import android.widget.Spinner; import com.jayway.android.robotium.solo.Solo; diff --git a/integration-tests/src/org/gnucash/android/test/ui/TransactionsActivityTest.java b/integration-tests/src/org/gnucash/android/test/ui/TransactionsActivityTest.java index f02cdcbd7..43cb33168 100644 --- a/integration-tests/src/org/gnucash/android/test/ui/TransactionsActivityTest.java +++ b/integration-tests/src/org/gnucash/android/test/ui/TransactionsActivityTest.java @@ -29,14 +29,14 @@ import android.widget.ToggleButton; import com.jayway.android.robotium.solo.Solo; import org.gnucash.android.R; -import org.gnucash.android.data.Account; -import org.gnucash.android.data.Money; -import org.gnucash.android.data.Transaction; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.Money; +import org.gnucash.android.model.Transaction; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.TransactionsDbAdapter; -import org.gnucash.android.ui.transactions.NewTransactionFragment; -import org.gnucash.android.ui.transactions.TransactionsActivity; -import org.gnucash.android.ui.transactions.TransactionsListFragment; +import org.gnucash.android.ui.UxArgument; +import org.gnucash.android.ui.transaction.TransactionFormFragment; +import org.gnucash.android.ui.transaction.TransactionsActivity; import java.text.NumberFormat; import java.text.ParseException; @@ -81,7 +81,7 @@ protected void setUp() throws Exception { assertTrue(id > 0); Intent intent = new Intent(Intent.ACTION_VIEW); - intent.putExtra(TransactionsListFragment.SELECTED_ACCOUNT_ID, id); + intent.putExtra(UxArgument.SELECTED_ACCOUNT_ID, id); setActivityIntent(intent); mSolo = new Solo(getInstrumentation(), getActivity()); @@ -112,12 +112,12 @@ private int getTranscationCount(){ } private void validateNewTransactionFields(){ - String expectedValue = NewTransactionFragment.DATE_FORMATTER.format(new Date(mTransactionTimeMillis)); + String expectedValue = TransactionFormFragment.DATE_FORMATTER.format(new Date(mTransactionTimeMillis)); TextView dateView = (TextView) mSolo.getView(R.id.input_date); String actualValue = dateView.getText().toString(); assertEquals(expectedValue, actualValue); - expectedValue = NewTransactionFragment.TIME_FORMATTER.format(new Date(mTransactionTimeMillis)); + expectedValue = TransactionFormFragment.TIME_FORMATTER.format(new Date(mTransactionTimeMillis)); TextView timeView = (TextView) mSolo.getView(R.id.input_time); actualValue = timeView.getText().toString(); assertEquals(expectedValue, actualValue); @@ -164,12 +164,12 @@ private void validateEditTransactionFields(Transaction transaction){ String description = mSolo.getEditText(2).getText().toString(); assertEquals(transaction.getDescription(), description); - String expectedValue = NewTransactionFragment.DATE_FORMATTER.format(transaction.getTimeMillis()); + String expectedValue = TransactionFormFragment.DATE_FORMATTER.format(transaction.getTimeMillis()); TextView dateView = (TextView) mSolo.getView(R.id.input_date); String actualValue = dateView.getText().toString(); //mSolo.getText(6).getText().toString(); assertEquals(expectedValue, actualValue); - expectedValue = NewTransactionFragment.TIME_FORMATTER.format(transaction.getTimeMillis()); + expectedValue = TransactionFormFragment.TIME_FORMATTER.format(transaction.getTimeMillis()); TextView timeView = (TextView) mSolo.getView(R.id.input_time); actualValue = timeView.getText().toString();// mSolo.getText(7).getText().toString(); assertEquals(expectedValue, actualValue); @@ -313,10 +313,10 @@ public void testOpenTransactionEditShouldNotModifyTransaction(){ assertEquals(trx.getAccountUID(), DUMMY_ACCOUNT_UID); Date expectedDate = new Date(mTransactionTimeMillis); Date trxDate = new Date(trx.getTimeMillis()); - assertEquals(NewTransactionFragment.DATE_FORMATTER.format(expectedDate), - NewTransactionFragment.DATE_FORMATTER.format(trxDate)); - assertEquals(NewTransactionFragment.TIME_FORMATTER.format(expectedDate), - NewTransactionFragment.TIME_FORMATTER.format(trxDate)); + assertEquals(TransactionFormFragment.DATE_FORMATTER.format(expectedDate), + TransactionFormFragment.DATE_FORMATTER.format(trxDate)); + assertEquals(TransactionFormFragment.TIME_FORMATTER.format(expectedDate), + TransactionFormFragment.TIME_FORMATTER.format(trxDate)); //FIXME: for some reason, the expected time is higher (in the future) than the actual time //this should not be the case since the transaction was created with the expected time diff --git a/integration-tests/src/org/gnucash/android/test/unit/AccountTest.java b/integration-tests/src/org/gnucash/android/test/unit/AccountTest.java index ff024be49..c6421e1d5 100644 --- a/integration-tests/src/org/gnucash/android/test/unit/AccountTest.java +++ b/integration-tests/src/org/gnucash/android/test/unit/AccountTest.java @@ -1,6 +1,6 @@ package org.gnucash.android.test.unit; -import org.gnucash.android.data.Account; +import org.gnucash.android.model.Account; import junit.framework.TestCase; diff --git a/integration-tests/src/org/gnucash/android/test/unit/MoneyTest.java b/integration-tests/src/org/gnucash/android/test/unit/MoneyTest.java index 20b490e2b..a8f836f91 100644 --- a/integration-tests/src/org/gnucash/android/test/unit/MoneyTest.java +++ b/integration-tests/src/org/gnucash/android/test/unit/MoneyTest.java @@ -22,7 +22,7 @@ import junit.framework.TestCase; -import org.gnucash.android.data.Money; +import org.gnucash.android.model.Money; public class MoneyTest extends TestCase { From fc1a97b8e83a3aee9034ceab937d37f10505410a Mon Sep 17 00:00:00 2001 From: Ngewi Fet Date: Thu, 13 Feb 2014 12:12:06 +0100 Subject: [PATCH 3/4] Lists of accounts are now sorted by the fully qualified account name Closes #129 --- .../gnucash/android/db/AccountsDbAdapter.java | 57 +++++++-- .../gnucash/android/db/DatabaseAdapter.java | 1 + .../gnucash/android/db/DatabaseHelper.java | 116 +++++++++++++++++- .../org/gnucash/android/model/Account.java | 39 ++++-- .../ui/account/AccountFormFragment.java | 16 ++- .../transaction/BulkMoveDialogFragment.java | 2 +- .../transaction/TransactionFormFragment.java | 2 +- .../ui/transaction/TransactionsActivity.java | 7 +- .../widget/WidgetConfigurationActivity.java | 17 ++- .../QualifiedAccountNameCursorAdapter.java | 5 +- 10 files changed, 212 insertions(+), 50 deletions(-) diff --git a/app/src/org/gnucash/android/db/AccountsDbAdapter.java b/app/src/org/gnucash/android/db/AccountsDbAdapter.java index 66c97d524..d99fd6631 100644 --- a/app/src/org/gnucash/android/db/AccountsDbAdapter.java +++ b/app/src/org/gnucash/android/db/AccountsDbAdapter.java @@ -69,21 +69,26 @@ public void close() { */ public long addAccount(Account account){ ContentValues contentValues = new ContentValues(); - contentValues.put(DatabaseHelper.KEY_NAME, account.getName()); - contentValues.put(DatabaseHelper.KEY_TYPE, account.getAccountType().name()); - contentValues.put(DatabaseHelper.KEY_UID, account.getUID()); + contentValues.put(DatabaseHelper.KEY_NAME, account.getName()); + contentValues.put(DatabaseHelper.KEY_TYPE, account.getAccountType().name()); + contentValues.put(DatabaseHelper.KEY_UID, account.getUID()); contentValues.put(DatabaseHelper.KEY_CURRENCY_CODE, account.getCurrency().getCurrencyCode()); - contentValues.put(DatabaseHelper.KEY_PARENT_ACCOUNT_UID, account.getParentUID()); - contentValues.put(DatabaseHelper.KEY_DEFAULT_TRANSFER_ACCOUNT_UID, account.getDefaultTransferAccountUID()); - contentValues.put(DatabaseHelper.KEY_PLACEHOLDER, account.isPlaceholderAccount() ? 1 : 0); - contentValues.put(DatabaseHelper.KEY_COLOR_CODE, account.getColorHexCode()); - contentValues.put(DatabaseHelper.KEY_FAVORITE, account.isFavorite() ? 1 : 0); + contentValues.put(DatabaseHelper.KEY_PLACEHOLDER, account.isPlaceholderAccount() ? 1 : 0); + contentValues.put(DatabaseHelper.KEY_COLOR_CODE, account.getColorHexCode()); + contentValues.put(DatabaseHelper.KEY_FAVORITE, account.isFavorite() ? 1 : 0); + contentValues.put(DatabaseHelper.KEY_FULL_NAME, account.getFullName()); + contentValues.put(DatabaseHelper.KEY_PARENT_ACCOUNT_UID, account.getParentUID()); + contentValues.put(DatabaseHelper.KEY_DEFAULT_TRANSFER_ACCOUNT_UID, account.getDefaultTransferAccountUID()); + long rowId = -1; if ((rowId = getAccountID(account.getUID())) > 0){ //if account already exists, then just update Log.d(TAG, "Updating existing account"); - mDb.update(DatabaseHelper.ACCOUNTS_TABLE_NAME, contentValues, - DatabaseHelper.KEY_ROW_ID + " = " + rowId, null); + int rowsAffected = mDb.update(DatabaseHelper.ACCOUNTS_TABLE_NAME, contentValues, + DatabaseHelper.KEY_ROW_ID + " = " + rowId, null); + if (rowsAffected == 1){ + updateAccount(rowId, DatabaseHelper.KEY_FULL_NAME, getFullyQualifiedAccountName(rowId)); + } } else { Log.d(TAG, "Adding new account to db"); rowId = mDb.insert(DatabaseHelper.ACCOUNTS_TABLE_NAME, null, contentValues); @@ -91,6 +96,8 @@ public long addAccount(Account account){ //now add transactions if there are any if (rowId > 0){ + //update the fully qualified account name + updateAccount(rowId, DatabaseHelper.KEY_FULL_NAME, getFullyQualifiedAccountName(rowId)); for (Transaction t : account.getTransactions()) { mTransactionsAdapter.addTransaction(t); } @@ -237,6 +244,7 @@ public Account buildAccountInstance(Cursor c){ account.setDefaultTransferAccountUID(c.getString(DatabaseAdapter.COLUMN_DEFAULT_TRANSFER_ACCOUNT_UID)); account.setColorCode(c.getString(DatabaseAdapter.COLUMN_COLOR_CODE)); account.setFavorite(c.getInt(DatabaseAdapter.COLUMN_FAVORITE) == 1); + account.setFullName(c.getString(DatabaseAdapter.COLUMN_FULL_NAME)); return account; } @@ -441,6 +449,21 @@ public Cursor fetchAllRecords(){ return cursor; } + /** + * Returns a cursor to all account records in the database ordered by full name. + * GnuCash ROOT accounts are ignored + * @return {@link Cursor} to all account records + */ + public Cursor fetchAllRecordsOrderedByFullName(){ + Log.v(TAG, "Fetching all accounts from db"); + String selection = DatabaseHelper.KEY_TYPE + " != ?" ; + return mDb.query(DatabaseHelper.ACCOUNTS_TABLE_NAME, + null, + selection, + new String[]{AccountType.ROOT.name()}, + null, null, + DatabaseHelper.KEY_FULL_NAME + " ASC"); + } @Override public Cursor fetchRecord(long rowId) { @@ -471,7 +494,19 @@ public Cursor fetchAccounts(String condition){ DatabaseHelper.KEY_NAME + " ASC"); return cursor; } - + + /** + * Returns a Cursor set of accounts which fulfill condition + *

This method returns the accounts list sorted by the full account name

+ * @param condition SQL WHERE statement without the 'WHERE' itself + * @return Cursor set of accounts which fulfill condition + */ + public Cursor fetchAccountsOrderedByFullName(String condition){ + Log.v(TAG, "Fetching all accounts from db where " + condition); + return mDb.query(DatabaseHelper.ACCOUNTS_TABLE_NAME, + null, condition, null, null, null, + DatabaseHelper.KEY_FULL_NAME + " ASC"); + } /** * Returns the balance of an account while taking sub-accounts into consideration * @return Account Balance of an account including sub-accounts diff --git a/app/src/org/gnucash/android/db/DatabaseAdapter.java b/app/src/org/gnucash/android/db/DatabaseAdapter.java index 84a71b3d6..fd9952c7a 100644 --- a/app/src/org/gnucash/android/db/DatabaseAdapter.java +++ b/app/src/org/gnucash/android/db/DatabaseAdapter.java @@ -58,6 +58,7 @@ public abstract class DatabaseAdapter { public static final int COLUMN_DEFAULT_TRANSFER_ACCOUNT_UID = 7; public static final int COLUMN_COLOR_CODE = 8; public static final int COLUMN_FAVORITE = 9; + public static final int COLUMN_FULL_NAME = 10; /** * {@link DatabaseHelper} for creating and opening the database diff --git a/app/src/org/gnucash/android/db/DatabaseHelper.java b/app/src/org/gnucash/android/db/DatabaseHelper.java index 5cc0fcf50..2541ff60f 100644 --- a/app/src/org/gnucash/android/db/DatabaseHelper.java +++ b/app/src/org/gnucash/android/db/DatabaseHelper.java @@ -16,13 +16,13 @@ package org.gnucash.android.db; -import org.gnucash.android.model.Account.AccountType; - import android.content.ContentValues; import android.content.Context; +import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; +import org.gnucash.android.model.Account.AccountType; /** * Helper class for managing the SQLite database. @@ -46,7 +46,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { * Database version. * With any change to the database schema, this number must increase */ - private static final int DATABASE_VERSION = 5; + private static final int DATABASE_VERSION = 6; /** * Name of accounts table @@ -70,7 +70,13 @@ public class DatabaseHelper extends SQLiteOpenHelper { * Currently used by all tables */ public static final String KEY_NAME = "name"; - + + /** + * Key for fully qualified name of the account column + * This name includes the parent hierarchy + */ + public static final String KEY_FULL_NAME = "full_name"; + /** * Unique Identifier. */ @@ -170,6 +176,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { + KEY_DEFAULT_TRANSFER_ACCOUNT_UID + " varchar(255), " + KEY_COLOR_CODE + " varchar(255), " + KEY_FAVORITE + " tinyint default 0, " + + KEY_FULL_NAME + " varchar(255), " + "UNIQUE (" + KEY_UID + ")" + ");"; @@ -275,10 +282,109 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { oldVersion = 5; } + + if (oldVersion == 5 && newVersion >= 6){ + Log.i(TAG, "Upgrading database to version 6"); + String addFullAccountNameQuery = " ALTER TABLE " + ACCOUNTS_TABLE_NAME + + " ADD COLUMN " + KEY_FULL_NAME + " varchar(255) "; + db.execSQL(addFullAccountNameQuery); + + //update all existing accounts with their fully qualified name + Cursor cursor = db.query(DatabaseHelper.ACCOUNTS_TABLE_NAME, + new String[]{KEY_ROW_ID, KEY_UID}, + null, null, null, null, null); + while(cursor != null && cursor.moveToNext()){ + String uid = cursor.getString(cursor.getColumnIndexOrThrow(KEY_UID)); + String fullName = getFullyQualifiedAccountName(db, uid); + + if (fullName == null) + continue; + + ContentValues contentValues = new ContentValues(); + contentValues.put(KEY_FULL_NAME, fullName); + + long id = cursor.getLong(cursor.getColumnIndexOrThrow(KEY_ROW_ID)); + db.update(ACCOUNTS_TABLE_NAME, contentValues, KEY_ROW_ID + " = " + id, null); + } + + if (cursor != null) { + cursor.close(); + } + + oldVersion = 6; + } } if (oldVersion != newVersion) { - Log.i(TAG, "Upgrade for the database failed. The Database is currently at version " + oldVersion); + Log.w(TAG, "Upgrade for the database failed. The Database is currently at version " + oldVersion); } } + + /** + * Performs same functtion as {@link org.gnucash.android.db.AccountsDbAdapter#getFullyQualifiedAccountName(String)} + *

This method is only necessary because we cannot open the database again (by instantiating {@link AccountsDbAdapter} + * while it is locked for upgrades. So we reimplement the method here.

+ * @param db SQLite database + * @param accountUID Unique ID of account whose fully qualified name is to be determined + * @return Fully qualified (colon-sepaated) account name + * @see org.gnucash.android.db.AccountsDbAdapter#getFullyQualifiedAccountName(String) + */ + private String getFullyQualifiedAccountName(SQLiteDatabase db, String accountUID){ + //get the parent account UID of the account + Cursor cursor = db.query(DatabaseHelper.ACCOUNTS_TABLE_NAME, + new String[] {DatabaseHelper.KEY_ROW_ID, DatabaseHelper.KEY_PARENT_ACCOUNT_UID}, + DatabaseHelper.KEY_UID + " = ?", + new String[]{accountUID}, + null, null, null, null); + + String parentAccountUID = null; + if (cursor != null && cursor.moveToFirst()){ + parentAccountUID = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.KEY_PARENT_ACCOUNT_UID)); + cursor.close(); + } + + //get the name of the account + cursor = db.query(DatabaseHelper.ACCOUNTS_TABLE_NAME, + new String[]{DatabaseHelper.KEY_ROW_ID, DatabaseHelper.KEY_NAME}, + DatabaseHelper.KEY_UID + " = '" + accountUID + "'", + null, null, null, null); + + String accountName = null; + if (cursor != null && cursor.moveToFirst()){ + accountName = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.KEY_NAME)); + cursor.close(); + } + + String gnucashRootAccountUID = getGnuCashRootAccountUID(db); + if (parentAccountUID == null || accountName == null + || parentAccountUID.equalsIgnoreCase(gnucashRootAccountUID)){ + return accountName; + } + + String parentAccountName = getFullyQualifiedAccountName(db, parentAccountUID); + + return parentAccountName + AccountsDbAdapter.ACCOUNT_NAME_SEPARATOR + accountName; + } + + /** + * Returns the GnuCash ROOT account UID. + *

In GnuCash desktop account structure, there is a root account (which is not visible in the UI) from which + * other top level accounts derive. GnuCash Android does not have this ROOT account by default unless the account + * structure was imported from GnuCash for desktop. Hence this method also returns null as an + * acceptable result.

+ *

Note: NULL is an acceptable response, be sure to check for it

+ * @return Unique ID of the GnuCash root account. + */ + private String getGnuCashRootAccountUID(SQLiteDatabase db){ + String condition = DatabaseHelper.KEY_TYPE + "= '" + AccountType.ROOT.name() + "'"; + Cursor cursor = db.query(DatabaseHelper.ACCOUNTS_TABLE_NAME, + null, condition, null, null, null, + DatabaseHelper.KEY_NAME + " ASC"); + String rootUID = null; + if (cursor != null && cursor.moveToFirst()){ + rootUID = cursor.getString(DatabaseAdapter.COLUMN_UID); + cursor.close(); + } + return rootUID; + } } diff --git a/app/src/org/gnucash/android/model/Account.java b/app/src/org/gnucash/android/model/Account.java index 1f25a99dc..ff27efaab 100644 --- a/app/src/org/gnucash/android/model/Account.java +++ b/app/src/org/gnucash/android/model/Account.java @@ -117,7 +117,13 @@ public enum OfxAccountType {CHECKING, SAVINGS, MONEYMRKT, CREDITLINE } * Name of this account */ private String mName; - + + /** + * Fully qualified name of this account including the parent hierarchy. + * On instantiation of an account, the full name is set to the name by default + */ + private String mFullName; + /** * Currency used by transactions in this account */ @@ -179,8 +185,9 @@ public enum OfxAccountType {CHECKING, SAVINGS, MONEYMRKT, CREDITLINE } */ public Account(String name) { setName(name); - this.mUID = generateUID(); - this.mCurrency = Currency.getInstance(Money.DEFAULT_CURRENCY_CODE); + this.mFullName = mName; + this.mUID = generateUID(); + this.mCurrency = Currency.getInstance(Money.DEFAULT_CURRENCY_CODE); } /** @@ -190,8 +197,9 @@ public Account(String name) { */ public Account(String name, Currency currency){ setName(name); - this.mUID = generateUID(); - this.mCurrency = currency; + this.mFullName = mName; + this.mUID = generateUID(); + this.mCurrency = currency; } /** @@ -209,8 +217,25 @@ public void setName(String name) { public String getName() { return mName; } - - /** + + /** + * Returns the full name of this account. + * The full name is the full account hierarchy name + * @return Fully qualified name of the account + */ + public String getFullName() { + return mFullName; + } + + /** + * Sets the fully qualified name of the account + * @param fullName Fully qualified account name + */ + public void setFullName(String fullName) { + this.mFullName = fullName; + } + + /** * Generates a unique ID for the account based on the name and a random string. * This represents the ACCTID in the exported OFX and should have a maximum of 22 alphanumeric characters * @return Generated Unique ID string diff --git a/app/src/org/gnucash/android/ui/account/AccountFormFragment.java b/app/src/org/gnucash/android/ui/account/AccountFormFragment.java index 3401ef9e2..3551a85cb 100644 --- a/app/src/org/gnucash/android/ui/account/AccountFormFragment.java +++ b/app/src/org/gnucash/android/ui/account/AccountFormFragment.java @@ -141,11 +141,6 @@ public class AccountFormFragment extends SherlockFragment { */ private Spinner mDefaulTransferAccountSpinner; - /** - * Cursor holding data set of eligible transfer accounts - */ - private Cursor mDefaultTransferAccountCursor; - /** * Checkbox indicating if account is a placeholder account */ @@ -486,15 +481,18 @@ private void loadDefaultTransferAccoutList(){ String condition = DatabaseHelper.KEY_ROW_ID + " != " + mSelectedAccountId + " AND " + DatabaseHelper.KEY_PLACEHOLDER + "=0" + " AND " + DatabaseHelper.KEY_UID + " != '" + mAccountsDbAdapter.getGnuCashRootAccountUID() + "'"; - mDefaultTransferAccountCursor = mAccountsDbAdapter.fetchAccounts(condition); + /* + Cursor holding data set of eligible transfer accounts + */ + Cursor defaultTransferAccountCursor = mAccountsDbAdapter.fetchAccountsOrderedByFullName(condition); - if (mDefaultTransferAccountCursor == null || mDefaulTransferAccountSpinner.getCount() <= 0){ + if (defaultTransferAccountCursor == null || mDefaulTransferAccountSpinner.getCount() <= 0){ setDefaultTransferAccountInputsVisible(false); } mDefaultTransferAccountCursorAdapter = new QualifiedAccountNameCursorAdapter(getActivity(), android.R.layout.simple_spinner_item, - mDefaultTransferAccountCursor); + defaultTransferAccountCursor); mParentAccountCursorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mDefaulTransferAccountSpinner.setAdapter(mParentAccountCursorAdapter); } @@ -512,7 +510,7 @@ private void loadParentAccountList(){ //TODO: Limit all descendants of the account to eliminate the possibility of cyclic hierarchy } - mParentAccountCursor = mAccountsDbAdapter.fetchAccounts(condition); + mParentAccountCursor = mAccountsDbAdapter.fetchAccountsOrderedByFullName(condition); if (mParentAccountCursor == null || mParentAccountCursor.getCount() <= 0){ final View view = getView(); view.findViewById(R.id.layout_parent_account).setVisibility(View.GONE); diff --git a/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java b/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java index 6b72af9f9..122eba05a 100644 --- a/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java @@ -102,7 +102,7 @@ public void onActivityCreated(Bundle savedInstanceState) { getDialog().setTitle(title); mAccountsDbAdapter = new AccountsDbAdapter(getActivity()); - Cursor cursor = mAccountsDbAdapter.fetchAllRecords(); + Cursor cursor = mAccountsDbAdapter.fetchAllRecordsOrderedByFullName(); SimpleCursorAdapter mCursorAdapter = new QualifiedAccountNameCursorAdapter(getActivity(), android.R.layout.simple_spinner_item, cursor); diff --git a/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java b/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java index 5f7fb9be2..251a920ea 100644 --- a/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java @@ -420,7 +420,7 @@ private void updateTransferAccountsList(){ + "' AND " + DatabaseHelper.KEY_PLACEHOLDER + " = 0" + ")"; - mCursor = mAccountsDbAdapter.fetchAccounts(conditions); + mCursor = mAccountsDbAdapter.fetchAccountsOrderedByFullName(conditions); mCursorAdapter = new QualifiedAccountNameCursorAdapter(getActivity(), android.R.layout.simple_spinner_item, mCursor); diff --git a/app/src/org/gnucash/android/ui/transaction/TransactionsActivity.java b/app/src/org/gnucash/android/ui/transaction/TransactionsActivity.java index ae035c045..fa16cd9b2 100644 --- a/app/src/org/gnucash/android/ui/transaction/TransactionsActivity.java +++ b/app/src/org/gnucash/android/ui/transaction/TransactionsActivity.java @@ -348,9 +348,10 @@ private void setTitleIndicatorColor() { */ private void setupActionBarNavigation() { // set up spinner adapter for navigation list - Cursor accountsCursor = mAccountsDbAdapter.fetchAllRecords(); + Cursor accountsCursor = mAccountsDbAdapter.fetchAllRecordsOrderedByFullName(); - SpinnerAdapter mSpinnerAdapter = new QualifiedAccountNameCursorAdapter(getSupportActionBar().getThemedContext(), + SpinnerAdapter mSpinnerAdapter = new QualifiedAccountNameCursorAdapter( + getSupportActionBar().getThemedContext(), R.layout.sherlock_spinner_item, accountsCursor); ((ResourceCursorAdapter) mSpinnerAdapter) .setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item); @@ -370,7 +371,7 @@ private void setupActionBarNavigation() { public void updateNavigationSelection() { // set the selected item in the spinner int i = 0; - Cursor accountsCursor = mAccountsDbAdapter.fetchAllRecords(); + Cursor accountsCursor = mAccountsDbAdapter.fetchAllRecordsOrderedByFullName(); while (accountsCursor.moveToNext()) { long id = accountsCursor.getLong(DatabaseAdapter.COLUMN_ROW_ID); if (mAccountId == id) { diff --git a/app/src/org/gnucash/android/ui/widget/WidgetConfigurationActivity.java b/app/src/org/gnucash/android/ui/widget/WidgetConfigurationActivity.java index b3c988912..f0b74fc39 100644 --- a/app/src/org/gnucash/android/ui/widget/WidgetConfigurationActivity.java +++ b/app/src/org/gnucash/android/ui/widget/WidgetConfigurationActivity.java @@ -54,8 +54,7 @@ */ public class WidgetConfigurationActivity extends Activity { private AccountsDbAdapter mAccountsDbAdapter; - private SimpleCursorAdapter mCursorAdapter; - private int mAppWidgetId; + private int mAppWidgetId; private Spinner mAccountsSpinner; private Button mOkButton; @@ -72,18 +71,18 @@ public void onCreate(Bundle savedInstanceState) { mCancelButton = (Button) findViewById(R.id.btn_cancel); mAccountsDbAdapter = new AccountsDbAdapter(this); - Cursor cursor = mAccountsDbAdapter.fetchAllRecords(); + Cursor cursor = mAccountsDbAdapter.fetchAllRecordsOrderedByFullName(); if (cursor.getCount() <= 0){ Toast.makeText(this, R.string.error_no_accounts, Toast.LENGTH_LONG).show(); finish(); } - - mCursorAdapter = new QualifiedAccountNameCursorAdapter(this, - android.R.layout.simple_spinner_item, - cursor); - mCursorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mAccountsSpinner.setAdapter(mCursorAdapter); + + SimpleCursorAdapter cursorAdapter = new QualifiedAccountNameCursorAdapter(this, + android.R.layout.simple_spinner_item, + cursor); + cursorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mAccountsSpinner.setAdapter(cursorAdapter); bindListeners(); } diff --git a/app/src/org/gnucash/android/util/QualifiedAccountNameCursorAdapter.java b/app/src/org/gnucash/android/util/QualifiedAccountNameCursorAdapter.java index 2d1b6c64b..edbf2e83f 100644 --- a/app/src/org/gnucash/android/util/QualifiedAccountNameCursorAdapter.java +++ b/app/src/org/gnucash/android/util/QualifiedAccountNameCursorAdapter.java @@ -33,20 +33,17 @@ * @author Ngewi Fet */ public class QualifiedAccountNameCursorAdapter extends SimpleCursorAdapter { - private AccountsDbAdapter mAccountDbAdapter; public QualifiedAccountNameCursorAdapter(Context context, int layout, Cursor c) { super(context, layout, c, - new String[] {DatabaseHelper.KEY_NAME}, + new String[] {DatabaseHelper.KEY_FULL_NAME}, new int[] {android.R.id.text1}, 0); - mAccountDbAdapter = new AccountsDbAdapter(context); } @Override public void bindView(View view, Context context, Cursor cursor) { super.bindView(view, context, cursor); TextView textView = (TextView) view.findViewById(android.R.id.text1); - textView.setText(mAccountDbAdapter.getFullyQualifiedAccountName(cursor.getLong(DatabaseAdapter.COLUMN_ROW_ID))); textView.setEllipsize(TextUtils.TruncateAt.MIDDLE); } } From 0935748d821acfa4acc436eba1114d2250592524 Mon Sep 17 00:00:00 2001 From: Ngewi Fet Date: Thu, 13 Feb 2014 14:13:00 +0100 Subject: [PATCH 4/4] Fixed: Crash when bulk moving transactions Fixed: Missing string for internationalization in ru_RU locale - fixes #143 Fixed: Random crashes when opening ScheduledTransactions list - fixes #141 Fixed: Blank screen after closing AccountFormFragment Fixed: Correct normal balance of the different types of ASSET accounts Fixed: Limit the target accounts for bulk transfers to same currency and non-placeholder accounts Improved: Remember last opened tab in accounts list Improved: Added version infomation for feedback email Updated version for 1.3.1 beta release --- CHANGELOG.md | 12 ++++ app/AndroidManifest.xml | 4 +- app/res/values-ru/strings.xml | 2 +- app/res/values/strings.xml | 1 + app/res/xml/preference_headers.xml | 5 +- .../org/gnucash/android/model/Account.java | 5 +- .../android/ui/account/AccountsActivity.java | 70 +++++++++++-------- .../transaction/BulkMoveDialogFragment.java | 17 +++-- .../ScheduledTransactionsListFragment.java | 18 ++--- .../transaction/TransactionsListFragment.java | 1 + 10 files changed, 86 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 713960433..f152f304b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ Change Log =============================================================================== +Version 1.3.1 *(2014-02-14)* +---------------------------- +* Fixed: Crash when bulk moving transactions +* Fixed: Missing string for internationalization in ru_RU locale +* Fixed: Random crashes when opening ScheduledTransactions list +* Fixed: Blank screen after closing AccountFormFragment +* Fixed: Correct normal balance of the different types of ASSET accounts +* Fixed: Limit the target accounts for bulk transfers to same currency and non-placeholder accounts +* Improved: Remember last opened tab in accounts list +* Improved: Added version information for feedback email +* Improved: Lists of accounts are now sorted by the fully qualified account name + Version 1.3.0 *(2014-02-10)* ---------------------------- * Fixed: Some file managers do not display all files available for import diff --git a/app/AndroidManifest.xml b/app/AndroidManifest.xml index c496f35d8..9df9d16ad 100644 --- a/app/AndroidManifest.xml +++ b/app/AndroidManifest.xml @@ -17,8 +17,8 @@ + android:versionCode="26" + android:versionName="@string/app_version_name" > diff --git a/app/res/values-ru/strings.xml b/app/res/values-ru/strings.xml index 9b491b78f..531eab1a7 100644 --- a/app/res/values-ru/strings.xml +++ b/app/res/values-ru/strings.xml @@ -336,7 +336,7 @@ Импортируются счета Нажмите ещё раз для подтверждения. ВСЕ записи будут удалены! Проводки - Дочерние счета + Дочерние счета Поиск Формат экспорта по умолчанию Формат файла, используемый по умолчанию при экспорте diff --git a/app/res/values/strings.xml b/app/res/values/strings.xml index 840bfc11b..57dc1fd87 100644 --- a/app/res/values/strings.xml +++ b/app/res/values/strings.xml @@ -17,6 +17,7 @@ GnuCash + 1.3.1 Create Account Edit Account Info diff --git a/app/res/xml/preference_headers.xml b/app/res/xml/preference_headers.xml index 6f9ffbaef..88cc6c0f6 100644 --- a/app/res/xml/preference_headers.xml +++ b/app/res/xml/preference_headers.xml @@ -29,6 +29,9 @@
+ android:data="mailto:gnucash.org@gmail.com" > + + +
\ No newline at end of file diff --git a/app/src/org/gnucash/android/model/Account.java b/app/src/org/gnucash/android/model/Account.java index ff27efaab..f5c409aed 100644 --- a/app/src/org/gnucash/android/model/Account.java +++ b/app/src/org/gnucash/android/model/Account.java @@ -71,8 +71,9 @@ public class Account { * they are currently not used except for exporting */ public enum AccountType { - CASH(TransactionType.DEBIT), BANK, CREDIT, ASSET(TransactionType.DEBIT), LIABILITY, INCOME, - EXPENSE(TransactionType.DEBIT), PAYABLE, RECEIVABLE, EQUITY, CURRENCY, STOCK, MUTUAL, ROOT; + CASH(TransactionType.DEBIT), BANK(TransactionType.DEBIT), CREDIT, ASSET(TransactionType.DEBIT), LIABILITY, + INCOME, EXPENSE(TransactionType.DEBIT), PAYABLE, RECEIVABLE(TransactionType.DEBIT), EQUITY, CURRENCY, + STOCK(TransactionType.DEBIT), MUTUAL(TransactionType.DEBIT), ROOT; /** * Indicates that this type of normal balance the account type has diff --git a/app/src/org/gnucash/android/ui/account/AccountsActivity.java b/app/src/org/gnucash/android/ui/account/AccountsActivity.java index bf5769bef..9570b8525 100644 --- a/app/src/org/gnucash/android/ui/account/AccountsActivity.java +++ b/app/src/org/gnucash/android/ui/account/AccountsActivity.java @@ -58,7 +58,9 @@ import java.io.FileNotFoundException; import java.io.InputStream; import java.util.Currency; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; /** * Manages actions related to accounts, displaying, exporting and creating new accounts @@ -123,12 +125,21 @@ public class AccountsActivity extends SherlockFragmentActivity implements OnAcco */ public static final int INDEX_FAVORITE_ACCOUNTS_FRAGMENT = 2; + /** + * Used to save the index of the last open tab and restore the pager to that index + */ + public static final String LAST_OPEN_TAB_INDEX = "last_open_tab"; + /** * Map containing fragments for the different tabs */ - private SparseArray mFragmentPageReferenceMap = new SparseArray(); + private Map mFragmentPageReferenceMap = new HashMap(); + + /** + * ViewPager which manages the different tabs + */ + private ViewPager mPager; - /** * Dialog which is shown to the user on first start prompting the user to create some accounts */ @@ -201,14 +212,14 @@ public void onCreate(Bundle savedInstanceState) { init(); - ViewPager pager = (ViewPager) findViewById(R.id.pager); + mPager = (ViewPager) findViewById(R.id.pager); TitlePageIndicator titlePageIndicator = (TitlePageIndicator) findViewById(R.id.titles); final Intent intent = getIntent(); String action = intent.getAction(); if (action != null && action.equals(Intent.ACTION_INSERT_OR_EDIT)) { //enter account creation/edit mode if that was specified - pager.setVisibility(View.GONE); + mPager.setVisibility(View.GONE); titlePageIndicator.setVisibility(View.GONE); long accountId = intent.getLongExtra(UxArgument.SELECTED_ACCOUNT_ID, 0L); @@ -219,15 +230,15 @@ public void onCreate(Bundle savedInstanceState) { showAddAccountFragment(parentAccountId); } } else if (action != null && action.equals(ACTION_VIEW_RECURRING)) { - pager.setVisibility(View.GONE); + mPager.setVisibility(View.GONE); titlePageIndicator.setVisibility(View.GONE); showRecurringTransactionsFragment(); } else { //show the simple accounts list PagerAdapter mPagerAdapter = new AccountViewPagerAdapter(getSupportFragmentManager()); - pager.setAdapter(mPagerAdapter); - titlePageIndicator.setViewPager(pager); - pager.setCurrentItem(INDEX_TOP_LEVEL_ACCOUNTS_FRAGMENT); + mPager.setAdapter(mPagerAdapter); + titlePageIndicator.setViewPager(mPager); + mPager.setCurrentItem(INDEX_TOP_LEVEL_ACCOUNTS_FRAGMENT); } } @@ -268,6 +279,16 @@ private void init() { protected void onResume() { super.onResume(); TransactionsActivity.sLastTitleColor = -1; + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + int lastTabIndex = preferences.getInt(LAST_OPEN_TAB_INDEX, INDEX_TOP_LEVEL_ACCOUNTS_FRAGMENT); + mPager.setCurrentItem(lastTabIndex); + } + + @Override + protected void onStop() { + super.onPause(); + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + preferences.edit().putInt(LAST_OPEN_TAB_INDEX, mPager.getCurrentItem()).commit(); } /** @@ -276,25 +297,19 @@ protected void onResume() { * @return true if the minor version has been increased, false otherwise. */ private boolean hasNewFeatures(){ - try { - PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); - String versionName = packageInfo.versionName; - int end = versionName.indexOf('.'); - int currentMinor = Integer.parseInt(versionName.substring(0, end)); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - int previousMinor = prefs.getInt(getString(R.string.key_previous_minor_version), 0); - if (currentMinor > previousMinor){ - Editor editor = prefs.edit(); - editor.putInt(getString(R.string.key_previous_minor_version), currentMinor); - editor.commit(); - return true; - } - } catch (NameNotFoundException e) { - //do not show anything in that case - e.printStackTrace(); - } - return false; + String versionName = getResources().getString(R.string.app_version_name); + int end = versionName.indexOf('.'); + int currentMinor = Integer.parseInt(versionName.substring(0, end)); + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + int previousMinor = prefs.getInt(getString(R.string.key_previous_minor_version), 0); + if (currentMinor > previousMinor){ + Editor editor = prefs.edit(); + editor.putInt(getString(R.string.key_previous_minor_version), currentMinor); + editor.commit(); + return true; + } + return false; } /** @@ -409,7 +424,6 @@ private void showAccountFormFragment(Bundle args){ fragmentTransaction.replace(R.id.fragment_container, accountFormFragment, AccountsActivity.FRAGMENT_NEW_ACCOUNT); - fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } diff --git a/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java b/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java index 122eba05a..84f4616cb 100644 --- a/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java @@ -18,8 +18,10 @@ import org.gnucash.android.R; import org.gnucash.android.db.AccountsDbAdapter; +import org.gnucash.android.db.DatabaseHelper; import org.gnucash.android.db.TransactionsDbAdapter; import org.gnucash.android.ui.UxArgument; +import org.gnucash.android.ui.util.Refreshable; import org.gnucash.android.ui.widget.WidgetConfigurationActivity; import android.database.Cursor; @@ -102,7 +104,12 @@ public void onActivityCreated(Bundle savedInstanceState) { getDialog().setTitle(title); mAccountsDbAdapter = new AccountsDbAdapter(getActivity()); - Cursor cursor = mAccountsDbAdapter.fetchAllRecordsOrderedByFullName(); + String conditions = "(" + DatabaseHelper.KEY_ROW_ID + " != " + mOriginAccountId + " AND " + + DatabaseHelper.KEY_CURRENCY_CODE + " = '" + mAccountsDbAdapter.getCurrencyCode(mOriginAccountId) + + "' AND " + DatabaseHelper.KEY_UID + " != '" + mAccountsDbAdapter.getGnuCashRootAccountUID() + + "' AND " + DatabaseHelper.KEY_PLACEHOLDER + " = 0" + + ")"; + Cursor cursor = mAccountsDbAdapter.fetchAccountsOrderedByFullName(conditions); SimpleCursorAdapter mCursorAdapter = new QualifiedAccountNameCursorAdapter(getActivity(), android.R.layout.simple_spinner_item, cursor); @@ -142,13 +149,9 @@ public void onClick(View v) { trxnAdapter.moveTranscation(trxnId, dstAccountId); } trxnAdapter.close(); - - Fragment f = getActivity() - .getSupportFragmentManager() - .findFragmentByTag(TransactionsActivity.FRAGMENT_TRANSACTIONS_LIST); - + WidgetConfigurationActivity.updateAllWidgets(getActivity()); - ((TransactionsListFragment)f).refresh(); + ((Refreshable)getTargetFragment()).refresh(); dismiss(); } }); diff --git a/app/src/org/gnucash/android/ui/transaction/ScheduledTransactionsListFragment.java b/app/src/org/gnucash/android/ui/transaction/ScheduledTransactionsListFragment.java index 4c12ad4fb..f863eec18 100644 --- a/app/src/org/gnucash/android/ui/transaction/ScheduledTransactionsListFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/ScheduledTransactionsListFragment.java @@ -351,14 +351,16 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { parentView.post(new Runnable() { @Override public void run() { - float extraPadding = getResources().getDimension(R.dimen.edge_padding); - final android.graphics.Rect hitRect = new Rect(); - checkBoxView.getHitRect(hitRect); - hitRect.right += extraPadding; - hitRect.bottom += 3*extraPadding; - hitRect.top -= extraPadding; - hitRect.left -= 2*extraPadding; - parentView.setTouchDelegate(new TouchDelegate(hitRect, checkBoxView)); + if (isAdded()){ //may be run when fragment has been unbound from activity + float extraPadding = getResources().getDimension(R.dimen.edge_padding); + final android.graphics.Rect hitRect = new Rect(); + checkBoxView.getHitRect(hitRect); + hitRect.right += extraPadding; + hitRect.bottom += 3*extraPadding; + hitRect.top -= extraPadding; + hitRect.left -= 2*extraPadding; + parentView.setTouchDelegate(new TouchDelegate(hitRect, checkBoxView)); + } } }); diff --git a/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java b/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java index 3e0b06a5d..59cf3c081 100644 --- a/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java @@ -341,6 +341,7 @@ protected void showBulkMoveDialog(){ args.putLong(UxArgument.ORIGIN_ACCOUNT_ID, mAccountID); args.putLongArray(UxArgument.SELECTED_TRANSACTION_IDS, getListView().getCheckedItemIds()); bulkMoveFragment.setArguments(args); + bulkMoveFragment.setTargetFragment(this, 0); bulkMoveFragment.show(ft, "bulk_move_dialog"); }