From c2918d17220cdb0c919d4be2566a987938d0cd74 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 6 Jan 2016 10:28:58 -0600 Subject: [PATCH] Material icons for timer --- .../astrid/activity/TaskEditFragment.java | 4 +-- .../astrid/activity/TaskListFragment.java | 4 +-- .../astrid/timers/TimerActionControlSet.java | 18 ++++++------ .../todoroo/astrid/timers/TimerPlugin.java | 26 +++++++++++++----- .../timers/TimerTaskCompleteListener.java | 2 +- .../res/drawable-hdpi/ic_timer_white_24dp.png | Bin 0 -> 499 bytes .../drawable-xhdpi/ic_timer_white_24dp.png | Bin 0 -> 628 bytes .../drawable-xxhdpi/ic_timer_white_24dp.png | Bin 0 -> 901 bytes src/main/res/drawable/ic_pause_24dp.xml | 5 ++++ src/main/res/drawable/ic_play_arrow_24dp.xml | 5 ++++ src/main/res/drawable/ic_timer_white_24dp.png | Bin 0 -> 329 bytes src/main/res/drawable/icn_edit_timer.png | Bin 2278 -> 0 bytes src/main/res/drawable/icn_timer_stop.png | Bin 2123 -> 0 bytes src/main/res/drawable/timers_notification.png | Bin 1499 -> 0 bytes src/main/res/layout/task_edit_activity.xml | 3 +- 15 files changed, 43 insertions(+), 24 deletions(-) create mode 100644 src/main/res/drawable-hdpi/ic_timer_white_24dp.png create mode 100644 src/main/res/drawable-xhdpi/ic_timer_white_24dp.png create mode 100644 src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png create mode 100644 src/main/res/drawable/ic_pause_24dp.xml create mode 100644 src/main/res/drawable/ic_play_arrow_24dp.xml create mode 100644 src/main/res/drawable/ic_timer_white_24dp.png delete mode 100644 src/main/res/drawable/icn_edit_timer.png delete mode 100644 src/main/res/drawable/icn_timer_stop.png delete mode 100644 src/main/res/drawable/timers_notification.png diff --git a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java index cce2ea880..f3e766400 100755 --- a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -680,7 +680,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { // abandon editing in this case if (title.getText().toString().trim().length() == 0 || TextUtils.isEmpty(model.getTitle())) { if (isNewTask) { - TimerPlugin.updateTimer(notificationManager, taskService, getActivity(), model, false); + TimerPlugin.stopTimer(notificationManager, taskService, getActivity(), model); taskDeleter.delete(model); if (getActivity() instanceof TaskListActivity) { TaskListActivity tla = (TaskListActivity) getActivity(); @@ -698,7 +698,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - TimerPlugin.updateTimer(notificationManager, taskService, getActivity(), model, false); + TimerPlugin.stopTimer(notificationManager, taskService, getActivity(), model); taskDeleter.delete(model); shouldSaveState = false; diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index f08b561ac..375af39de 100644 --- a/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -795,7 +795,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr } } } - TimerPlugin.updateTimer(notificationManager, taskService, context, task, false); + TimerPlugin.stopTimer(notificationManager, taskService, context, task); } public void refreshFilterCount() { @@ -853,7 +853,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr itemId = item.getGroupId(); Task task = new Task(); task.setId(itemId); - TimerPlugin.updateTimer(notificationManager, taskService, getActivity(), task, false); + TimerPlugin.stopTimer(notificationManager, taskService, getActivity(), task); taskDeleter.purge(itemId); loadTaskListContent(); return true; diff --git a/src/main/java/com/todoroo/astrid/timers/TimerActionControlSet.java b/src/main/java/com/todoroo/astrid/timers/TimerActionControlSet.java index 0883e0074..e174ab534 100644 --- a/src/main/java/com/todoroo/astrid/timers/TimerActionControlSet.java +++ b/src/main/java/com/todoroo/astrid/timers/TimerActionControlSet.java @@ -6,7 +6,9 @@ package com.todoroo.astrid.timers; import android.app.Activity; +import android.graphics.drawable.Drawable; import android.os.SystemClock; +import android.support.v4.graphics.drawable.DrawableCompat; import android.text.format.DateFormat; import android.view.View; import android.view.View.OnClickListener; @@ -42,14 +44,14 @@ public class TimerActionControlSet extends TaskEditControlSetBase { @Override public void onClick(View v) { if (timerActive) { - TimerPlugin.updateTimer(notificationManager, taskService, activity, model, false); + TimerPlugin.stopTimer(notificationManager, taskService, activity, model); for (TimerActionListener listener : listeners) { listener.timerStopped(model); } chronometer.stop(); } else { - TimerPlugin.updateTimer(notificationManager, taskService, activity, model, true); + TimerPlugin.startTimer(notificationManager, taskService, activity, model); for (TimerActionListener listener : listeners) { listener.timerStarted(model); } @@ -81,14 +83,10 @@ public class TimerActionControlSet extends TaskEditControlSetBase { } private void updateDisplay() { - final int drawable; - if(timerActive) { - drawable = R.drawable.icn_timer_stop; - } else { - drawable = R.drawable.icn_edit_timer; - } - timerButton.setImageResource(drawable); - + int drawableRes = timerActive ? R.drawable.ic_pause_24dp : R.drawable.ic_play_arrow_24dp; + final Drawable drawable = DrawableCompat.wrap(activity.getResources().getDrawable(drawableRes)); + DrawableCompat.setTint(drawable, activity.getResources().getColor(android.R.color.white)); + timerButton.setImageDrawable(drawable); long elapsed = model.getElapsedSeconds() * 1000L; if (timerActive) { diff --git a/src/main/java/com/todoroo/astrid/timers/TimerPlugin.java b/src/main/java/com/todoroo/astrid/timers/TimerPlugin.java index 8dda9bdad..c5df3935d 100644 --- a/src/main/java/com/todoroo/astrid/timers/TimerPlugin.java +++ b/src/main/java/com/todoroo/astrid/timers/TimerPlugin.java @@ -27,16 +27,19 @@ import static org.tasks.time.DateTimeUtils.currentTimeMillis; public class TimerPlugin { + public static void startTimer(NotificationManager notificationManager, TaskService taskService, Context context, Task task) { + updateTimer(notificationManager, taskService, context, task, true); + } + + public static void stopTimer(NotificationManager notificationManager, TaskService taskService, Context context, Task task) { + updateTimer(notificationManager, taskService, context, task, false); + } + /** * toggles timer and updates elapsed time. * @param start if true, start timer. else, stop it */ - public static void updateTimer(NotificationManager notificationManager, TaskService taskService, Context context, Task task, boolean start) { - // if this call comes from tasklist, then we need to fill in the gaps to handle this correctly - // this is needed just for stopping a task - if (!task.containsNonNullValue(Task.TIMER_START)) { - task = taskService.fetchById(task.getId(), Task.ID, Task.TIMER_START, Task.ELAPSED_SECONDS); - } + private static void updateTimer(NotificationManager notificationManager, TaskService taskService, Context context, Task task, boolean start) { if (task == null) { return; } @@ -46,6 +49,15 @@ public class TimerPlugin { task.setTimerStart(DateUtilities.now()); } } else { + // if this call comes from tasklist, then we need to fill in the gaps to handle this correctly + // this is needed just for stopping a task + if (!task.containsNonNullValue(Task.TIMER_START)) { + task = taskService.fetchById(task.getId(), Task.ID, Task.TIMER_START, Task.ELAPSED_SECONDS); + } + if (task == null) { + return; + } + if(task.getTimerStart() > 0) { int newElapsed = (int)((DateUtilities.now() - task.getTimerStart()) / 1000L); task.setTimerStart(0L); @@ -80,7 +92,7 @@ public class TimerPlugin { .setContentTitle(appName) .setContentText(text) .setWhen(currentTimeMillis()) - .setSmallIcon(R.drawable.timers_notification) + .setSmallIcon(R.drawable.ic_timer_white_24dp) .setAutoCancel(false) .setOngoing(true) .build(); diff --git a/src/main/java/com/todoroo/astrid/timers/TimerTaskCompleteListener.java b/src/main/java/com/todoroo/astrid/timers/TimerTaskCompleteListener.java index 6e1fbc0df..58760ff42 100644 --- a/src/main/java/com/todoroo/astrid/timers/TimerTaskCompleteListener.java +++ b/src/main/java/com/todoroo/astrid/timers/TimerTaskCompleteListener.java @@ -37,6 +37,6 @@ public class TimerTaskCompleteListener extends InjectingBroadcastReceiver { return; } - TimerPlugin.updateTimer(notificationManager, taskService, context, task, false); + TimerPlugin.stopTimer(notificationManager, taskService, context, task); } } diff --git a/src/main/res/drawable-hdpi/ic_timer_white_24dp.png b/src/main/res/drawable-hdpi/ic_timer_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..10619fc8c5cc1a4962e6522df627f9f72066d55b GIT binary patch literal 499 zcmVx?odRltO%I27zO z3##sF&LErI^AmiqqgIO?Fa@Z1s9TE$jau}09gYO;M!|3KwTTajWr{}EgiG20|5T^x{wc4odRfjR*>BZ zEdb03F~HXVzEc%)TC)paH3oP^dc1**Pe%Ax2U3C;@_>GAKvPwS0)m0Co)s5iR>3z--J<|0`0W7V-A!@xBmZfXAHxXqm{FeH*}$ zN*oXj`VBzGhVhJxxhVnA^rR30q{J}*68n}-tE;G}o3Ww+0Del3&j->$eJM7ds}$Q0 zUeuD8bF+#sAWGhL;PxaM-q3d!E7YhDee1-9D}VXJu`TZ#e%Lba2k;M1c7|f0@VMIm O0000H}E!95p8+ywss z9jI^1Ok`BqvZ^m5bY^o?VQccx*4iXczJj2?lX$7;o_ksX=JR_DfiLal=HByD{}UtF zP%fizo8b={1&xCI&nRfvf;3YUxk8l(wCSyobS2@qi?AyyA%`vXgVkfIy5!Z{$59q@f@Q*eDLGMtF4J$5LWG;%7)7=i^o8U^4Vt0fJzhjboE#1M zy@hfMnqULdEmA0lIlvO8bzX1_stx2kYw>KPLT8+BG2L(pI*aKZDU@@N;s6ay(@}#0 zenV`^wc{A1ILsE}A<1Y#3z!P1*g=Z-FwI2?(lilu_IU{!<9kE{Z69Z3^+Ae4c(P6*WpcGxi5xbxwqJr`oq^Keac0pGV z7rh6S5M{fdD&my)pgiImyPyY%N$){f#6!EFHX`jkD1+Fr3+f?~-h%?f_OJzYhwWds zI&2qp(=O<1#A%f0$s;OuK_4M5c@HWf7VU!0BW`*Rsv!#QKd!zeO%IW?3(~X@vtEPd z5l_%A4`_G12Hi!JT_0gjc*}Vm(^1!l{AI?xc? zqJwxuGTy6ngLJH%3@ezgFi6n6Z7ul^H{jf9H||CLg%>)Avp;j z+aS${gy~YHM4l`e0s=B*$y1_6k1+51Tu+^0ojBHb!}q>yf-0^m9NL`)-rElAsmDz3 z=0-7Ko}aLFpLa;^#ftM4KISPqc|w_^=)GM6ALd;asnDcFmoBR`sjx_a9C}#S + + diff --git a/src/main/res/drawable/ic_play_arrow_24dp.xml b/src/main/res/drawable/ic_play_arrow_24dp.xml new file mode 100644 index 000000000..3100224e2 --- /dev/null +++ b/src/main/res/drawable/ic_play_arrow_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/src/main/res/drawable/ic_timer_white_24dp.png b/src/main/res/drawable/ic_timer_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..72e1320c468757b4836322414c31b987c3b1fb54 GIT binary patch literal 329 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 B{doWY diff --git a/src/main/res/drawable/timers_notification.png b/src/main/res/drawable/timers_notification.png deleted file mode 100644 index 6484e6e7d0fc57cf663af80fc45667f5018acd16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1499 zcmV<11tj{3P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igY| z1p_o5c`$cfiEkZjy(#elRec`Oo)%=RfEF=br&~v5Q^&2hiKwD|L5w=WS=#-QBHc>w{!E z;o7xpxovH2aR4}Q;6Ndzv=Kl7fT}f<2>^?#st!y}PA;s?k=okY#5)nz)6?S$27?Iz zsI07P6+(Qa>-vW-mkXw8LRD1&0HqX`Wg(GBAel_|OOo`{^z`&^YaApP4BBr^SVu>P z`{Kom%ZCpiu4Rl}%FWHKE-WlWZf>q4=v7ck5s$|)KR=InJpPBOs$Y+ej*fJ6bSSA* zN?g8tS-g?3_V)Jou3WkDqPn{J8%@)Cd_JF+pPvs!QFat*#u#F;7#0>5QmItx)X2!l z&+YB)ZnxX5tEw6eg+d!fP~MF2+_`h4va-_X?d?q*J9g|_!!UmE`~7lWULFV`ux)!s z7a;_OVIU_bN2Zj1vUl&^)jN0Y{C?!f5zn4IdkQ0wNGz*})zs8{B+GK2*Xxx{(_Htg zs;UZ&jg2^T=n!=MWdbIXNsNz=V{mW~6B85b>@CYeG#cfc^H1;HyZ39>TUlFMTL9oM zx7%Id@pznZUDwgt+KPsT24`$=a1e<^0)arlId{Xu!?=F^I+DqxWB2^|b1W|}F9ImP zd-v|*X1=9u0(MqWlmf#rz!(E#3|_Anp-^a@C;$kD!?l? z>@(Z8K`8~L6r6K3H#cYf8f$KD2It)2vuztfh?b0n*|uGsu0xD5l$DijxP?1~&*wu~ zS((GPR!)v?X0L1!u@cTXZ2M*XD=seH((%g53IO2v@#C-7Lo_xvIvk^;qt2NWLX>1I zjB_qak_66qI)ZQ9m86db0IYG#*$7K%nx>^vDF8q;8r{?xWGD zBWx|(Ut}zdG4{74NmXg0v9Yl&g_V?)Y#Xt$v9Wc+IOlWO9R87Xmq01S%*+g?rlzvq z#;K_(%*@Oj#6 z9%q$9LqoWA>sH31`uh4XG&JP!n5GHNIoEZ4XtOz+X2tC6EGsT9p7(e>A1^H}fl>+~ z1crx)QC?n-ii(OIiR$m~M=%%!V+`pXC@LxfW9-KL`}ePAEDQh+9y~ZMglIJkBmdd6 zXHMn5efu_Iu^5gXJ?gYOuVQIw3FptBM^{&uvnU}1{C+KL^7*4jj~27;V4Iqn zT(T_pJ%0SSX?AvY-80iPQD0w=`uck8+qVw@@Z`x8L?RJHA`w`Ywa(t_^`gAI{3&DX z^uWMC-y8S*`}gmcG)?<*Zf@>-0RC(f!0-2eF+DwfnJ&Xx7%H$>$+Q#B&@EkuIuv^MS)=$P*oMSZAU1jH7hGCv3L5x zo5snLC)J9Iib_q>E-f!F*ISkaAp~457u;?)2q9M=K79Dyg9i^5CMPFFru