From b40db96182f1a22bc3dd9e13edf3f2b38ec04691 Mon Sep 17 00:00:00 2001 From: Clam Date: Mon, 3 Nov 2014 22:46:02 +1100 Subject: [PATCH] Phew. Changed settings backend. Used more ENUM, fixed some bugs. * Settings now use the database instead of SharedPreferences (which are bad) * Changed many constants to now be ENUMs. * Changed some character mappings which were too big. * Added limit to number of results returned to stop crash. * Changed Lang id so can do binary operations on it * Removed some old code --- build.gradle | 2 +- res/drawable-hdpi/btn_circle_disable.png | Bin 0 -> 1064 bytes .../btn_circle_disable_focused.png | Bin 0 -> 2347 bytes res/drawable-hdpi/btn_circle_normal.png | Bin 0 -> 1636 bytes res/drawable-hdpi/btn_circle_pressed.png | Bin 0 -> 3382 bytes res/drawable-hdpi/btn_circle_selected.png | Bin 0 -> 2819 bytes .../ic_btn_round_more_disabled.png | Bin 0 -> 314 bytes .../ic_btn_round_more_normal.png | Bin 0 -> 350 bytes res/drawable-hdpi/ime_de_lang_lower.png | Bin 894 -> 888 bytes res/drawable-hdpi/ime_de_lang_single.png | Bin 915 -> 817 bytes res/drawable-hdpi/ime_de_lang_upper.png | Bin 823 -> 809 bytes res/drawable/btn_circle.xml | 31 ++ res/drawable/ic_btn_round_more.xml | 9 + res/drawable/ime_de_lang_lower.png | Bin 894 -> 888 bytes res/drawable/ime_de_lang_single.png | Bin 915 -> 817 bytes res/drawable/ime_de_lang_upper.png | Bin 823 -> 809 bytes res/layout/addwordview.xml | 2 +- res/layout/checkbox.xml | 26 ++ res/layout/preference_dialog.xml | 10 + res/layout/preference_list_content.xml | 25 ++ res/layout/setting.xml | 29 ++ res/layout/setting_sum.xml | 37 ++ res/layout/setting_widget.xml | 43 +++ res/values-de/strings-german.xml | 3 +- res/values-ru/strings.xml | 3 +- res/values/arrays.xml | 35 +- res/values/colors.xml | 7 +- res/values/const.xml | 14 + res/values/strings.xml | 3 +- res/values/styles.xml | 4 + res/xml/prefs.xml | 60 ++-- .../android/traditionalt9/AddWordAct.java | 14 +- .../nyanya/android/traditionalt9/CharMap.java | 50 ++- .../android/traditionalt9/LangHelper.java | 74 ++-- .../nyanya/android/traditionalt9/T9DB.java | 324 +++++++++++------- .../android/traditionalt9/TraditionalT9.java | 99 +++--- .../traditionalt9/TraditionalT9Settings.java | 267 ++++++--------- .../settings/CustomInflater.java | 41 +++ .../traditionalt9/settings/Setting.java | 41 +++ .../settings/SettingAdapter.java | 45 +++ .../traditionalt9/settings/SettingCheck.java | 37 ++ .../traditionalt9/settings/SettingList.java | 66 ++++ .../settings/SettingMultiList.java | 87 +++++ .../widget/MultiSelectListPreference.java | 38 +- 44 files changed, 1043 insertions(+), 483 deletions(-) create mode 100644 res/drawable-hdpi/btn_circle_disable.png create mode 100644 res/drawable-hdpi/btn_circle_disable_focused.png create mode 100644 res/drawable-hdpi/btn_circle_normal.png create mode 100644 res/drawable-hdpi/btn_circle_pressed.png create mode 100644 res/drawable-hdpi/btn_circle_selected.png create mode 100644 res/drawable-hdpi/ic_btn_round_more_disabled.png create mode 100644 res/drawable-hdpi/ic_btn_round_more_normal.png create mode 100644 res/drawable/btn_circle.xml create mode 100644 res/drawable/ic_btn_round_more.xml create mode 100644 res/layout/checkbox.xml create mode 100644 res/layout/preference_dialog.xml create mode 100644 res/layout/preference_list_content.xml create mode 100644 res/layout/setting.xml create mode 100644 res/layout/setting_sum.xml create mode 100644 res/layout/setting_widget.xml create mode 100644 res/values/const.xml create mode 100644 src/org/nyanya/android/traditionalt9/settings/CustomInflater.java create mode 100644 src/org/nyanya/android/traditionalt9/settings/Setting.java create mode 100644 src/org/nyanya/android/traditionalt9/settings/SettingAdapter.java create mode 100644 src/org/nyanya/android/traditionalt9/settings/SettingCheck.java create mode 100644 src/org/nyanya/android/traditionalt9/settings/SettingList.java create mode 100644 src/org/nyanya/android/traditionalt9/settings/SettingMultiList.java diff --git a/build.gradle b/build.gradle index e70e401a..fb5ca7ef 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:0.13.2' + classpath 'com.android.tools.build:gradle:0.14.0' } } apply plugin: 'android' diff --git a/res/drawable-hdpi/btn_circle_disable.png b/res/drawable-hdpi/btn_circle_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..917bc2840c6a730db3baef3cf153234dfbfafe37 GIT binary patch literal 1064 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 Rt1bWl002ovPDHLkV1kUDeu4l1 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/btn_circle_normal.png b/res/drawable-hdpi/btn_circle_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..72a4388ce945f7b7da037c961ed3ce7ec369e3b8 GIT binary patch literal 1636 zcmV-q2AlbbP)htD82 z8Ho!7!ta<2$fWo$1=V|H#VQO8GCmXwO}swilvXlR%d58m_k!NN?bHI^C|{b%>WONw$9GpN0yP*%CB zhg3Os^!m-5#;rY;?ays40fnEZs3>Sy+@Q2Bk}Ix$b~B0EV`+3O*>sN#mC0OyL1?j~ zE;={gMK4+{WMany-9L6hWivNmr7{vMx#;N){^YEHR9Ud*XR>S()B}`0urzU6xn@0G z)se;>s}@}>Ldbf7;Vv(~YT2UTCRvV*ue)AR-Ff90hDuta>(|m!4cWHpO4)FJ)dX%~ zx`ZC%MGmsb?Ug9ZBH}Q)AZ(pX z>W1WL^pXe^Pp3!%qY83yyA16RjUpA#8wmuUv;-G}AX15{4ta9quyJtafh?@D1_lCw ztyb}|h@p&wgH4`1HjdZFMsifp&=E*f1X(NCP>?S^9v4np_D}&cvyVl;qMQ zDyr{K=LaivS;b~@gj}_yz#1D?35GI{D7KMh^ek32r1`}O#Y4>}*Pz=|FzNp&U}(e0 zN83y`3>#tTmAQ=7l z10BuJvXK!j;0mosCOEmD@!$jxyMoE*|L$4}I)*2VUYEEhS&o(kL6#dVq!(l5-s0Z4L!xtz;^rm#^OYmeGZ`0y%TsRZ5n!2-O*;Z{V?CnWwO8 zo66kDlRICqp)AkY=BXMO!{VT%8FF@SH_u?ten3e5;U9mm|x2|;m{kfjw0 z>u&FfcVmQXSSd@J6yGp7{^9Gdyu=Wh-ENu%EF(#G-AKM*WrVJaSKPhzvg^)EcF;~M zhHs~G|1wGnXyrPU7ztWwA=1-v?F!_-Pgq&< zSeQ(adrO$OBv{B|+Wh}FfSkZ4#V~2#WE$xFQo}&v>~U@HcY#KNBt5j3wNw+?eCpgp iHjzza6WK&IaD5N;J?zsE`>wJ800006E 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 E03T6vcK`qY literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ime_de_lang_lower.png b/res/drawable-hdpi/ime_de_lang_lower.png index 58019867b9a7d9c702c53deb98c59c7186bb0bd9..aa6413ea98a4111b6e9703db7d01cd7452084ec1 100644 GIT binary patch delta 844 zcmV-S1GD`82KWY$Ie#iiL_t(YiS3qONMuzQz<=k?9kW@L2BTVNABvzB7R?BPm<`z> z0*Odb3fdr91i`VM%g1RRLVOaReA$(S>TQ*MlCTGX2=^Z9ohjmF<%iRXDcW(>RxJPn-R-rio76B34DFf}#x zI`9~f6cG%g3pl^OzyE`X$iczEAETqA<6~oE?-h&1?|&@7E5P$BD=VLfh}7%#+RV(% z$3sIy?{95weI+7NEEc~2o&i!epf{7rWR0Vdk&!DvKhWRT*Y~ys$O0Fu)oMvZWMN_9 zI`9tgRyLdc(6Z|XdThWG^Yil`SOyv3tk#V6{WaiKGp|%CdpkQjzwGVp{ZuZOf3@r` z*Z>z$t$$X_0SJPi3N&?ADB|{Di#i@CC641ni9{k&N{Q!rKf12l1On~jI87thbz1;k zU0sh_>8bSCNCY&)FsyZSbfjiyXFs2toBI;DtsNTYcL5xrk;~=Q!!WD?EH5u#2F?Lb zE-fv+X#ws4wNk0{4Zy_2#3kZ-NdRhaaPZ9V@PBZMxZv(8wiNKx#>U1q6UW`%-Ji{4 zTCsf*cy@Af@(q*D)oQi0zP|oxxm^A_48x#OsoVg1IgzF=aU*+fb93`*5CpeGM10@> ztxza@WYU*7{T>I-6$*vRp67jUAK>WdXnSpKZA$xc4Z!r0q`pZHaa|;I%p-l}25`c$N|X0000DVNK|@$vD` zfZ>gejh{qB4h{}}1-gOuM!<8Elauc`s~H*^dLOs}+}zyUd>|sSx3~8QxD$)T?u&>- zqtTy%yTBdGvOaXa?eFh@6XvOf9I_wr#^TFG?u^$mMdmot>RWrfF7f z+cuKP(w|I|gTKww~CpzrYTFzyZ-jYhv05jiAvQQs$q8=wGZ6LkPxQ&Ur~i-;N<8%yYV+CYK&ZoQy>T=;{*;A??E;A%V`PlrOG zBunsE`&32#{2x^!f>KK9OuYK3bTDVsfGQxmF}%7NJbD3T>PLnRxZ~FWmudh18?6aw c0-oOf0KVEBFI^M3PXGV_07*qoM6N<$g6J5Rq5uE@ diff --git a/res/drawable-hdpi/ime_de_lang_single.png b/res/drawable-hdpi/ime_de_lang_single.png index e2bc6a50c665813c0ceb37d4598f36b20d4aff55..f8f48ef2cda948b58f537be57b8b0bf8ea778d1a 100644 GIT binary patch delta 773 zcmV+g1N!`v2eAf_IDZ1;Nklcm14|EtX(EP?t<5XXGEtWHPCRg@spreSHz29@qyM zBEn`JU^mdXyuAEYM8vl3uZxR|?-Pl{Y%-agcVVNWqYpHssz^qUR$!O*g2csuJ;14@ zrKNWwBID!Zqkq5^;0$oiG|h)Dq_?;C7ElY6>wx?8dq8`wZYy&kMj;tW34q`4{|T%B zp8-!e9DZC=Q*$U740eV>p=*&yOiWy@uC6`;u(r0g*xK6q6i5QLQtEeM z2Z=;tRzzfSa&kyZQK45-7mY@5y1M{Q1NAK}Ef-c-SAXOG=52j_{R4199~$rf0Di6W z0pNTQ;39B#Zf@?mh=^rbpW52my1Tl%?pl`hNkn99Z0tU81Ss3gMRSjLVq+GJz3PA+b~cm@p`?E<2bfuS?jiKzXQ^MvjLFH<-9;8`P_Jb zgYE6@7Xjwy=cj@1wrziP#|Hv|d*n~uH}d7>7hnS^AXmtNh$w(`I$aLb07rpirfFUe z27{ddu~_U0knHK{d7Vn7z5oml4`0?2dI7q-yM7OmuV0QU(^hZt0U$6mG<4VPi^t>B zQ&UsVEX#T$A~G{Ga~s&}LbqCrc4_&Jo2Gdul}ddsp0l#D@^Wx+u-%n-Th&yrtU?E= zBwsqved(ecWVZc1P)d1=<{5g}E!$X&u+dWc z;Ftz{aQG_pZ7>SHls<0k$@%QV`XWBaP?60CyZK^U%-x94s8;{cw%>pQ;HW&x z^T3rm5{t#|10Miafor|Jy?32RMn*e{hdTVQIhhkpsIRXN0T%`a2JZO%{>!;sF4fuDc{dV? z+|K24DZk%;xv#J9HehH1{cWL@fRa*507OIqMkErs1~54}`NQ<|w7Iddu{%6G{2f3z z9KMN7cYim|=M+(T-sAK6j552+FpMBTcX#)PU0q%80aRC48vubopsCFNd4OWE=*GU6 zLu~3@XliPD7hrR9a}B%T0NCE%Huv`SQf{~VMEgB33}YWS0#5#vA{{>Ye7**_2!vW% zTCUE{&i2;T)inYP4GrA~9;egkb%0DJW3{)pPk*(wwS6lhs=2wjF_}!R>%$#8d)ESQ zrPJxP(+W*QWNB&XD{OYXIW{)-nPXpBSy^0MT>Rb{kB*LhjLjmKL(>}I;?B;_kAJms zI-On{A0Ph|ctbk|f$;qN{FjA7Vc%I-C=~W%vDg>DCG5&pP9;}sgCCn-KAk$zVdk;v zx?!h7cMkOm@bci`;7x#uiHX&jnVD_iSKvTIj-8u!*ix<4Y1vW+a)jNoPn1$hukmOS yINi6X4{(G{ZxN9{%K5D1|NmrG04f0gU493$S<%)w?S~Hl0000B&r<% diff --git a/res/drawable-hdpi/ime_de_lang_upper.png b/res/drawable-hdpi/ime_de_lang_upper.png index 51e5027e9b0e8112612ed7cb8867c4c8888da021..87590ab1b0e92d61c55da57d8751f823c4012948 100644 GIT binary patch delta 764 zcmVMej4KntJ+a6VC_x_<$WR8`spPz5aD1h9k< zRYg%$>E9-wjY&E&CSWOYQ9p1A=#+tuV+AMy1>jJ=D?kTu8EBXBLMk$uBjB%$LjwZY zY<5F5NV!}-ipS$$78Vws12=(-Qg1c-HVSYZ(Aj(PlZSi>gGq4RP=K)Z$nO0v}O%@jy zKkV)8ZGY&xe&qA{OkLMYtE;Q)GAVHufO817>FMd7I{QgI;O_43_U!EJN9;zMQcLoA zx(Ag?#f9B0U1on}Y;0^;mi`r+9X`ija=s+(C$d6C##Ucw_Gl_9u9|}U{kj_vnUpeJq7e; uOj8Ru2J*mRv+jcm&VA7OyKVur0Qd)RgsykGB0000A!Pdi delta 779 zcmV+m1N8i<2Db)~Ie+O%L_t(YiS3pYH6hcy%7vf_j_=q90F{{}%vpYA%+}TWg z#58vM!)3TL|GED;=bm#IA*JLjp`GdJ4S|M0L!cq>e-MGCD}O$Wo#^Q3=(TOTHJwgphlYmk0+mv!6!r5lJv}`YjYi9+X*$6OmX?-QRk}D2bgi$i zf0RqqDNAf-H9`zPW^1OW*3-3*7r zF{r2UFMmNH!~pOG*i#Nw@XGlo;2sfh9LK=B_zGTrO#p5O{SPRbj^PYFSe`tl|y1lFD%f@8V;?MZAF*I&@}D*?b3f{n2bF zVu(K@*dNzb;FmIV)prAL>iQ!)2&uRZ;E2Z0Z$qFVaP|Vf0iEE4xO*_#H~;_u07*qo JL + + + + + + + + + + + diff --git a/res/drawable/ic_btn_round_more.xml b/res/drawable/ic_btn_round_more.xml new file mode 100644 index 00000000..b4bfc879 --- /dev/null +++ b/res/drawable/ic_btn_round_more.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/res/drawable/ime_de_lang_lower.png b/res/drawable/ime_de_lang_lower.png index 58019867b9a7d9c702c53deb98c59c7186bb0bd9..aa6413ea98a4111b6e9703db7d01cd7452084ec1 100644 GIT binary patch delta 844 zcmV-S1GD`82KWY$Ie#iiL_t(YiS3qONMuzQz<=k?9kW@L2BTVNABvzB7R?BPm<`z> z0*Odb3fdr91i`VM%g1RRLVOaReA$(S>TQ*MlCTGX2=^Z9ohjmF<%iRXDcW(>RxJPn-R-rio76B34DFf}#x zI`9~f6cG%g3pl^OzyE`X$iczEAETqA<6~oE?-h&1?|&@7E5P$BD=VLfh}7%#+RV(% z$3sIy?{95weI+7NEEc~2o&i!epf{7rWR0Vdk&!DvKhWRT*Y~ys$O0Fu)oMvZWMN_9 zI`9tgRyLdc(6Z|XdThWG^Yil`SOyv3tk#V6{WaiKGp|%CdpkQjzwGVp{ZuZOf3@r` z*Z>z$t$$X_0SJPi3N&?ADB|{Di#i@CC641ni9{k&N{Q!rKf12l1On~jI87thbz1;k zU0sh_>8bSCNCY&)FsyZSbfjiyXFs2toBI;DtsNTYcL5xrk;~=Q!!WD?EH5u#2F?Lb zE-fv+X#ws4wNk0{4Zy_2#3kZ-NdRhaaPZ9V@PBZMxZv(8wiNKx#>U1q6UW`%-Ji{4 zTCsf*cy@Af@(q*D)oQi0zP|oxxm^A_48x#OsoVg1IgzF=aU*+fb93`*5CpeGM10@> ztxza@WYU*7{T>I-6$*vRp67jUAK>WdXnSpKZA$xc4Z!r0q`pZHaa|;I%p-l}25`c$N|X0000DVNK|@$vD` zfZ>gejh{qB4h{}}1-gOuM!<8Elauc`s~H*^dLOs}+}zyUd>|sSx3~8QxD$)T?u&>- zqtTy%yTBdGvOaXa?eFh@6XvOf9I_wr#^TFG?u^$mMdmot>RWrfF7f z+cuKP(w|I|gTKww~CpzrYTFzyZ-jYhv05jiAvQQs$q8=wGZ6LkPxQ&Ur~i-;N<8%yYV+CYK&ZoQy>T=;{*;A??E;A%V`PlrOG zBunsE`&32#{2x^!f>KK9OuYK3bTDVsfGQxmF}%7NJbD3T>PLnRxZ~FWmudh18?6aw c0-oOf0KVEBFI^M3PXGV_07*qoM6N<$g6J5Rq5uE@ diff --git a/res/drawable/ime_de_lang_single.png b/res/drawable/ime_de_lang_single.png index e2bc6a50c665813c0ceb37d4598f36b20d4aff55..f8f48ef2cda948b58f537be57b8b0bf8ea778d1a 100644 GIT binary patch delta 773 zcmV+g1N!`v2eAf_IDZ1;Nklcm14|EtX(EP?t<5XXGEtWHPCRg@spreSHz29@qyM zBEn`JU^mdXyuAEYM8vl3uZxR|?-Pl{Y%-agcVVNWqYpHssz^qUR$!O*g2csuJ;14@ zrKNWwBID!Zqkq5^;0$oiG|h)Dq_?;C7ElY6>wx?8dq8`wZYy&kMj;tW34q`4{|T%B zp8-!e9DZC=Q*$U740eV>p=*&yOiWy@uC6`;u(r0g*xK6q6i5QLQtEeM z2Z=;tRzzfSa&kyZQK45-7mY@5y1M{Q1NAK}Ef-c-SAXOG=52j_{R4199~$rf0Di6W z0pNTQ;39B#Zf@?mh=^rbpW52my1Tl%?pl`hNkn99Z0tU81Ss3gMRSjLVq+GJz3PA+b~cm@p`?E<2bfuS?jiKzXQ^MvjLFH<-9;8`P_Jb zgYE6@7Xjwy=cj@1wrziP#|Hv|d*n~uH}d7>7hnS^AXmtNh$w(`I$aLb07rpirfFUe z27{ddu~_U0knHK{d7Vn7z5oml4`0?2dI7q-yM7OmuV0QU(^hZt0U$6mG<4VPi^t>B zQ&UsVEX#T$A~G{Ga~s&}LbqCrc4_&Jo2Gdul}ddsp0l#D@^Wx+u-%n-Th&yrtU?E= zBwsqved(ecWVZc1P)d1=<{5g}E!$X&u+dWc z;Ftz{aQG_pZ7>SHls<0k$@%QV`XWBaP?60CyZK^U%-x94s8;{cw%>pQ;HW&x z^T3rm5{t#|10Miafor|Jy?32RMn*e{hdTVQIhhkpsIRXN0T%`a2JZO%{>!;sF4fuDc{dV? z+|K24DZk%;xv#J9HehH1{cWL@fRa*507OIqMkErs1~54}`NQ<|w7Iddu{%6G{2f3z z9KMN7cYim|=M+(T-sAK6j552+FpMBTcX#)PU0q%80aRC48vubopsCFNd4OWE=*GU6 zLu~3@XliPD7hrR9a}B%T0NCE%Huv`SQf{~VMEgB33}YWS0#5#vA{{>Ye7**_2!vW% zTCUE{&i2;T)inYP4GrA~9;egkb%0DJW3{)pPk*(wwS6lhs=2wjF_}!R>%$#8d)ESQ zrPJxP(+W*QWNB&XD{OYXIW{)-nPXpBSy^0MT>Rb{kB*LhjLjmKL(>}I;?B;_kAJms zI-On{A0Ph|ctbk|f$;qN{FjA7Vc%I-C=~W%vDg>DCG5&pP9;}sgCCn-KAk$zVdk;v zx?!h7cMkOm@bci`;7x#uiHX&jnVD_iSKvTIj-8u!*ix<4Y1vW+a)jNoPn1$hukmOS yINi6X4{(G{ZxN9{%K5D1|NmrG04f0gU493$S<%)w?S~Hl0000B&r<% diff --git a/res/drawable/ime_de_lang_upper.png b/res/drawable/ime_de_lang_upper.png index 51e5027e9b0e8112612ed7cb8867c4c8888da021..87590ab1b0e92d61c55da57d8751f823c4012948 100644 GIT binary patch delta 764 zcmVMej4KntJ+a6VC_x_<$WR8`spPz5aD1h9k< zRYg%$>E9-wjY&E&CSWOYQ9p1A=#+tuV+AMy1>jJ=D?kTu8EBXBLMk$uBjB%$LjwZY zY<5F5NV!}-ipS$$78Vws12=(-Qg1c-HVSYZ(Aj(PlZSi>gGq4RP=K)Z$nO0v}O%@jy zKkV)8ZGY&xe&qA{OkLMYtE;Q)GAVHufO817>FMd7I{QgI;O_43_U!EJN9;zMQcLoA zx(Ag?#f9B0U1on}Y;0^;mi`r+9X`ija=s+(C$d6C##Ucw_Gl_9u9|}U{kj_vnUpeJq7e; uOj8Ru2J*mRv+jcm&VA7OyKVur0Qd)RgsykGB0000A!Pdi delta 779 zcmV+m1N8i<2Db)~Ie+O%L_t(YiS3pYH6hcy%7vf_j_=q90F{{}%vpYA%+}TWg z#58vM!)3TL|GED;=bm#IA*JLjp`GdJ4S|M0L!cq>e-MGCD}O$Wo#^Q3=(TOTHJwgphlYmk0+mv!6!r5lJv}`YjYi9+X*$6OmX?-QRk}D2bgi$i zf0RqqDNAf-H9`zPW^1OW*3-3*7r zF{r2UFMmNH!~pOG*i#Nw@XGlo;2sfh9LK=B_zGTrO#p5O{SPRbj^PYFSe`tl|y1lFD%f@8V;?MZAF*I&@}D*?b3f{n2bF zVu(K@*dNzb;FmIV)prAL>iQ!)2&uRZ;E2Z0Z$qFVaP|Vf0iEE4xO*_#H~;_u07*qo JL + android:text="@android:string/cancel" /> diff --git a/res/layout/checkbox.xml b/res/layout/checkbox.xml new file mode 100644 index 00000000..349d6397 --- /dev/null +++ b/res/layout/checkbox.xml @@ -0,0 +1,26 @@ + + + + + + diff --git a/res/layout/preference_dialog.xml b/res/layout/preference_dialog.xml new file mode 100644 index 00000000..0d88ebf8 --- /dev/null +++ b/res/layout/preference_dialog.xml @@ -0,0 +1,10 @@ + + + diff --git a/res/layout/preference_list_content.xml b/res/layout/preference_list_content.xml new file mode 100644 index 00000000..56792935 --- /dev/null +++ b/res/layout/preference_list_content.xml @@ -0,0 +1,25 @@ + + + diff --git a/res/layout/setting.xml b/res/layout/setting.xml new file mode 100644 index 00000000..7b07e2f5 --- /dev/null +++ b/res/layout/setting.xml @@ -0,0 +1,29 @@ + + + + + + + + + + diff --git a/res/layout/setting_sum.xml b/res/layout/setting_sum.xml new file mode 100644 index 00000000..c93ce998 --- /dev/null +++ b/res/layout/setting_sum.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + diff --git a/res/layout/setting_widget.xml b/res/layout/setting_widget.xml new file mode 100644 index 00000000..e7ced890 --- /dev/null +++ b/res/layout/setting_widget.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + diff --git a/res/values-de/strings-german.xml b/res/values-de/strings-german.xml index ec63d48d..421b6254 100644 --- a/res/values-de/strings-german.xml +++ b/res/values-de/strings-german.xml @@ -21,16 +21,15 @@ Seite: %1$s/%2$s Wort hinzufügen - OK Schließen Leeres Wort nicht hinzugefügt. Wort mit nicht zuordbarem Buchstaben für %1$s (%2$s) kann nicht hinzugefügt werden. Das Wort (%1$s) ist bereits in der DB. Das Wort (%1$s) ist bereits für %2$s in der DB. - Abbrechen Wort hinzufügen Einstellungen Datenbank nicht verfügbar. + Database unavailable. Using default settings. Wörterbuch-Datenbank wird aktualisiert… Aktualisiere Wörterbuch-Datenbank. Das könnte einen Moment dauern. diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index a24fd6cf..a4ec80c6 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -7,7 +7,6 @@ Слово (%1$s) уже есть в словаре. Слово (%1$s) уже есть в словаре %2$s. Traditional T9 - Отмена Hello world! Клавиатура T9 Цифры @@ -18,7 +17,6 @@ Commit Изменить IME Режим ввода - OK Ошибка: Внешняя память недоступна. Резервное копирование невозможно невозможно. Резервное копирование базы данных IME Предупреждение: Существующая копия базы данных будет перезаписана. Продолжить? @@ -62,6 +60,7 @@ Ошибка. \n Словарь %1$s не найден. Используется для озвучивания изменения режима ввода. Режим уведомления + Database unavailable. Using default settings. Добавить слово Traditional T9 настройки diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 905df4f8..f8625287 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -1,29 +1,26 @@ - Dictionary - Text - Number - - - 0 - 1 - 2 + Dictionary + Text + Number + + @integer/INPUT_DICT + @integer/INPUT_TEXT + @integer/INPUT_NUM + - - 0 - - English - Russian - German - - - 0 - 1 - 2 + English + Russian + German + + @integer/LANG_EN + @integer/LANG_RU + @integer/LANG_DE + Caps off diff --git a/res/values/colors.xml b/res/values/colors.xml index 2db951e4..330e3485 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -1,10 +1,9 @@ #FF000000 - #FFE35900 - #ff808080 - #bbffffff - #FFFCBE2B + #ffc66ac3 + #ff68f0e9 + #e19185df #FF2A9AEB #FFA8A8A8 #FFFFFFFF diff --git a/res/values/const.xml b/res/values/const.xml new file mode 100644 index 00000000..95b6dc28 --- /dev/null +++ b/res/values/const.xml @@ -0,0 +1,14 @@ + + + + 1 + 2 + 4 + + 0 + 1 + 2 + + @integer/INPUT_DICT + @integer/LANG_EN + diff --git a/res/values/strings.xml b/res/values/strings.xml index cb8fb5b6..d34add4e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -22,16 +22,15 @@ Page: %1$s/%2$s Add word - OK Close Blank word not added. Cannot add word with unmappable character for %1$s (%2$s). Word (%1$s) already in DB. Word (%1$s) already in DB for %2$s. - Cancel Add Word Settings Database unavailable. + Database unavailable. Using default settings. Updating dictionary database… Updating dictionary database, this might take a while. diff --git a/res/values/styles.xml b/res/values/styles.xml index d10f8464..fae1512c 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -17,4 +17,8 @@ + + + + diff --git a/res/xml/prefs.xml b/res/xml/prefs.xml index 1754fddf..2eebe11b 100644 --- a/res/xml/prefs.xml +++ b/res/xml/prefs.xml @@ -1,35 +1,29 @@ - - - - - - + + + + + - - - - - - - + + + + + + diff --git a/src/org/nyanya/android/traditionalt9/AddWordAct.java b/src/org/nyanya/android/traditionalt9/AddWordAct.java index 8b4290ac..a9d2ed31 100644 --- a/src/org/nyanya/android/traditionalt9/AddWordAct.java +++ b/src/org/nyanya/android/traditionalt9/AddWordAct.java @@ -3,20 +3,19 @@ package org.nyanya.android.traditionalt9; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.app.Activity; -import android.preference.PreferenceManager; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.EditText; +import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING; + public class AddWordAct extends Activity { View main; int lang; - SharedPreferences pref; String origword; @Override @@ -36,7 +35,6 @@ public class AddWordAct extends Activity { et.setSelection(origword.length()); setContentView(v); main = v; - pref = PreferenceManager.getDefaultSharedPreferences(this); } public void addWordButton(View v) { @@ -49,13 +47,13 @@ public class AddWordAct extends Activity { public void doAddWord(String text) { T9DB db = T9DB.getInstance(this); try { - db.addWord(text, lang); + db.addWord(text, LangHelper.LANGUAGE.get(lang)); } catch (DBException e) { AlertDialog.Builder builder = new AlertDialog.Builder(this); String msg = e.getMessage(); //Log.e("AddWord.doAddWord", msg); builder.setMessage(msg).setTitle(R.string.add_word) - .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); @@ -64,9 +62,7 @@ public class AddWordAct extends Activity { AlertDialog dialog = builder.create(); dialog.show(); } - SharedPreferences.Editor prefedit = pref.edit(); - prefedit.putString("last_word", text); - prefedit.commit(); + db.storeSettingString(SETTING.LAST_WORD, text); } diff --git a/src/org/nyanya/android/traditionalt9/CharMap.java b/src/org/nyanya/android/traditionalt9/CharMap.java index 1e1deffc..ac605a8b 100644 --- a/src/org/nyanya/android/traditionalt9/CharMap.java +++ b/src/org/nyanya/android/traditionalt9/CharMap.java @@ -8,6 +8,8 @@ import java.util.Map; import android.util.Log; +import org.nyanya.android.traditionalt9.LangHelper.LANGUAGE; + public class CharMap { protected static final AbstractList> CHARTABLE = new ArrayList>(LangHelper.NLANGS); static { @@ -16,12 +18,10 @@ public class CharMap { enMap.put('.', 1); enMap.put(',', 1); enMap.put('!', 1); enMap.put('?', 1); enMap.put('-', 1); enMap.put('"', 1); enMap.put('\'', 1); enMap.put('@', 1); enMap.put('#', 1); enMap.put('$', 1); enMap.put('%', 1); enMap.put('&', 1); - enMap.put('*', 1); enMap.put('(', 1); enMap.put(')', 1); enMap.put('1', 1); - enMap.put(':', 1); enMap.put(';', 1); enMap.put('/', 1); enMap.put('\\', 1); - enMap.put('+', 1); enMap.put('=', 1); enMap.put('<', 1); enMap.put('>', 1); - enMap.put('[', 1); enMap.put(']', 1); enMap.put('{', 1); enMap.put('}', 1); - enMap.put('^', 1); enMap.put('|', 1); enMap.put('_', 1); enMap.put('~', 1); - enMap.put('`', 1); + enMap.put('*', 1); enMap.put('(', 1); enMap.put(')', 1); enMap.put(':', 1); + enMap.put(';', 1); enMap.put('/', 1); enMap.put('+', 1); enMap.put('=', 1); + enMap.put('<', 1); enMap.put('>', 1); enMap.put('^', 1); enMap.put('_', 1); + enMap.put('~', 1); enMap.put('1', 1); enMap.put('a', 2); enMap.put('á', 2); enMap.put('ä', 2); enMap.put('â', 2); enMap.put('à', 2); enMap.put('å', 2); enMap.put('b', 2); enMap.put('c', 2); enMap.put('ç', 2); enMap.put('2', 2); @@ -48,12 +48,10 @@ public class CharMap { ruMap.put('.', 1); ruMap.put(',', 1); ruMap.put('!', 1); ruMap.put('?', 1); ruMap.put('-', 1); ruMap.put('"', 1); ruMap.put('\'', 1); ruMap.put('@', 1); ruMap.put('#', 1); ruMap.put('$', 1); ruMap.put('%', 1); ruMap.put('&', 1); - ruMap.put('*', 1); ruMap.put('(', 1); ruMap.put(')', 1); ruMap.put('1', 1); - ruMap.put(':', 1); ruMap.put(';', 1); ruMap.put('/', 1); ruMap.put('\\', 1); - ruMap.put('+', 1); ruMap.put('=', 1); ruMap.put('<', 1); ruMap.put('>', 1); - ruMap.put('[', 1); ruMap.put(']', 1); ruMap.put('{', 1); ruMap.put('}', 1); - ruMap.put('^', 1); ruMap.put('|', 1); ruMap.put('_', 1); ruMap.put('~', 1); - ruMap.put('`', 1); ruMap.put('1', 1); + ruMap.put('*', 1); ruMap.put('(', 1); ruMap.put(')', 1); ruMap.put(':', 1); + ruMap.put(';', 1); ruMap.put('/', 1); ruMap.put('+', 1); ruMap.put('=', 1); + ruMap.put('<', 1); ruMap.put('>', 1); ruMap.put('^', 1); ruMap.put('_', 1); + ruMap.put('~', 1); ruMap.put('1', 1); ruMap.put('а', 2); ruMap.put('б', 2); ruMap.put('в', 2); ruMap.put('г', 2); ruMap.put('2', 2); ruMap.put('д', 3); ruMap.put('е', 3); ruMap.put('ё', 3); ruMap.put('ж', 3); @@ -92,33 +90,33 @@ public class CharMap { { 'ш', 'щ', 'ъ', 'ы', 'Ш', 'Щ', 'Ъ', 'Ы', '8' }, { 'ь', 'э', 'ю', 'я', 'Ь', 'Э', 'Ю', 'Я', '9' }, { ' ', '\n' } }; protected static final char[][] DET9TABLE = { - { '0', '+' }, - { '.', ',', '?', '!', '"', '\'', '-', '@', '€', '$', '%', '&', '*', '(', ')', '_', '1' }, - { 'a', 'á', 'ä', 'â', 'à', 'å', 'b', 'c', 'ç', 'A', 'Á', 'Ä', 'Â', 'À', 'Å', 'B', 'C', 'Ç', '2' }, - { 'd', 'e', 'é','ë','è','ê', 'f', 'D', 'E', 'É', 'Ë', 'È', 'Ê', 'F', '3' }, - { 'g', 'h', 'i', 'í', 'ï', 'G', 'H', 'I', 'Í', 'Ï', '4' }, + { ' ', '+', '0' }, + { '.', ',', '?', '!', ':', ';', '"', '\'', '-', '@', '^', '€', '$', '%', '&', '*', '(', ')', '_', '1' }, + { 'a', 'b', 'c', 'A', 'B', 'C', 'ä', 'Ä','á', 'â', 'à', 'å', 'ç', 'Á', 'Â', 'À', 'Å', 'Ç', '2' }, + { 'd', 'e', 'f', 'D', 'E', 'F', 'é','ë','è','ê', 'É', 'Ë', 'È', 'Ê', '3' }, + { 'g', 'h', 'i', 'G', 'H', 'I', 'í', 'ï', 'Í', 'Ï', '4' }, { 'j', 'k', 'l', 'J', 'K', 'L', '5' }, - { 'm', 'n', 'ñ', 'o', 'ó','ö','ô', 'M', 'N', 'Ñ', 'O', 'Ó', 'Ö', 'Ô', '6' }, - { 'p', 'q', 'r', 's', 'ß', 'P', 'Q', 'R', 'S', '7' }, - { 't', 'u', 'û','ü', 'v', 'T', 'U', 'Û', 'Ü', 'V', '8' }, + { 'm', 'n', 'o', 'M', 'N', 'O', 'ö', 'Ö', 'ñ','ó','ô', 'Ñ', 'Ó', 'Ô', '6' }, + { 'p', 'q', 'r', 's', 'P', 'Q', 'R', 'S', 'ß', '7' }, + { 't', 'u', 'v', 'T', 'U', 'V', 'ü', 'Ü', 'û', 'Û', '8' }, { 'w', 'x', 'y', 'z', 'W', 'X', 'Y', 'Z', '9' }, - { ' ', '\n' } }; + { '\n' } }; protected static final char[][][] T9TABLE = {ENT9TABLE, RUT9TABLE, DET9TABLE}; protected static final int[] ENT9CAPSTART = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4, 0 }; protected static final int [] RUT9CAPSTART = {0, 0, 4, 5, 4, 4, 4, 4, 4, 4, 0}; - protected static final int[] DET9CAPSTART = { 0, 0, 9, 7, 5, 3, 7, 5, 5, 4, 0 }; + protected static final int[] DET9CAPSTART = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4, 0 }; protected static final int[][] T9CAPSTART = {ENT9CAPSTART, RUT9CAPSTART, DET9CAPSTART}; - protected static String getStringSequence(String word, int lang) { + protected static String getStringSequence(String word, LANGUAGE lang) { StringBuilder seq = new StringBuilder(); - String tword = word.toLowerCase(LangHelper.LOCALES[lang]); + String tword = word.toLowerCase(LangHelper.LOCALES[lang.index]); for (int i = 0; i < word.length(); i++) { char c = tword.charAt(i); - Integer z = CharMap.CHARTABLE.get(lang).get(c); + Integer z = CharMap.CHARTABLE.get(lang.index).get(c); if (z == null) { Log.e("getStringSequence", - "ERROR: " + (int) c + " NOT FOUND FOR [" + lang + "] (" + Integer.toHexString((int) c) + ") Index: " + i); + "ERROR: " + (int) c + " NOT FOUND FOR [" + lang.name() + "] (" + Integer.toHexString((int) c) + ") Index: " + i); throw new NullPointerException(); } seq.append(z.toString()); diff --git a/src/org/nyanya/android/traditionalt9/LangHelper.java b/src/org/nyanya/android/traditionalt9/LangHelper.java index 9f1e3b9e..0131837b 100644 --- a/src/org/nyanya/android/traditionalt9/LangHelper.java +++ b/src/org/nyanya/android/traditionalt9/LangHelper.java @@ -1,23 +1,45 @@ package org.nyanya.android.traditionalt9; +import android.util.Log; + +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import pl.wavesoftware.widget.MultiSelectListPreference; public class LangHelper { protected static final Locale RUSSIAN = new Locale("ru","RU"); - protected static final int EN = 0; - protected static final int RU = 1; - protected static final int DE = 1; - protected static final Locale[] LOCALES = {Locale.ENGLISH, RUSSIAN, Locale.GERMAN}; - protected static final String[] LANGS = {"EN", "RU", "DE"}; + public enum LANGUAGE { + // MAKE SURE THESE MATCH WITH values/const.xml + NONE(-1, -1), EN(0,1), RU(1,2), DE(2,4), ; + public final int id; + public final int index; + // lookup map + private static final Map lookup = new HashMap(); + private static final LANGUAGE[] ids = LANGUAGE.values(); + static { for (LANGUAGE l : ids) lookup.put(l.id, l); } - protected static final int NLANGS = LANGS.length; + private LANGUAGE(int index, int id) { this.index = index; this.id = id; } + + public static LANGUAGE get(int i) { return lookup.get(i);} + } + + protected static final Locale[] LOCALES = {Locale.ENGLISH, RUSSIAN, Locale.GERMAN}; + //protected static final String[] LANGS = {"EN", "RU", "DE"}; + + public static final int LANG_DEFAULT = LANGUAGE.EN.id; + + protected static final int NLANGS = LANGUAGE.lookup.size(); protected static String getString(int lang) { - return LANGS[lang]; + return LANGUAGE.get(lang).name(); } + protected static int getIndex(LANGUAGE l) { + return l.index; + } + //[LANG][MODE][CAPSMODE] = iconref // first group en, first line LANG, second line TEXT, last line NUM protected static final int[][][] ICONMAP = { @@ -42,31 +64,43 @@ public class LangHelper { }; - protected static int[] buildLangs(CharSequence s) { - int[] ia = MultiSelectListPreference.defaultunpack2Int(s); + public static LANGUAGE[] buildLangs(int i) { int num = 0; //calc size of filtered array - for (int i : ia) { - if (i >= 0 && i < LangHelper.NLANGS) { + for (LANGUAGE l : LANGUAGE.ids) { + if ((i & l.id) == l.id) { num++; } } - int[] ian = new int[num]; - int iansize = 0; - for (int i : ia) { - if (i >= 0 && i < LangHelper.NLANGS) { - ian[iansize] = i; - iansize++; + LANGUAGE[] la = new LANGUAGE[num]; + int lai = 0; + for (LANGUAGE l : LANGUAGE.ids) { + if ((i & l.id) == l.id) { + la[lai] = l; + lai++; } } - return ian; + return la; } - protected static int findIndex(int[] ia, int target) { + public static int shrinkLangs(LANGUAGE[] langs) { + int i = 0; + for (LANGUAGE l : langs) + i = i | l.id; + return i; + } + public static int shrinkLangs(int[] langs) { + int i = 0; + for (int l : langs) + i = i | l; + return i; + } + + protected static int findIndex(LANGUAGE[] ia, LANGUAGE target) { for (int x=0; x lookup = new HashMap(); + private static final SETTING[] settings = SETTING.values(); + static { for (SETTING l : settings) lookup.put(l.id, l); } + + private SETTING(String id, Integer defval) { this.id = id; this.defvalue = defval;} + + public static SETTING get(String i) { return lookup.get(i);} + public static StringBuilder join(SETTING[] settings, StringBuilder sb) { + for (int x=0; x= 2) { - char c = is.charAt(islen - 1); - c++; - q = "SELECT " + COLUMN_WORD + " FROM " + WORD_TABLE_NAME + - " WHERE " + COLUMN_LANG + "=? AND " + COLUMN_SEQ + " >= '" + is + "1" + - "' AND " + COLUMN_SEQ + " < '" + is.substring(0, islen - 1) + c + "'" + - " ORDER BY " + COLUMN_FREQUENCY + " DESC, " + COLUMN_SEQ + " ASC" + - " LIMIT " + (MAX_RESULTS - hits); - cur = db.rawQuery(q, new String[]{String.valueOf(lang)}); - - if (cur.moveToFirst()) { - result = cur.getString(0); - } - if (result == null) { - result = ""; - } - cur.close(); - } - } - return result; - } - protected void updateWords(String is, AbstractList stringList, List intList, - int capsMode, int lang) { + int capsMode, LANGUAGE lang) { stringList.clear(); intList.clear(); // String[] sa = packInts(stringToInts(is), true); @@ -245,20 +347,18 @@ public class T9DB { Toast.makeText(mContext, R.string.database_notready, Toast.LENGTH_SHORT).show(); return; } - Cursor cur = db.rawQuery(QUERY1, new String[] { String.valueOf(lang), is }); + Cursor cur = db.rawQuery(QUERY1, new String[] { String.valueOf(lang.id), is }); int hits = 0; for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { intList.add(cur.getInt(0)); stringList.add(cur.getString(1)); -// if (hits >= 15) { -// break; -// } + if (hits >= MAX_MAX_RESULTS) { break; } // to stop index error in candidate view hits++; } cur.close(); - if ((hits < MINHITS) && (islen <= 2)) { + if ((hits < MINHITS) && (islen >= 2)) { char c = is.charAt(islen - 1); c++; String q = "SELECT " + COLUMN_ID + ", " + COLUMN_WORD + @@ -267,12 +367,12 @@ public class T9DB { "' AND " + COLUMN_SEQ + " < '" + is.substring(0, islen - 1) + c + "'" + " ORDER BY " + COLUMN_FREQUENCY + " DESC, " + COLUMN_SEQ + " ASC" + " LIMIT " + (MAX_RESULTS - hits); - cur = db.rawQuery(q, new String[] { String.valueOf(lang) }); + cur = db.rawQuery(q, new String[] { String.valueOf(lang.id) }); for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { intList.add(cur.getInt(0)); stringList.add(cur.getString(1)); - if (hits >= 20) { + if (hits >= MAX_MAX_RESULTS) { break; } hits++; @@ -294,7 +394,7 @@ public class T9DB { word = iter.next(); switch (capsMode) { case CAPS_ALL: - wordtemp = word.toUpperCase(LangHelper.LOCALES[lang]); + wordtemp = word.toUpperCase(LangHelper.LOCALES[lang.index]); if (wordtemp.equals(word)) { index++; continue; @@ -308,9 +408,9 @@ public class T9DB { break; case CAPS_SINGLE: if (word.length() > 1) { - wordtemp = word.substring(0, 1).toUpperCase(LangHelper.LOCALES[lang]) + word.substring(1); + wordtemp = word.substring(0, 1).toUpperCase(LangHelper.LOCALES[lang.index]) + word.substring(1); } else { - wordtemp = word.toUpperCase(LangHelper.LOCALES[lang]); + wordtemp = word.toUpperCase(LangHelper.LOCALES[lang.index]); } if (wordtemp.equals(word)) { index++; @@ -334,58 +434,6 @@ public class T9DB { //Log.d("T9DB.updateWords", "i:" + is + " words:" + Arrays.toString(stringList.toArray())); } - protected void updateWordsW(String is, Collection stringList, - Collection intList, Collection freq, int lang) { - stringList.clear(); - intList.clear(); - freq.clear(); - // String[] sa = packInts(stringToInts(is), true); - int islen = is.length(); - String q = "SELECT " + COLUMN_ID + ", " + COLUMN_WORD + ", " + COLUMN_FREQUENCY + - " FROM " + WORD_TABLE_NAME + - " WHERE " + COLUMN_LANG + "=? AND " + COLUMN_SEQ + "=?" + - " ORDER BY " + COLUMN_FREQUENCY + " DESC"; - if (!checkReady()) { - Log.e("T9DB.updateWordsW", "not ready"); - Toast.makeText(mContext, R.string.database_notready, Toast.LENGTH_SHORT).show(); - return; - } - Cursor cur = db.rawQuery(q, new String[] { is, String.valueOf(lang) }); - int hits = 0; - for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { - intList.add(cur.getInt(0)); - stringList.add(cur.getString(1)); - freq.add(cur.getInt(2)); - if (hits >= 10) { - break; - } - hits++; - } - cur.close(); - if (hits < MINHITS) { - char c = is.charAt(islen - 1); - c++; - q = "SELECT " + COLUMN_ID + ", " + COLUMN_WORD + ", " + COLUMN_FREQUENCY + - " FROM " + WORD_TABLE_NAME + - " WHERE " + COLUMN_LANG + "=? AND " + COLUMN_SEQ + " >= '" + is + - "' AND " + COLUMN_SEQ + " < '" + is.substring(0, islen - 1) + c + "'" + - " ORDER BY " + COLUMN_FREQUENCY + " DESC, " + COLUMN_SEQ + " ASC" + - " LIMIT " + (MAX_RESULTS - hits); - cur = db.rawQuery(q, new String[] { String.valueOf(lang) }); - - for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { - intList.add(cur.getInt(0)); - stringList.add(cur.getString(1)); - freq.add(cur.getInt(2)); - if (hits >= 10) { - break; - } - hits++; - } - cur.close(); - } - } - private static class DatabaseHelper extends SQLiteOpenHelper { Context mContext = null; @@ -416,7 +464,7 @@ public class T9DB { COLUMN_WORD + " TEXT, " + COLUMN_FREQUENCY + " INTEGER, " + "UNIQUE(" + COLUMN_LANG + ", " + COLUMN_WORD + ") )"); - db.execSQL("CREATE INDEX idx ON " + WORD_TABLE_NAME + "(" + db.execSQL("CREATE INDEX IF NOT EXISTS idx ON " + WORD_TABLE_NAME + "(" + COLUMN_LANG + ", " + COLUMN_SEQ + " ASC, " + COLUMN_FREQUENCY + " DESC )"); db.execSQL("CREATE TRIGGER IF NOT EXISTS " + FREQ_TRIGGER_NAME + " AFTER UPDATE ON " + WORD_TABLE_NAME + @@ -426,19 +474,51 @@ public class T9DB { + COLUMN_FREQUENCY + " / " + FREQ_DIV + " WHERE " + COLUMN_SEQ + " = NEW." + COLUMN_SEQ + ";" + " END;"); + // protected static final String[] setting_keys = {INPUT_MODE, LANG_SUPPORT, MODE_NOTIFY, LAST_LANG}; + db.execSQL("CREATE TABLE IF NOT EXISTS " + SETTING_TABLE_NAME + " (" + + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + DBSettings.SETTING.INPUT_MODE.id + " INTEGER, " + + DBSettings.SETTING.LANG_SUPPORT.id + " INTEGER, " + + DBSettings.SETTING.MODE_NOTIFY.id + " INTEGER, " + + DBSettings.SETTING.LAST_LANG.id + " INTEGER, " + + DBSettings.SETTING.LAST_WORD.id + " TEXT )"); + StringBuilder sb = new StringBuilder("INSERT OR IGNORE INTO "); sb.append(SETTING_TABLE_NAME); + sb.append(" ("); sb.append(COLUMN_ID); sb.append(", "); + sb = DBSettings.SETTING.join(DBSettings.SETTING.settings, sb); + sb.append(") VALUES (1,"); + for (int x=0;x= LangHelper.NLANGS) { - Log.w("T9.sanitizeLang", "Previous lang not supported: " + lang + " langs: " + Arrays.toString(LangHelper.LANGS)); return mLangsAvailable[0]; - } else { + } + else { int index = LangHelper.findIndex(mLangsAvailable, lang); - if (index == -1) { - return mLangsAvailable[mLangIndex]; - } else { - mLangIndex = index; - return lang; - } + mLangIndex = index; + return mLangsAvailable[index]; } } /** @@ -252,8 +238,15 @@ public class TraditionalT9 extends InputMethodService implements // way. clearState(); - mLangsAvailable = LangHelper.buildLangs(pref.getString("pref_lang_support", null)); - mLang = sanitizeLang(pref.getInt("last_lang", 0)); + // get settings + Object[] settings = db.getSettings(new SETTING[] + // 0, 1, 2, + {SETTING.LANG_SUPPORT, SETTING.LAST_LANG, SETTING.MODE_NOTIFY, + // 3, 4 + SETTING.INPUT_MODE, SETTING.LAST_WORD} ); + + mLangsAvailable = LangHelper.buildLangs((Integer)settings[0]); + mLang = sanitizeLang(LANGUAGE.get((Integer)settings[1])); updateCandidates(); @@ -261,7 +254,7 @@ public class TraditionalT9 extends InputMethodService implements mKeyMode = MODE_TEXT; - boolean modenotify = pref.getBoolean("pref_mode_notify", false); + boolean modenotify = settings[2].equals("1"); if (!modenotify && modeNotification != null) { modeNotification = null; } else if (modenotify && modeNotification == null){ @@ -289,7 +282,7 @@ public class TraditionalT9 extends InputMethodService implements // normal alphabetic keyboard, and assume that we should // be doing predictive text (showing candidates as the // user types). - mKeyMode = Integer.parseInt(pref.getString("pref_inputmode", "0")); + mKeyMode = (Integer)settings[3]; // We now look for a few special variations of text that will // modify our behavior. @@ -316,7 +309,7 @@ public class TraditionalT9 extends InputMethodService implements // candidates when in fullscreen mode, otherwise relying // own it displaying its own UI. // ???? - mKeyMode = Integer.parseInt(pref.getString("pref_inputmode", "0")); + mKeyMode = (Integer)settings[3]; } // handle filter list cases... do not hijack DPAD center and make @@ -351,20 +344,18 @@ public class TraditionalT9 extends InputMethodService implements } else { mAddingWord = false; // Log.d("onStartInput", "not adding word"); - prevword = pref.getString("last_word", null); + prevword = (String)settings[4]; if (prevword != null) { onText(prevword); - Editor prefedit = pref.edit(); - prefedit.remove("last_word"); - prefedit.commit(); + db.storeSettingString(SETTING.LAST_WORD, null); } if (modenotify) { Resources r = getResources(); if (mKeyMode != MODE_NUM) - modeNotify(String.format("%s %s %s", r.getStringArray(R.array.pref_lang_titles)[mLang], + modeNotify(String.format("%s %s %s", r.getStringArray(R.array.pref_lang_titles)[mLang.index], r.getStringArray(R.array.keyMode)[mKeyMode], r.getStringArray(R.array.capsMode)[mCapsMode])); else - modeNotify(String.format("%s %s", r.getStringArray(R.array.pref_lang_titles)[mLang], + modeNotify(String.format("%s %s", r.getStringArray(R.array.pref_lang_titles)[mLang.index], r.getStringArray(R.array.keyMode)[mKeyMode])); } } @@ -393,9 +384,7 @@ public class TraditionalT9 extends InputMethodService implements public void onFinishInput() { super.onFinishInput(); // Log.d("onFinishInput", "When is this called?"); - Editor prefedit = pref.edit(); - prefedit.putInt("last_lang", mLang); - prefedit.commit(); + db.storeSettingInt(SETTING.LAST_LANG, mLang.id); if (mEditing == EDITING) { commitTyped(); finish(); @@ -575,6 +564,7 @@ public class TraditionalT9 extends InputMethodService implements case KeyEvent.KEYCODE_9: case KeyEvent.KEYCODE_POUND: case KeyEvent.KEYCODE_STAR: + case 94: event.startTracking(); return true; default: @@ -779,6 +769,7 @@ public class TraditionalT9 extends InputMethodService implements case KeyEvent.KEYCODE_9: case KeyEvent.KEYCODE_POUND: case KeyEvent.KEYCODE_STAR: + case 94: //case KeyEvent.KEYCODE_FOCUS: // if (!isInputViewShown()){ // Log.d("onKeyUp", "showing window."); @@ -892,10 +883,6 @@ public class TraditionalT9 extends InputMethodService implements break; case KeyEvent.KEYCODE_SOFT_RIGHT: nextKeyMode(); - break; - case KeyEvent.KEYCODE_FOCUS: - // do IME action - break; default: if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) { @@ -1020,7 +1007,8 @@ public class TraditionalT9 extends InputMethodService implements } else if (mKeyMode == MODE_TEXT) { if (mComposing.length() > 0) { mSuggestionStrings.clear(); - char[] ca = CharMap.T9TABLE[mLang][mPrevious]; + + char[] ca = CharMap.T9TABLE[mLang.index][mPrevious]; for (char c : ca) { mSuggestionStrings.add(String.valueOf(c)); } @@ -1050,14 +1038,16 @@ public class TraditionalT9 extends InputMethodService implements } setCandidatesViewShown(false); } + Log.d("handleBS", "Stage1: (" + length + "," + length2 + ")"); + Log.d("handleBS", "Stage1: (" + mComposingI.toString() + ")"); if (length2 > 1) { - if (mComposingI.charAt(length2-1) == '1' ) { + if (mComposingI.charAt(length2 - 1) == '1') { // revert previous word - mPreviousWord = mPreviousWord.substring(0, mPreviousWord.length()-1); + mPreviousWord = mPreviousWord.substring(0, mPreviousWord.length() - 1); } mComposingI.delete(length2 - 1, length2); - if (length2-1 > 1) { - if (mComposingI.charAt(length2-2) != '1') { + if (length2 - 1 > 1) { + if (mComposingI.charAt(length2 - 2) != '1') { if (mComposingI.indexOf("1") == -1) { // no longer contains punctuation so we no longer care mPreviousWord = ""; @@ -1069,6 +1059,7 @@ public class TraditionalT9 extends InputMethodService implements updateCandidates(true); getCurrentInputConnection().setComposingText(mComposing, 1); } else if (length > 0 || length2 > 0) { + Log.d("handleBS", "resetting thing"); mComposing.setLength(0); mComposingI.setLength(0); interfacehandler.midButtonUpdate(false); @@ -1129,7 +1120,6 @@ public class TraditionalT9 extends InputMethodService implements updateCandidates(); getCurrentInputConnection().setComposingText(mComposing, 1); } - break; case MODE_TEXT: @@ -1154,20 +1144,19 @@ public class TraditionalT9 extends InputMethodService implements // start at caps if CapMode // Log.d("handleChar", "Cm: " + mCapsMode); if (mCharIndex == 0 && mCapsMode != CAPS_OFF) { - mCharIndex = CharMap.T9CAPSTART[mLang][keyCode]; + mCharIndex = CharMap.T9CAPSTART[mLang.index][keyCode]; } // private int mPrevious; // private int mCharindex; mComposing.setLength(0); mComposingI.setLength(0); - char[] ca = CharMap.T9TABLE[mLang][keyCode]; + char[] ca = CharMap.T9TABLE[mLang.index][keyCode]; if (mCharIndex >= ca.length) { mCharIndex = 0; } mComposing.append(ca[mCharIndex]); - mComposingI.append(keyCode); getCurrentInputConnection().setComposingText(mComposing, 1); t9releasehandler.postDelayed(mt9release, T9DELAY); @@ -1318,7 +1307,7 @@ public class TraditionalT9 extends InputMethodService implements mLang = mLangsAvailable[mLangIndex]; updateKeyMode(); if (modeNotification != null) { - modeNotify(getResources().getStringArray(R.array.pref_lang_titles)[mLang]); + modeNotify(getResources().getStringArray(R.array.pref_lang_titles)[mLang.index]); } } @@ -1342,7 +1331,7 @@ public class TraditionalT9 extends InputMethodService implements switch (mKeyMode) { case MODE_TEXT: interfacehandler.showHold(false); - icon = LangHelper.ICONMAP[mLang][mKeyMode][mCapsMode]; + icon = LangHelper.ICONMAP[mLang.index][mKeyMode][mCapsMode]; break; case MODE_LANG: if (!db.ready) { @@ -1364,7 +1353,7 @@ public class TraditionalT9 extends InputMethodService implements } //Log.d("T9.updateKeyMode", "lang: " + mLang + " mKeyMode: " + mKeyMode + " mCapsMode" // + mCapsMode); - icon = LangHelper.ICONMAP[mLang][mKeyMode][mCapsMode]; + icon = LangHelper.ICONMAP[mLang.index][mKeyMode][mCapsMode]; break; case MODE_NUM: interfacehandler.showHold(false); diff --git a/src/org/nyanya/android/traditionalt9/TraditionalT9Settings.java b/src/org/nyanya/android/traditionalt9/TraditionalT9Settings.java index 140ddd09..f3a634d1 100644 --- a/src/org/nyanya/android/traditionalt9/TraditionalT9Settings.java +++ b/src/org/nyanya/android/traditionalt9/TraditionalT9Settings.java @@ -21,7 +21,6 @@ import java.io.UnsupportedEncodingException; import java.util.AbstractList; import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -29,11 +28,11 @@ import java.util.Properties; import android.app.Activity; import android.app.AlertDialog; +import android.app.ListActivity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.SharedPreferences; import android.content.res.Resources; import android.database.Cursor; import android.database.DatabaseUtils.InsertHelper; @@ -43,19 +42,23 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.os.SystemClock; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceActivity; -import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; + +import android.view.View; +import android.widget.ListAdapter; +import android.widget.ListView; import android.widget.Toast; import com.stackoverflow.answer.UnicodeBOMInputStream; -import pl.wavesoftware.widget.MultiSelectListPreference; +import org.nyanya.android.traditionalt9.settings.CustomInflater; +import org.nyanya.android.traditionalt9.settings.Setting; +import org.nyanya.android.traditionalt9.settings.SettingAdapter; +import org.nyanya.android.traditionalt9.LangHelper.LANGUAGE; +import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING; -public class TraditionalT9Settings extends PreferenceActivity implements +public class TraditionalT9Settings extends ListActivity implements DialogInterface.OnCancelListener { AsyncTask task = null; @@ -82,7 +85,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements protected Reply() { this.status = true; - this.msgs = new LinkedList(); + this.msgs = new ArrayList(4); } protected void addMsg(String msg) throws LoadException { @@ -117,7 +120,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements } } - private void closeStream(Closeable is, Reply reply) { + private static void closeStream(Closeable is, Reply reply) { if (is == null) { return; } @@ -140,9 +143,9 @@ public class TraditionalT9Settings extends PreferenceActivity implements boolean internal; boolean restore; String[] dicts; - int[] mSupportedLanguages; + LANGUAGE[] mSupportedLanguages; - LoadDictTask(int msgid, boolean intern, boolean restorebackup, int[] supportedLanguages) { + LoadDictTask(int msgid, boolean intern, boolean restorebackup, LANGUAGE[] supportedLanguages) { internal = intern; restore = restorebackup; @@ -150,11 +153,9 @@ public class TraditionalT9Settings extends PreferenceActivity implements dicts = new String[suplanglen]; for (int x=0; x entry : CharMap.CHARTABLE.get(lang).entrySet()) { - wordhelp.prepareForReplace(); - wordhelp.bind(langColumn, Integer.toString(lang)); - wordhelp.bind(seqColumn, Integer.toString(entry.getValue())); - wordhelp.bind(wordColumn, Character.toString(entry.getKey())); - wordhelp.bind(freqColumn, 0); - wordhelp.execute(); - // upper case - wordhelp.prepareForReplace(); - wordhelp.bind(langColumn, Integer.toString(lang)); - wordhelp.bind(seqColumn, Integer.toString(entry.getValue())); - wordhelp.bind(wordColumn, Character.toString(Character.toUpperCase(entry.getKey()))); - wordhelp.bind(freqColumn, 0); - wordhelp.execute(); - } - char[][] chartable = CharMap.T9TABLE[lang]; - for (int numkey=0; numkey entry : CharMap.CHARTABLE.get(lang.index).entrySet()) { wordhelp.prepareForReplace(); - wordhelp.bind(langColumn, Integer.toString(lang)); - wordhelp.bind(seqColumn, Integer.toString(numkey)); - wordhelp.bind(wordColumn, Character.toString(chars[charindex])); + wordhelp.bind(langColumn, lang.id); + wordhelp.bind(seqColumn, Integer.toString(entry.getValue())); + wordhelp.bind(wordColumn, Character.toString(entry.getKey())); + wordhelp.bind(freqColumn, 0); + wordhelp.execute(); + // upper case + wordhelp.prepareForReplace(); + wordhelp.bind(langColumn, lang.id); + wordhelp.bind(seqColumn, Integer.toString(entry.getValue())); + wordhelp.bind(wordColumn, Character.toString(Character.toUpperCase(entry.getKey()))); wordhelp.bind(freqColumn, 0); wordhelp.execute(); } + char[][] chartable = CharMap.T9TABLE[lang.index]; + for (int numkey = 0; numkey < chartable.length; numkey++) { + char[] chars = chartable[numkey]; + for (int charindex = 0; charindex < chars.length; charindex++) { + wordhelp.prepareForReplace(); + wordhelp.bind(langColumn, lang.id); + wordhelp.bind(seqColumn, Integer.toString(numkey)); + wordhelp.bind(wordColumn, Character.toString(chars[charindex])); + wordhelp.bind(freqColumn, 0); + wordhelp.execute(); + } + } + } finally { + wordhelp.close(); } } @@ -368,7 +373,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements return null; } - private Reply processFile(InputStream is, Reply rpl, SQLiteDatabase db, int lang, String fname) + private Reply processFile(InputStream is, Reply rpl, SQLiteDatabase db, LANGUAGE lang, String fname) throws LoadException, IOException { long last = 0; UnicodeBOMInputStream ubis = new UnicodeBOMInputStream(is); @@ -408,21 +413,21 @@ public class TraditionalT9Settings extends PreferenceActivity implements rpl.addMsg("Number error ("+fname+") at line " + linecount+". Using 0 for frequency."); freq = 0; } - if (lang == -1 && ws.length == 3) { + if (lang == LANGUAGE.NONE && ws.length == 3) { try { - lang = Integer.parseInt(ws[2]); + lang = LANGUAGE.get(Integer.parseInt(ws[2])); } catch (NumberFormatException e) { rpl.status = false; - rpl.addMsg("Number error ("+fname+") at line " + linecount+". Using 0 (en) for language."); - lang = 0; + rpl.addMsg("Number error ("+fname+") at line " + linecount+". Using 1 (en) for language."); + lang = LANGUAGE.EN; } - if (lang >= LangHelper.LANGS.length) { + if (lang == null) { rpl.status = false; - rpl.addMsg("Unsupported language ("+fname+") at line " + linecount+". Trying 0 (en) for language."); - lang = 0; + rpl.addMsg("Unsupported language ("+fname+") at line " + linecount+". Trying 1 (en) for language."); + lang = LANGUAGE.EN; } - } else if (lang == -1) { - lang = 0; + } else if (lang == LANGUAGE.NONE) { + lang = LANGUAGE.EN; } } else { freq = 0; @@ -445,13 +450,13 @@ public class TraditionalT9Settings extends PreferenceActivity implements rpl.status = false; rpl.addMsg("Error on word ("+word+") line "+ linecount+" in (" + fname+"): "+ - getResources().getString(R.string.add_word_badchar, LangHelper.LANGS[lang], word)); + getResources().getString(R.string.add_word_badchar, lang.name(), word)); break; } linecount++; wordhelp.prepareForReplace(); wordhelp.bind(seqColumn, seq); - wordhelp.bind(langColumn, lang); + wordhelp.bind(langColumn, lang.id); wordhelp.bind(wordColumn, word); wordhelp.bind(freqColumn, freq); wordhelp.execute(); @@ -597,7 +602,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements cur.close(); } } finally { - + cur.close(); } publishProgress(10000); @@ -606,10 +611,6 @@ public class TraditionalT9Settings extends PreferenceActivity implements Log.d("doInBackground", "entries: " + entries + " last: " + pos); try { bw.flush(); - } catch (IOException e) { - e.printStackTrace(); - } - try { bw.close(); } catch (IOException e) { e.printStackTrace(); @@ -683,86 +684,44 @@ public class TraditionalT9Settings extends PreferenceActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.prefs); - Preference button = getPreferenceManager().findPreference("help"); - if (button != null) { - button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference arg0) { - openHelp(); - return true; - } - }); + // maybe need this? + // http://stackoverflow.com/questions/7645880/listview-with-onitemclicklistener-android + + // get settings + Object[] settings = T9DB.getInstance(this).getSettings(new SETTING[] + // 0, 1, 2 + {SETTING.INPUT_MODE, SETTING.LANG_SUPPORT, SETTING.MODE_NOTIFY}); + ListAdapter settingitems; + try { + settingitems = new SettingAdapter(this, CustomInflater.inflate(this, R.xml.prefs, settings)); + } catch (Exception e) { + e.printStackTrace(); + return; } - - button = getPreferenceManager().findPreference("loaddict"); - if (button != null) { - button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference arg0) { - preloader(R.string.pref_loadingdict, true, false); - return true; - } - }); - } - - button = getPreferenceManager().findPreference("loaduserdict"); - if (button != null) { - button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference arg0) { - preloader(R.string.pref_loadinguserdict, false, false); - return true; - } - }); - } - - button = getPreferenceManager().findPreference("nukedict"); - if (button != null) { - button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference arg0) { - nukeDict(); - return true; - } - }); - } - - button = getPreferenceManager().findPreference("backupdict"); - if (button != null) { - button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference arg0) { - backupDict(); - return true; - } - }); - } - - button = getPreferenceManager().findPreference("restoredict"); - if (button != null) { - button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference arg0) { - restoreDict(); - return true; - } - }); - } - - button = getPreferenceManager().findPreference("querytest"); - if (button != null) { - button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference arg0) { - test(); - return true; - } - }); - } - + setContentView(R.layout.preference_list_content); + setListAdapter(settingitems); mContext = this; + + } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + Setting s = (Setting)getListView().getItemAtPosition(position); + if (s.id.equals("help")) + openHelp(); + else if (s.id.equals("loaddict")) + preloader(R.string.pref_loadingdict, true, false); + else if (s.id.equals("loaduserdict")) + preloader(R.string.pref_loadinguserdict, false, false); + else if (s.id.equals("nukedict")) + nukeDict(); + else if (s.id.equals("backupdict")) + backupDict(); + else if (s.id.equals("restoredict")) + restoreDict(); + else + s.clicked(mContext); } private void openHelp() { @@ -775,7 +734,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements private void preloader(int msgid, boolean internal, boolean restorebackup) { task = new LoadDictTask(msgid, internal, restorebackup, - LangHelper.buildLangs(((ListPreference) findPreference("pref_lang_support")).getValue())); + LangHelper.buildLangs(T9DB.getInstance(mContext).getSettingInt(SETTING.LANG_SUPPORT))); task.execute(); } @@ -787,13 +746,13 @@ public class TraditionalT9Settings extends PreferenceActivity implements private void nukeDict() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(R.string.pref_nuke_warn).setTitle(R.string.pref_nuke_title) - .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { task = new NukeDictTask(R.string.pref_nukingdict); task.execute(); } - }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); @@ -818,12 +777,12 @@ public class TraditionalT9Settings extends PreferenceActivity implements saveloc = new File(saveloc, backupname); if (saveloc.exists()) { builder.setMessage(R.string.pref_backup_warn).setTitle(R.string.pref_backup_title) - .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { predumper(R.string.pref_savingbackup); } - }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); @@ -845,7 +804,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements private void showErrorDialog(AlertDialog.Builder builder, CharSequence title, CharSequence msg) { builder.setMessage(msg).setTitle(title) - .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { + .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); @@ -857,7 +816,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements private void showErrorDialogID(AlertDialog.Builder builder, int titleid, int msgid) { builder.setMessage(msgid).setTitle(titleid) - .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { + .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); @@ -881,12 +840,12 @@ public class TraditionalT9Settings extends PreferenceActivity implements res.getString(R.string.pref_restore_warn, res.getString(R.string.pref_nukedict))) .setTitle(R.string.pref_restore_title) - .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { preloader(R.string.pref_loadingbackup, false, true); } - }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); @@ -913,17 +872,17 @@ public class TraditionalT9Settings extends PreferenceActivity implements T9DB tdb = T9DB.getInstance(this); Log.d("queryTestDebug", "Testing..."); - tdb.updateWords("123", words, ids, 0, LangHelper.EN); + tdb.updateWords("123", words, ids, 0, LangHelper.LANGUAGE.EN); Log.d("queryTestDebug", "123->" + words.toString()); Log.d("queryTestDebug", "269->"); - tdb.updateWords("269", words, ids, 0, LangHelper.EN); + tdb.updateWords("269", words, ids, 0, LangHelper.LANGUAGE.EN); Iterator i = words.iterator(); while (i.hasNext()) { Log.d("queryTestDebug", "word: " + i.next()); } Log.d("queryTestDebug", "228->"); - tdb.updateWords("228", words, ids, 0, LangHelper.EN); + tdb.updateWords("228", words, ids, 0, LangHelper.LANGUAGE.EN); i = words.iterator(); while (i.hasNext()) { Log.d("queryTestDebug", "word: " + i.next()); @@ -961,7 +920,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements T9DB tdb = T9DB.getInstance(this); - tdb.updateWords("222", words, ids, 0, LangHelper.EN); + tdb.updateWords("222", words, ids, 0, LangHelper.LANGUAGE.EN); size = ids.size(); if (size > 0) { tdb.incrementWord(ids.get(0)); @@ -977,7 +936,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements Log.d("TIMING", "Execution time: " + (endnow - startnow) + " ms"); List freqs = new ArrayList(8); - tdb.updateWordsW("222", words, ids, freqs, LangHelper.EN); + //tdb.updateWordsW("222", words, ids, freqs, LangHelper.EN); Log.d("VALUES", "..."); size = freqs.size(); for (int x = 0; x < size; x++) { @@ -986,13 +945,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements } Log.d("queryTestSingle", "done."); } - private void test() { - SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); - if ( "".equalsIgnoreCase(pref.getString("pref_lang_support", null)) ) { - Log.d("T9Settings.test", "AAAAAAAAAA blank string"); - } - Log.d("T9Settings.test", pref.getString("pref_lang_support", "aaaaaaaaaa")); - } + @Override public void onCancel(DialogInterface dint) { task.cancel(false); diff --git a/src/org/nyanya/android/traditionalt9/settings/CustomInflater.java b/src/org/nyanya/android/traditionalt9/settings/CustomInflater.java new file mode 100644 index 00000000..b9a9073a --- /dev/null +++ b/src/org/nyanya/android/traditionalt9/settings/CustomInflater.java @@ -0,0 +1,41 @@ +package org.nyanya.android.traditionalt9.settings; + +// http://stackoverflow.com/a/8488691 + +import android.content.Context; +import android.content.res.XmlResourceParser; +import android.util.AttributeSet; +import android.util.Log; + +import org.nyanya.android.traditionalt9.R; +import org.xmlpull.v1.XmlPullParser; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; + +public class CustomInflater { + public static ArrayList inflate(Context context, int xmlFileResId, Object[] isettings) + throws Exception { + ArrayList settings = new ArrayList(); + + XmlResourceParser parser = context.getResources().getXml(xmlFileResId); + int token; + while ((token = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (token == XmlPullParser.START_TAG) { + if (!parser.getName().equals("Settings")) { + //prepend package + Class aClass = Class.forName("org.nyanya.android.traditionalt9.settings."+parser.getName()); + Class[] params = new Class[]{Context.class, AttributeSet.class, isettings.getClass()}; + Constructor constructor = aClass.getConstructor(params); + try { + settings.add((Setting) constructor.newInstance(context, parser, isettings)); + } catch (InstantiationException e) { + e.printStackTrace(); + } + } + } + } + + return settings; + } +} diff --git a/src/org/nyanya/android/traditionalt9/settings/Setting.java b/src/org/nyanya/android/traditionalt9/settings/Setting.java new file mode 100644 index 00000000..a32a251f --- /dev/null +++ b/src/org/nyanya/android/traditionalt9/settings/Setting.java @@ -0,0 +1,41 @@ +package org.nyanya.android.traditionalt9.settings; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +import org.nyanya.android.traditionalt9.R; + +public class Setting { + String title; + String summary = null; + public String id; + public int widgetID = 0; + public int layout; + protected View view; + + public Setting (Context context, AttributeSet attrs, Object[] isettings) { + // http://stackoverflow.com/a/8488691 + for (int i = 0; i < attrs.getAttributeCount(); i++) { + String attr = attrs.getAttributeName(i); + if ("title".equals(attr)) { + // load string resource + title = context.getString(attrs.getAttributeResourceValue(i, 0)); + } else if ("summary".equals(attr)) { + summary = context.getString(attrs.getAttributeResourceValue(i, 0)); + } else if ("id".equals(attr)){ + id = attrs.getAttributeValue(i); + } + } + if (summary == null) + layout = R.layout.setting; + else + layout = R.layout.setting_sum; + } + + public void clicked(final Context context) {} + + public void setView(View view) { + this.view = view; + } +} diff --git a/src/org/nyanya/android/traditionalt9/settings/SettingAdapter.java b/src/org/nyanya/android/traditionalt9/settings/SettingAdapter.java new file mode 100644 index 00000000..9e59bb56 --- /dev/null +++ b/src/org/nyanya/android/traditionalt9/settings/SettingAdapter.java @@ -0,0 +1,45 @@ +package org.nyanya.android.traditionalt9.settings; + +// https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView + +import android.content.Context; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import org.nyanya.android.traditionalt9.R; + +import java.util.ArrayList; + +public class SettingAdapter extends ArrayAdapter { + public SettingAdapter(Context context, ArrayList settings) { + super(context, 0, settings); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + // Get the data item for this position + Setting setting = getItem(position); + final LayoutInflater layoutInflater = LayoutInflater.from(getContext()); + // Check if an existing view is being reused, otherwise inflate the view + if (convertView == null) { + convertView = layoutInflater.inflate(setting.layout, parent, false); + } + setting.setView(convertView); + // Lookup view for data population + ((TextView) convertView.findViewById(R.id.title)).setText(setting.title); + if (setting.summary != null) + ((TextView) convertView.findViewById(R.id.summary)).setText(setting.summary); + + if (setting.widgetID != 0) { + final ViewGroup widgetFrame = (ViewGroup) convertView.findViewById(R.id.widget_frame); + layoutInflater.inflate(setting.widgetID, widgetFrame); + } + + // Return the completed view to render on screen + return convertView; + } +} diff --git a/src/org/nyanya/android/traditionalt9/settings/SettingCheck.java b/src/org/nyanya/android/traditionalt9/settings/SettingCheck.java new file mode 100644 index 00000000..e0ab06c0 --- /dev/null +++ b/src/org/nyanya/android/traditionalt9/settings/SettingCheck.java @@ -0,0 +1,37 @@ +package org.nyanya.android.traditionalt9.settings; + + +import android.content.Context; +import android.util.AttributeSet; + +import org.nyanya.android.traditionalt9.R; + +public class SettingCheck extends Setting { + boolean value; + boolean defaultValue; + + public SettingCheck (Context context, AttributeSet attrs, Object[] isettings) { + super(context, attrs, isettings); + // http://stackoverflow.com/a/8488691 + for (int i = 0; i < attrs.getAttributeCount(); i++) { + String attr = attrs.getAttributeName(i); + if ("defaultValue".equals(attr)) { + defaultValue = attrs.getAttributeBooleanValue(i, false); + } + } + if (id.equals("pref_mode_notify")){ + if (isettings[2] != null) + value = isettings[2].equals(1); + else + value = defaultValue; + } + widgetID = R.layout.checkbox; + } + + @Override + public void clicked(Context context) { + + } + + +} diff --git a/src/org/nyanya/android/traditionalt9/settings/SettingList.java b/src/org/nyanya/android/traditionalt9/settings/SettingList.java new file mode 100644 index 00000000..853169c7 --- /dev/null +++ b/src/org/nyanya/android/traditionalt9/settings/SettingList.java @@ -0,0 +1,66 @@ +package org.nyanya.android.traditionalt9.settings; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.util.AttributeSet; + +import org.nyanya.android.traditionalt9.R; +import org.nyanya.android.traditionalt9.T9DB; +import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING; + +public class SettingList extends Setting { + String[] entries; + int[] entryValues; + int defaultValue; + int value; + + public SettingList (Context context, AttributeSet attrs, Object[] isettings) { + super(context, attrs, isettings); + // http://stackoverflow.com/a/8488691 + for (int i = 0; i < attrs.getAttributeCount(); i++) { + String attr = attrs.getAttributeName(i); + if ("defaultValue".equals(attr)) { + defaultValue = attrs.getAttributeIntValue(i, -1); + } else if ("entryValues".equals(attr)) { + // load string resource + entryValues = context.getResources().getIntArray(attrs.getAttributeResourceValue(i, 0)); + } else if ("entries".equals(attr)) { + entries = context.getResources().getStringArray(attrs.getAttributeResourceValue(i, 0)); + } + } + + if (id.equals("pref_inputmode")){ + if (isettings[0] != null) + value = (Integer)isettings[0]; + else + value = defaultValue; + } + widgetID = R.layout.preference_dialog; + layout = R.layout.setting_widget; + } + + public void clicked(final Context context) { + AlertDialog.Builder builderSingle = new AlertDialog.Builder(context); + builderSingle.setTitle(title); + + builderSingle.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builderSingle.setSingleChoiceItems(entries, value, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + T9DB.getInstance(context).storeSettingInt(SETTING.get(id), entryValues[which]); + value = entryValues[which]; + dialog.dismiss(); + } + }); + builderSingle.show(); + } +} diff --git a/src/org/nyanya/android/traditionalt9/settings/SettingMultiList.java b/src/org/nyanya/android/traditionalt9/settings/SettingMultiList.java new file mode 100644 index 00000000..f0b1f85f --- /dev/null +++ b/src/org/nyanya/android/traditionalt9/settings/SettingMultiList.java @@ -0,0 +1,87 @@ +package org.nyanya.android.traditionalt9.settings; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.util.AttributeSet; +import android.util.Log; +import android.widget.TextView; + +import org.nyanya.android.traditionalt9.LangHelper; +import org.nyanya.android.traditionalt9.R; +import org.nyanya.android.traditionalt9.T9DB; +import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING; + +public class SettingMultiList extends SettingList { + boolean[] selectedEntries = new boolean[0]; + + public SettingMultiList (Context context, AttributeSet attrs, Object[] isettings) { + super(context, attrs, isettings); + selectedEntries = new boolean[entries.length]; + Log.d("Multi", "len:" + entries.length + " setting:" + isettings[1]); + for (LangHelper.LANGUAGE l : LangHelper.buildLangs((Integer)isettings[1])) { + Log.d("Multi", "index:" + l.index); + selectedEntries[l.index] = true; + } + summary = buildItems(); + } + + public void clicked(final Context context) { + AlertDialog.Builder builderMulti = new AlertDialog.Builder(context); + builderMulti.setTitle(title); + + builderMulti.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builderMulti.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + T9DB.getInstance(context).storeSettingInt(SETTING.get(id), LangHelper.shrinkLangs(buildSelection())); + summary = buildItems(); + dialog.dismiss(); + ((TextView)view.findViewById(R.id.summary)).setText(summary); + } + }); + builderMulti.setMultiChoiceItems(entries, selectedEntries, + new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialog, int which, boolean opt) { + selectedEntries[which] = opt; + } + }); + builderMulti.show(); + } + + private int[] buildSelection(){ + int count = 0; + for (boolean b: selectedEntries) {if (b) count++;} + int[] selection = new int[count]; + count = 0; + for (int x=0;x 1) + sb.setLength(sb.length()-2); + return sb.toString(); + } +} diff --git a/src/pl/wavesoftware/widget/MultiSelectListPreference.java b/src/pl/wavesoftware/widget/MultiSelectListPreference.java index f5f2b216..955ff07c 100644 --- a/src/pl/wavesoftware/widget/MultiSelectListPreference.java +++ b/src/pl/wavesoftware/widget/MultiSelectListPreference.java @@ -12,13 +12,14 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnMultiChoiceClickListener; import android.content.res.TypedArray; import android.preference.ListPreference; +import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; public class MultiSelectListPreference extends ListPreference { private String separator; - private static final String DEFAULT_SEPARATOR = "\u0001\u0007\u001D\u0007\u0001"; + private static final String DEFAULT_SEPARATOR = "|"; private boolean[] entryChecked; public MultiSelectListPreference(Context context, AttributeSet attributeSet) { @@ -55,7 +56,7 @@ public class MultiSelectListPreference extends ListPreference { if (val == null || "".equals(val)) { return new CharSequence[0]; } else { - return ((String) val).split(separator); + return ((String) val).split("\\"+separator); } } @@ -65,7 +66,7 @@ public class MultiSelectListPreference extends ListPreference { //Log.w("MultiSelectPref.defaultunpack", "val is null or empty"); return new int[] {0}; //default pref } else { - String[] sa = ((String) val).split(DEFAULT_SEPARATOR); + String[] sa = ((String) val).split("\\"+DEFAULT_SEPARATOR); if (sa.length < 1) { Log.w("MultiSelectPref.defaultunpack", "split is less than 1"); return new int[] {0}; //default pref @@ -115,7 +116,7 @@ public class MultiSelectListPreference extends ListPreference { } } - String value = join(values, separator); + String value = TextUtils.join(separator, values); setSummary(prepareSummary(values)); setValueAndEvent(value); } @@ -143,7 +144,7 @@ public class MultiSelectListPreference extends ListPreference { } ix += 1; } - return join(titles, ", "); + return TextUtils.join(", ", titles); } @Override @@ -157,12 +158,11 @@ public class MultiSelectListPreference extends ListPreference { String value = null; CharSequence[] defaultValue; if (rawDefaultValue == null) { - defaultValue = new CharSequence[0]; + defaultValue = new CharSequence[] {"0"}; } else { defaultValue = (CharSequence[]) rawDefaultValue; } - List joined = Arrays.asList(defaultValue); - String joinedDefaultValue = join(joined, separator); + String joinedDefaultValue = TextUtils.join(separator, defaultValue); if (restoreValue) { value = getPersistedString(joinedDefaultValue); } else { @@ -173,26 +173,4 @@ public class MultiSelectListPreference extends ListPreference { setValueAndEvent(value); } - /** - * Joins array of object to single string by separator - * - * Credits to kurellajunior on this post - * http://snippets.dzone.com/posts/show/91 - * - * @param iterable - * any kind of iterable ex.: ["a", "b", "c"] - * @param separator - * separetes entries ex.: "," - * @return joined string ex.: "a,b,c" - */ - protected static String join(Iterable iterable, String separator) { - Iterator oIter; - if (iterable == null || (!(oIter = iterable.iterator()).hasNext())) - return ""; - StringBuilder oBuilder = new StringBuilder(String.valueOf(oIter.next())); - while (oIter.hasNext()) - oBuilder.append(separator).append(oIter.next()); - return oBuilder.toString(); - } - }