From 807b8ffa9fb7c82ca48db93eb971fa54e0b699b1 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Wed, 30 Jun 2010 22:52:27 -0700 Subject: [PATCH] Minor appearance tweaks - updated tab icons, made the date utilities better --- .../todoroo/andlib/utility/DateUtilities.java | 74 +++++++++++++----- astrid/res/drawable/tea_tab_basic.png | Bin 2679 -> 2659 bytes astrid/res/drawable/tea_tab_extensions.png | Bin 3362 -> 3452 bytes astrid/res/drawable/tea_tab_extra.png | Bin 4537 -> 4486 bytes astrid/res/layout/task_edit_activity.xml | 31 +++++++- astrid/res/values/strings-3.0.xml | 10 ++- .../astrid/activity/TaskEditActivity.java | 23 +++++- .../service/AstridDependencyInjector.java | 1 + .../astrid/service/StartupService.java | 14 ++-- .../todoroo/astrid/utility/Preferences.java | 40 +++++----- 10 files changed, 142 insertions(+), 51 deletions(-) diff --git a/astrid/common-src/com/todoroo/andlib/utility/DateUtilities.java b/astrid/common-src/com/todoroo/andlib/utility/DateUtilities.java index f52240bb8..c257bf23e 100644 --- a/astrid/common-src/com/todoroo/andlib/utility/DateUtilities.java +++ b/astrid/common-src/com/todoroo/andlib/utility/DateUtilities.java @@ -25,6 +25,9 @@ public class DateUtilities { @Autowired public Integer monthsResource; + @Autowired + public Integer weeksResource; + @Autowired public Integer daysResource; @@ -77,10 +80,10 @@ public class DateUtilities { } /** Represents a single day */ - public static long ONE_DAY = 3600000L; + public static long ONE_DAY = 24 * 3600000L; /** Represents a single week */ - public static long ONE_WEEK = 7 * 3600000L; + public static long ONE_WEEK = 7 * ONE_DAY; /* ====================================================================== * =========================================================== formatters @@ -193,35 +196,67 @@ public class DateUtilities { */ public String getDurationString(long duration, int unitsToShow, boolean withPreposition) { Resources r = ContextManager.getContext().getResources(); - int years, months, days, hours, minutes, seconds; short unitsDisplayed = 0; duration = Math.abs(duration); if(duration == 0) return r.getQuantityString(secondsResource, 0, 0); - Date now = new Date(); - Date then = new Date(DateUtilities.now() + duration); + Date now = new Date(80, 1, 1); + Date then = new Date(now.getTime() + duration); + + int[] values = new int[] { + then.getYear() - now.getYear(), + then.getMonth() - now.getMonth(), + (then.getDate() - now.getDate())/7, + (then.getDate() - now.getDate()) - (then.getDate() - now.getDate())/7*7, + then.getHours() - now.getHours(), + then.getMinutes() - now.getMinutes(), + then.getSeconds() - now.getSeconds(), + }; + int[] maxValues = new int[] { + Integer.MAX_VALUE, + 12, + 5, + 7, + 24, + 60, + 60 + }; + + // perform rounding (this is definitely magic... trust the unit tests) + int cursor = 0; + while(values[cursor] == 0 && ++cursor < values.length) + ; + int postCursor = cursor + unitsToShow; + for(int i = values.length - 1; i >= postCursor; i--) { + if(values[i] >= maxValues[i]/2) { + values[i-1]++; + } + } + for(int i = Math.min(values.length, postCursor) - 1; i >= 1; i--) { + if(values[i] == maxValues[i]) { + values[i-1]++; + for(int j = i; j < values.length; j++) + values[j] = 0; + } + } - years = then.getYear() - now.getYear(); - months = then.getMonth() - now.getMonth(); - days = then.getDate() - now.getDate(); - hours = then.getHours() - now.getHours(); - minutes = then.getMinutes() - now.getMinutes(); - seconds = then.getSeconds() - now.getSeconds(); StringBuilder result = new StringBuilder(); - unitsDisplayed = displayUnits(r, yearsResource, unitsToShow, years, months >= 6, + unitsDisplayed = displayUnits(r, yearsResource, unitsToShow, values[0], + unitsDisplayed, result); + unitsDisplayed = displayUnits(r, monthsResource, unitsToShow, values[1], unitsDisplayed, result); - unitsDisplayed = displayUnits(r, monthsResource, unitsToShow, months, days >= 15, + unitsDisplayed = displayUnits(r, weeksResource, unitsToShow, values[2], unitsDisplayed, result); - unitsDisplayed = displayUnits(r, daysResource, unitsToShow, days, hours >= 12, + unitsDisplayed = displayUnits(r, daysResource, unitsToShow, values[3], unitsDisplayed, result); - unitsDisplayed = displayUnits(r, hoursResource, unitsToShow, hours, minutes >= 30, + unitsDisplayed = displayUnits(r, hoursResource, unitsToShow, values[4], unitsDisplayed, result); - unitsDisplayed = displayUnits(r, minutesResource, unitsToShow, minutes, seconds >= 30, + unitsDisplayed = displayUnits(r, minutesResource, unitsToShow, values[5], unitsDisplayed, result); - unitsDisplayed = displayUnits(r, secondsResource, unitsToShow, seconds, false, + unitsDisplayed = displayUnits(r, secondsResource, unitsToShow, values[6], unitsDisplayed, result); return result.toString().trim(); @@ -229,11 +264,8 @@ public class DateUtilities { /** Display units, rounding up if necessary. Returns units to show */ private short displayUnits(Resources r, int resource, int unitsToShow, int value, - boolean shouldRound, short unitsDisplayed, StringBuilder result) { + short unitsDisplayed, StringBuilder result) { if(unitsDisplayed < unitsToShow && value > 0) { - // round up if needed - if(unitsDisplayed + 1 == unitsToShow && shouldRound) - value++; result.append(r.getQuantityString(resource, value, value)). append(' '); unitsDisplayed++; diff --git a/astrid/res/drawable/tea_tab_basic.png b/astrid/res/drawable/tea_tab_basic.png index ecd19d70b2c9038b0f5b3de1910632ad5b312fee..91cc4b0d17e2465a1bc94dd0b28bf42db3ec0a7d 100644 GIT binary patch delta 2603 zcmV+`3e@%Y6yp?-7Ya}a1^@s6x@a@8ks&~T1UEV)@BhXC014wsL_t(|+U?tIY+KbG z$MNsE_uBW`j`RHBhqz7K#0@EJ(EW|E5GD9yAQ2#}{gNtLaC7e-9V}#(G$$_IL3C$OOdF0ope+FCuMuiZm+ZyOboalw)+grm5?#d>F z>H?vFG?8W;dG#nCeld)zr1ph-e|q#qJ4s`?LQ)oDa<1VxyjFUI28t7*c@TvwSzE6# zeEH;)9eWx#0mXn}zs~IibTgc_^=UX$hNmDj7g|{>Ep-af3&*$HNJY6qQWjKya+WK& zD;p7-$NnkvCKm`*$6eV(OPxaB`QzI=_B6KT3P~&!oR+Xcp|264daOC;mM>x=Q^Q>C z{hao0lgi*7+nOK${54>3Hs>T|zHu&|%K`^LCM<_qW3-F9;76pH<; zKr29GF&v46WQ>6ehiN}yCF!nzO|zFIF<&^nXRSG>*moyr1(_%3Yub%ujDg-Ge9~p& z3(X#qm}{JmUz@}!^*4YzL!5M^RE*0Pj$K2#yKUx3;7iL zZQ>8rZ(F#-Mq>?Fl+l_Dh>tnEVV_#w^8G8bjdNh9)mBZl3c+A#66dBH&$+q)#h}u+h?O;h3rF_-5^!en z{V3L};$bzodMz){R_T%1Jef9IBdSsy{K1jU#;AjPnfBkN}kCmSFYa9q7~ z>>k5mePhrJb=ZrpI4}%cv5*=fLazYT$bD<6212i(UpCAtPPPehjtvhq>rMgY7;!E1 zDUh&Nr73%0*CXXJNlNZ;rUjHX|2Pdb7B2PxsSy-^Z~YfQGHpPUNDu7V(r-3Igi)27 zB&i0%sG{F&hy)(kHS0LjO^^a;U%cD4+My)9y35OWLJTe6@S8(6kOY{5w0^gRq*u*u zk`x1>+c@iY=L9DkAjinXgZH|1KxkY}_&V(NN~RC$W=K(U#q1&3I8k#&PI0mV8jcMu z*A&2i94D?+blb-UQ+CBSA_X_>*%Fm2X5MagTSeuHNN~fRoZ@5*ls^BAjtn-tbOGi# zrsvL&>;&C(<2M!Q^_e9pEjhsrujd?RItdbh+WG#rC0^%Pz*ho^M1ngWe))hs|9tJv zcnZ>kZ(N_GOmWha^WYnEf-@Z;YyLU^{wl+N3BuuJFi}1+|J-tbQ<2`>5|t|>!tjIU z&S1yrMi_pga%Cj=;G1)XGi{(tedk*>72=~q42-$E?C%S^1(_z&FRr!Q|C^KM5obC; zD&R=P2V2}a^bNq_uD+I@V{iKa7vRVW>7l(_qsb-vg|iG4CsNAmF0=w`&Y35ijDXUA zH>eI`VXsS2-~yQ%3BU8ZAOGR(p}mWNf=rO?#})fBfw*Vowr8)7d%IEHm?qaQp?MI_ zih0G!G(ifWefFpCtW#AB$F0L%bpnmi@LzU5vG>e>{#XNe0Br(EN-3n2ij-25QaYuS zF8gN+u|7vw1Qc98wZHg$G_|k4{|csm1XF_Qa3S;xF3DAq;6r=o4JXqBGZk<|d%Eu_ zaDZZGq^wY|ZiT{uqod(Jzxwli-~WmH;o>!qodU+Bb@r;-ude|P`*ME#`?c#%pXG^czh)6(#8WNUcrh*fy#FVFP14i676kB`Ng6#<%R zr7%<>SW+ce;u8p02%%RXG!N17(7W~ud0;+qZkeF;1)@{L!X86lrmc81#Y$3Bt-`_1 z=%cSZ8K9!XbK+d@K-1{xXjsU9@qngUsq>c#Ldz6_WdeVx03%?5s2;Aeq$43px{_M? zaYxbe4+8by?E+%V(Z4*+q{XZQvbP^w?NE~50@u_j%c;TQNNT5hoIAd8>6r0t-oA@Dus*J4q^*E&i*(G^I%r~hpr*CmZIO N002ovPDHLkV1h?;1D5~* delta 2623 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 delta 3311 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 D0qkKv delta 4464 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 + + +